r600g: move constant buffer creation behind winsys abstraction.
[mesa.git] / src / gallium / drivers / r600 / r600_buffer.c
index bc6e336ba7b016e69f8b2e52ca42d8d2d9b4f8a2..a38c013e1674b8d5caa5b2f042f587405ec3fcd8 100644 (file)
 #include "state_tracker/drm_driver.h"
 #include "r600_screen.h"
 #include "r600_context.h"
+#include "r600_resource.h"
 
 extern struct u_resource_vtbl r600_buffer_vtbl;
 
-static u32 r600_domain_from_usage(unsigned usage)
+u32 r600_domain_from_usage(unsigned usage)
 {
        u32 domain = RADEON_GEM_DOMAIN_GTT;
 
@@ -55,6 +56,9 @@ static u32 r600_domain_from_usage(unsigned usage)
        if (usage & PIPE_BIND_INDEX_BUFFER) {
            domain |= RADEON_GEM_DOMAIN_GTT;
        }
+       if (usage & PIPE_BIND_CONSTANT_BUFFER) {
+           domain |= RADEON_GEM_DOMAIN_VRAM;
+       }
 
        return domain;
 }
@@ -63,49 +67,38 @@ struct pipe_resource *r600_buffer_create(struct pipe_screen *screen,
                                         const struct pipe_resource *templ)
 {
        struct r600_screen *rscreen = r600_screen(screen);
-       struct r600_buffer *rbuffer;
-       struct radeon_bo *bo;
-       struct pb_desc desc;
+       struct r600_resource *rbuffer;
+       struct radeon_ws_bo *bo;
        /* XXX We probably want a different alignment for buffers and textures. */
        unsigned alignment = 4096;
 
-       rbuffer = CALLOC_STRUCT(r600_buffer);
+       rbuffer = CALLOC_STRUCT(r600_resource);
        if (rbuffer == NULL)
                return NULL;
 
-       rbuffer->b.b = *templ;
-       pipe_reference_init(&rbuffer->b.b.reference, 1);
-       rbuffer->b.b.screen = screen;
-       rbuffer->b.vtbl = &r600_buffer_vtbl;
-
-       if (rbuffer->b.b.bind & PIPE_BIND_CONSTANT_BUFFER) {
-               desc.alignment = alignment;
-               desc.usage = rbuffer->b.b.bind;
-               rbuffer->pb = pb_malloc_buffer_create(rbuffer->b.b.width0,
-                                                     &desc);
-               if (rbuffer->pb == NULL) {
-                       free(rbuffer);
-                       return NULL;
-               }
-               return &rbuffer->b.b;
-       }
-       rbuffer->domain = r600_domain_from_usage(rbuffer->b.b.bind);
-       bo = radeon_bo(rscreen->rw, 0, rbuffer->b.b.width0, alignment, NULL);
+       rbuffer->base.b = *templ;
+       pipe_reference_init(&rbuffer->base.b.reference, 1);
+       rbuffer->base.b.screen = screen;
+       rbuffer->base.vtbl = &r600_buffer_vtbl;
+       rbuffer->size = rbuffer->base.b.width0;
+       rbuffer->domain = r600_domain_from_usage(rbuffer->base.b.bind);
+       bo = radeon_ws_bo(rscreen->rw, rbuffer->base.b.width0, alignment, rbuffer->base.b.bind);
        if (bo == NULL) {
                FREE(rbuffer);
                return NULL;
        }
        rbuffer->bo = bo;
-       return &rbuffer->b.b;
+       return &rbuffer->base.b;
 }
 
 struct pipe_resource *r600_user_buffer_create(struct pipe_screen *screen,
                                              void *ptr, unsigned bytes,
                                              unsigned bind)
 {
-       struct r600_buffer *rbuffer;
+       struct r600_resource *rbuffer;
        struct r600_screen *rscreen = r600_screen(screen);
        struct pipe_resource templ;
+       void *data;
 
        memset(&templ, 0, sizeof(struct pipe_resource));
        templ.target = PIPE_BUFFER;
@@ -116,29 +109,24 @@ struct pipe_resource *r600_user_buffer_create(struct pipe_screen *screen,
        templ.height0 = 1;
        templ.depth0 = 1;
 
-       rbuffer = (struct r600_buffer*)r600_buffer_create(screen, &templ);
+       rbuffer = (struct r600_resource*)r600_buffer_create(screen, &templ);
        if (rbuffer == NULL) {
                return NULL;
        }
-       radeon_bo_map(rscreen->rw, rbuffer->bo);
-       memcpy(rbuffer->bo->data, ptr, bytes);
-       radeon_bo_unmap(rscreen->rw, rbuffer->bo);
-       return &rbuffer->b.b;
+       data = radeon_ws_bo_map(rscreen->rw, rbuffer->bo, 0, NULL);
+       memcpy(data, ptr, bytes);
+       radeon_ws_bo_unmap(rscreen->rw, rbuffer->bo);
+       return &rbuffer->base.b;
 }
 
 static void r600_buffer_destroy(struct pipe_screen *screen,
                                struct pipe_resource *buf)
 {
-       struct r600_buffer *rbuffer = (struct r600_buffer*)buf;
+       struct r600_resource *rbuffer = (struct r600_resource*)buf;
        struct r600_screen *rscreen = r600_screen(screen);
 
-       if (rbuffer->pb) {
-               pipe_reference_init(&rbuffer->pb->base.reference, 0);
-               pb_destroy(rbuffer->pb);
-               rbuffer->pb = NULL;
-       }
        if (rbuffer->bo) {
-               radeon_bo_decref(rscreen->rw, rbuffer->bo);
+               radeon_ws_bo_reference(rscreen->rw, &rbuffer->bo, NULL);
        }
        FREE(rbuffer);
 }
@@ -146,36 +134,31 @@ static void r600_buffer_destroy(struct pipe_screen *screen,
 static void *r600_buffer_transfer_map(struct pipe_context *pipe,
                                      struct pipe_transfer *transfer)
 {
-       struct r600_buffer *rbuffer = (struct r600_buffer*)transfer->resource;
+       struct r600_resource *rbuffer = (struct r600_resource*)transfer->resource;
        struct r600_screen *rscreen = r600_screen(pipe->screen);
        int write = 0;
+       uint8_t *data;
 
-       if (rbuffer->pb) {
-               return (uint8_t*)pb_map(rbuffer->pb, transfer->usage) + transfer->box.x;
-       }
        if (transfer->usage & PIPE_TRANSFER_DONTBLOCK) {
                /* FIXME */
        }
        if (transfer->usage & PIPE_TRANSFER_WRITE) {
                write = 1;
        }
-       if (radeon_bo_map(rscreen->rw, rbuffer->bo)) {
+       data = radeon_ws_bo_map(rscreen->rw, rbuffer->bo, transfer->usage, r600_context(pipe));
+       if (!data)
                return NULL;
-       }
-       return (uint8_t*)rbuffer->bo->data + transfer->box.x;
+
+       return (uint8_t*)data + transfer->box.x;
 }
 
 static void r600_buffer_transfer_unmap(struct pipe_context *pipe,
-                                      struct pipe_transfer *transfer)
+                                       struct pipe_transfer *transfer)
 {
-       struct r600_buffer *rbuffer = (struct r600_buffer*)transfer->resource;
+       struct r600_resource *rbuffer = (struct r600_resource*)transfer->resource;
        struct r600_screen *rscreen = r600_screen(pipe->screen);
 
-       if (rbuffer->pb) {
-               pb_unmap(rbuffer->pb);
-       } else {
-               radeon_bo_unmap(rscreen->rw, rbuffer->bo);
-       }
+       radeon_ws_bo_unmap(rscreen->rw, rbuffer->bo);
 }
 
 static void r600_buffer_transfer_flush_region(struct pipe_context *pipe,
@@ -188,7 +171,7 @@ unsigned r600_buffer_is_referenced_by_cs(struct pipe_context *context,
                                         struct pipe_resource *buf,
                                         unsigned face, unsigned level)
 {
-       /* XXX */
+       /* FIXME */
        return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE;
 }
 
@@ -196,26 +179,26 @@ struct pipe_resource *r600_buffer_from_handle(struct pipe_screen *screen,
                                              struct winsys_handle *whandle)
 {
        struct radeon *rw = (struct radeon*)screen->winsys;
-       struct r600_buffer *rbuffer;
-       struct radeon_bo *bo = NULL;
+       struct r600_resource *rbuffer;
+       struct radeon_ws_bo *bo = NULL;
 
-       bo = radeon_bo(rw, whandle->handle, 0, 0, NULL);
+       bo = radeon_ws_bo_handle(rw, whandle->handle);
        if (bo == NULL) {
                return NULL;
        }
 
-       rbuffer = CALLOC_STRUCT(r600_buffer);
+       rbuffer = CALLOC_STRUCT(r600_resource);
        if (rbuffer == NULL) {
-               radeon_bo_decref(rw, bo);
+               radeon_ws_bo_reference(rw, &bo, NULL);
                return NULL;
        }
 
-       pipe_reference_init(&rbuffer->b.b.reference, 1);
-       rbuffer->b.b.target = PIPE_BUFFER;
-       rbuffer->b.b.screen = screen;
-       rbuffer->b.vtbl = &r600_buffer_vtbl;
+       pipe_reference_init(&rbuffer->base.b.reference, 1);
+       rbuffer->base.b.target = PIPE_BUFFER;
+       rbuffer->base.b.screen = screen;
+       rbuffer->base.vtbl = &r600_buffer_vtbl;
        rbuffer->bo = bo;
-       return &rbuffer->b.b;
+       return &rbuffer->base.b;
 }
 
 struct u_resource_vtbl r600_buffer_vtbl =