gallium/u_suballoc: allow setting pipe_resource::flags
authorMarek Olšák <marek.olsak@amd.com>
Wed, 15 Feb 2017 19:55:15 +0000 (20:55 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Sat, 18 Feb 2017 00:22:08 +0000 (01:22 +0100)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/auxiliary/util/u_suballoc.c
src/gallium/auxiliary/util/u_suballoc.h
src/gallium/drivers/r600/r600_pipe.c
src/gallium/drivers/radeon/r600_pipe_common.c
src/gallium/drivers/radeonsi/si_pipe.c

index 8c463c9fdd058d80c664c315c4f02f064bab94a2..392bba7d6dddd3d06dced29c05c5e46363712791 100644 (file)
@@ -43,6 +43,7 @@ struct u_suballocator {
    unsigned size;          /* Size of the whole buffer, in bytes. */
    unsigned bind;          /* Bitmask of PIPE_BIND_* flags. */
    enum pipe_resource_usage usage;
+   unsigned flags;         /* pipe_resource::flags */
    boolean zero_buffer_memory; /* If the buffer contents should be zeroed. */
 
    struct pipe_resource *buffer;   /* The buffer we suballocate from. */
@@ -58,7 +59,7 @@ struct u_suballocator {
  */
 struct u_suballocator *
 u_suballocator_create(struct pipe_context *pipe, unsigned size, unsigned bind,
-                      enum pipe_resource_usage usage,
+                      enum pipe_resource_usage usage, unsigned flags,
                      boolean zero_buffer_memory)
 {
    struct u_suballocator *allocator = CALLOC_STRUCT(u_suballocator);
@@ -69,6 +70,7 @@ u_suballocator_create(struct pipe_context *pipe, unsigned size, unsigned bind,
    allocator->size = size;
    allocator->bind = bind;
    allocator->usage = usage;
+   allocator->flags = flags;
    allocator->zero_buffer_memory = zero_buffer_memory;
    return allocator;
 }
@@ -97,9 +99,21 @@ u_suballocator_alloc(struct u_suballocator *allocator, unsigned size,
       /* Allocate a new buffer. */
       pipe_resource_reference(&allocator->buffer, NULL);
       allocator->offset = 0;
-      allocator->buffer =
-         pipe_buffer_create(allocator->pipe->screen, allocator->bind,
-                            allocator->usage, allocator->size);
+
+      struct pipe_resource templ;
+      memset(&templ, 0, sizeof(templ));
+      templ.target = PIPE_BUFFER;
+      templ.format = PIPE_FORMAT_R8_UNORM;
+      templ.bind = allocator->bind;
+      templ.usage = allocator->usage;
+      templ.flags = allocator->flags;
+      templ.width0 = allocator->size;
+      templ.height0 = 1;
+      templ.depth0 = 1;
+      templ.array_size = 1;
+
+      struct pipe_screen *screen = allocator->pipe->screen;
+      allocator->buffer = screen->resource_create(screen, &templ);
       if (!allocator->buffer)
          goto fail;
 
index fb08f16fe40717695a8d827e3fb1b250595e072e..e35382f0437ab67cc717be0d6d24e06e137f7e02 100644 (file)
@@ -35,7 +35,7 @@ struct u_suballocator;
 
 struct u_suballocator *
 u_suballocator_create(struct pipe_context *pipe, unsigned size, unsigned bind,
-                      enum pipe_resource_usage usage,
+                      enum pipe_resource_usage usage, unsigned flags,
                      boolean zero_buffer_memory);
 
 void
index 5290f40d6cb96857ead28ae50cb964c1c1cd9e10..1803c265b9e6356e033e363b0d5ec4ab12aba789 100644 (file)
@@ -188,8 +188,9 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen,
                                       r600_context_gfx_flush, rctx);
        rctx->b.gfx.flush = r600_context_gfx_flush;
 
-       rctx->allocator_fetch_shader = u_suballocator_create(&rctx->b.b, 64 * 1024,
-                                                            0, PIPE_USAGE_DEFAULT, FALSE);
+       rctx->allocator_fetch_shader =
+               u_suballocator_create(&rctx->b.b, 64 * 1024,
+                                     0, PIPE_USAGE_DEFAULT, 0, FALSE);
        if (!rctx->allocator_fetch_shader)
                goto fail;
 
index 53d3dc6935d3f593356da0f2480bc79641f81cdf..8405c5e80f93722214974b5377b6e60ecf9fb598 100644 (file)
@@ -598,7 +598,7 @@ bool r600_common_context_init(struct r600_common_context *rctx,
 
        rctx->allocator_zeroed_memory =
                u_suballocator_create(&rctx->b, rscreen->info.gart_page_size,
-                                     0, PIPE_USAGE_DEFAULT, true);
+                                     0, PIPE_USAGE_DEFAULT, 0, true);
        if (!rctx->allocator_zeroed_memory)
                return false;
 
index 880602745c3fdb4d944d23c2c66d2d3aea833ac1..2dc884a63cddf98fa1330ce55aaa8392b5f6774c 100644 (file)
@@ -205,7 +205,7 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen,
 
                sctx->ce_suballocator =
                                u_suballocator_create(&sctx->b.b, 1024 * 1024,
-                                                     0, PIPE_USAGE_DEFAULT, false);
+                                                     0, PIPE_USAGE_DEFAULT, 0, false);
                if (!sctx->ce_suballocator)
                        goto fail;
        }