summaryrefslogtreecommitdiff
path: root/src/gallium/winsys/r600/drm/radeon_ws_bo.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2010-09-17 13:18:42 +1000
committerDave Airlie <airlied@redhat.com>2010-09-17 15:29:31 +1000
commitda96313afe3cff66d8ae0c9675a6299b3d7510f9 (patch)
tree439d3e7a85e600f5d5b0ea2645007ee82ab26837 /src/gallium/winsys/r600/drm/radeon_ws_bo.c
parent189a59751352208cb0386131f9ad82256ec9bed9 (diff)
r600g: add support for kernel bo
this moves to using a pb bufmgr instead of kernel bos directly.
Diffstat (limited to 'src/gallium/winsys/r600/drm/radeon_ws_bo.c')
-rw-r--r--src/gallium/winsys/r600/drm/radeon_ws_bo.c74
1 files changed, 45 insertions, 29 deletions
diff --git a/src/gallium/winsys/r600/drm/radeon_ws_bo.c b/src/gallium/winsys/r600/drm/radeon_ws_bo.c
index 09e379f837..c63e926dab 100644
--- a/src/gallium/winsys/r600/drm/radeon_ws_bo.c
+++ b/src/gallium/winsys/r600/drm/radeon_ws_bo.c
@@ -8,21 +8,20 @@ struct radeon_ws_bo *radeon_ws_bo(struct radeon *radeon,
{
struct radeon_ws_bo *ws_bo = calloc(1, sizeof(struct radeon_ws_bo));
struct pb_desc desc;
+ struct pb_manager *man;
+
+ desc.alignment = alignment;
+ desc.usage = usage;
if (radeon->use_mem_constant && (usage & PIPE_BIND_CONSTANT_BUFFER)) {
- desc.alignment = alignment;
- desc.usage = usage;
- ws_bo->pb = radeon->mman->create_buffer(radeon->mman, size, &desc);
- if (ws_bo->pb == NULL) {
- free(ws_bo);
- return NULL;
- }
- } else {
- ws_bo->bo = radeon_bo(radeon, 0, size, alignment, NULL);
- if (!ws_bo->bo) {
- free(ws_bo);
- return NULL;
- }
+ man = radeon->mman;
+ } else
+ man = radeon->kman;
+
+ ws_bo->pb = man->create_buffer(man, size, &desc);
+ if (ws_bo->pb == NULL) {
+ free(ws_bo);
+ return NULL;
}
pipe_reference_init(&ws_bo->reference, 1);
@@ -34,8 +33,8 @@ struct radeon_ws_bo *radeon_ws_bo_handle(struct radeon *radeon,
{
struct radeon_ws_bo *ws_bo = calloc(1, sizeof(struct radeon_ws_bo));
- ws_bo->bo = radeon_bo(radeon, handle, 0, 0, NULL);
- if (!ws_bo->bo) {
+ ws_bo->pb = radeon_bo_pb_create_buffer_from_handle(radeon->kman, handle);
+ if (!ws_bo->pb) {
free(ws_bo);
return NULL;
}
@@ -45,26 +44,18 @@ struct radeon_ws_bo *radeon_ws_bo_handle(struct radeon *radeon,
void *radeon_ws_bo_map(struct radeon *radeon, struct radeon_ws_bo *bo, unsigned usage, void *ctx)
{
- if (bo->pb)
- return pb_map(bo->pb, usage, ctx);
- radeon_bo_map(radeon, bo->bo);
- return bo->bo->data;
+ return pb_map(bo->pb, usage, ctx);
}
void radeon_ws_bo_unmap(struct radeon *radeon, struct radeon_ws_bo *bo)
{
- if (bo->pb)
- pb_unmap(bo->pb);
- else
- radeon_bo_unmap(radeon, bo->bo);
+ pb_unmap(bo->pb);
}
static void radeon_ws_bo_destroy(struct radeon *radeon, struct radeon_ws_bo *bo)
{
if (bo->pb)
pb_reference(&bo->pb, NULL);
- else
- radeon_bo_reference(radeon, &bo->bo, NULL);
free(bo);
}
@@ -79,10 +70,35 @@ void radeon_ws_bo_reference(struct radeon *radeon, struct radeon_ws_bo **dst,
*dst = src;
}
-int radeon_ws_bo_wait(struct radeon *radeon, struct radeon_ws_bo *bo)
+int radeon_ws_bo_wait(struct radeon *radeon, struct radeon_ws_bo *pb_bo)
{
- if (bo->pb)
+ /* TODO */
+ struct radeon_bo *bo;
+ bo = radeon_bo_pb_get_bo(pb_bo->pb);
+ if (!bo)
return 0;
- else
- return radeon_bo_wait(radeon, bo->bo);
+ radeon_bo_wait(radeon, bo);
+ return 0;
+}
+
+unsigned radeon_ws_bo_get_handle(struct radeon_ws_bo *pb_bo)
+{
+ struct radeon_bo *bo;
+
+ bo = radeon_bo_pb_get_bo(pb_bo->pb);
+ if (!bo)
+ return 0;
+
+ return bo->handle;
+}
+
+unsigned radeon_ws_bo_get_size(struct radeon_ws_bo *pb_bo)
+{
+ struct radeon_bo *bo;
+
+ bo = radeon_bo_pb_get_bo(pb_bo->pb);
+ if (!bo)
+ return 0;
+
+ return bo->size;
}