Mesa (master): gallium/u_suballoc: allow different alignment for each allocation

Marek Olšák mareko at kemper.freedesktop.org
Sat Jun 4 13:43:02 UTC 2016


Module: Mesa
Branch: master
Commit: ada3d8f31ef3aeeb73d6d365738a2d1968ced596
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=ada3d8f31ef3aeeb73d6d365738a2d1968ced596

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Tue May 31 19:06:45 2016 +0200

gallium/u_suballoc: allow different alignment for each allocation

Just move the alignment parameter from u_suballocator_create
to u_suballocator_alloc.

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
Tested-by: Grazvydas Ignotas <notasas at gmail.com>
Tested-by: Dieter Nützel <Dieter at nuetzel-hh.de>

---

 src/gallium/auxiliary/util/u_suballoc.c       | 22 ++++++++++------------
 src/gallium/auxiliary/util/u_suballoc.h       |  6 +++---
 src/gallium/drivers/r600/r600_asm.c           |  3 ++-
 src/gallium/drivers/r600/r600_pipe.c          |  2 +-
 src/gallium/drivers/radeon/r600_pipe_common.c |  2 +-
 src/gallium/drivers/radeon/r600_streamout.c   |  2 +-
 src/gallium/drivers/radeonsi/si_descriptors.c |  2 +-
 src/gallium/drivers/radeonsi/si_pipe.c        |  2 +-
 8 files changed, 20 insertions(+), 21 deletions(-)

diff --git a/src/gallium/auxiliary/util/u_suballoc.c b/src/gallium/auxiliary/util/u_suballoc.c
index 3f9ede0..5aaddbc 100644
--- a/src/gallium/auxiliary/util/u_suballoc.c
+++ b/src/gallium/auxiliary/util/u_suballoc.c
@@ -41,7 +41,6 @@ struct u_suballocator {
    struct pipe_context *pipe;
 
    unsigned size;          /* Size of the whole buffer, in bytes. */
-   unsigned alignment;     /* Alignment of each sub-allocation. */
    unsigned bind;          /* Bitmask of PIPE_BIND_* flags. */
    enum pipe_resource_usage usage;
    boolean zero_buffer_memory; /* If the buffer contents should be zeroed. */
@@ -58,8 +57,7 @@ struct u_suballocator {
  * cleared to 0 after the allocation.
  */
 struct u_suballocator *
-u_suballocator_create(struct pipe_context *pipe, unsigned size,
-                      unsigned alignment, unsigned bind,
+u_suballocator_create(struct pipe_context *pipe, unsigned size, unsigned bind,
                       enum pipe_resource_usage usage,
 		      boolean zero_buffer_memory)
 {
@@ -68,8 +66,7 @@ u_suballocator_create(struct pipe_context *pipe, unsigned size,
       return NULL;
 
    allocator->pipe = pipe;
-   allocator->size = align(size, alignment);
-   allocator->alignment = alignment;
+   allocator->size = size;
    allocator->bind = bind;
    allocator->usage = usage;
    allocator->zero_buffer_memory = zero_buffer_memory;
@@ -85,17 +82,18 @@ u_suballocator_destroy(struct u_suballocator *allocator)
 
 void
 u_suballocator_alloc(struct u_suballocator *allocator, unsigned size,
-                     unsigned *out_offset, struct pipe_resource **outbuf)
+                     unsigned alignment, unsigned *out_offset,
+                     struct pipe_resource **outbuf)
 {
-   unsigned alloc_size = align(size, allocator->alignment);
+   allocator->offset = align(allocator->offset, alignment);
 
    /* Don't allow allocations larger than the buffer size. */
-   if (alloc_size > allocator->size)
+   if (size > allocator->size)
       goto fail;
 
    /* Make sure we have enough space in the buffer. */
    if (!allocator->buffer ||
-       allocator->offset + alloc_size > allocator->size) {
+       allocator->offset + size > allocator->size) {
       /* Allocate a new buffer. */
       pipe_resource_reference(&allocator->buffer, NULL);
       allocator->offset = 0;
@@ -117,15 +115,15 @@ u_suballocator_alloc(struct u_suballocator *allocator, unsigned size,
       }
    }
 
-   assert(allocator->offset % allocator->alignment == 0);
+   assert(allocator->offset % alignment == 0);
    assert(allocator->offset < allocator->buffer->width0);
-   assert(allocator->offset + alloc_size <= allocator->buffer->width0);
+   assert(allocator->offset + size <= allocator->buffer->width0);
 
    /* Return the buffer. */
    *out_offset = allocator->offset;
    pipe_resource_reference(outbuf, allocator->buffer);
 
-   allocator->offset += alloc_size;
+   allocator->offset += size;
    return;
 
 fail:
diff --git a/src/gallium/auxiliary/util/u_suballoc.h b/src/gallium/auxiliary/util/u_suballoc.h
index 5f9ccde..fb08f16 100644
--- a/src/gallium/auxiliary/util/u_suballoc.h
+++ b/src/gallium/auxiliary/util/u_suballoc.h
@@ -34,8 +34,7 @@
 struct u_suballocator;
 
 struct u_suballocator *
-u_suballocator_create(struct pipe_context *pipe, unsigned size,
-                      unsigned alignment, unsigned bind,
+u_suballocator_create(struct pipe_context *pipe, unsigned size, unsigned bind,
                       enum pipe_resource_usage usage,
 		      boolean zero_buffer_memory);
 
@@ -44,6 +43,7 @@ u_suballocator_destroy(struct u_suballocator *allocator);
 
 void
 u_suballocator_alloc(struct u_suballocator *allocator, unsigned size,
-                     unsigned *out_offset, struct pipe_resource **outbuf);
+                     unsigned alignment, unsigned *out_offset,
+                     struct pipe_resource **outbuf);
 
 #endif
diff --git a/src/gallium/drivers/r600/r600_asm.c b/src/gallium/drivers/r600/r600_asm.c
index c48d758..2141cf2 100644
--- a/src/gallium/drivers/r600/r600_asm.c
+++ b/src/gallium/drivers/r600/r600_asm.c
@@ -2615,7 +2615,8 @@ void *r600_create_vertex_fetch_shader(struct pipe_context *ctx,
 		return NULL;
 	}
 
-	u_suballocator_alloc(rctx->allocator_fetch_shader, fs_size, &shader->offset,
+	u_suballocator_alloc(rctx->allocator_fetch_shader, fs_size, 256,
+			     &shader->offset,
 			     (struct pipe_resource**)&shader->buffer);
 	if (!shader->buffer) {
 		r600_bytecode_clear(&bc);
diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
index 846513b..ddf880e 100644
--- a/src/gallium/drivers/r600/r600_pipe.c
+++ b/src/gallium/drivers/r600/r600_pipe.c
@@ -187,7 +187,7 @@ 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, 256,
+	rctx->allocator_fetch_shader = u_suballocator_create(&rctx->b.b, 64 * 1024,
 							     0, PIPE_USAGE_DEFAULT, FALSE);
 	if (!rctx->allocator_fetch_shader)
 		goto fail;
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c
index 7ace34b..870d5b8 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.c
+++ b/src/gallium/drivers/radeon/r600_pipe_common.c
@@ -371,7 +371,7 @@ bool r600_common_context_init(struct r600_common_context *rctx,
 
 	rctx->allocator_so_filled_size =
 		u_suballocator_create(&rctx->b, rscreen->info.gart_page_size,
-				      4, 0, PIPE_USAGE_DEFAULT, TRUE);
+				      0, PIPE_USAGE_DEFAULT, TRUE);
 	if (!rctx->allocator_so_filled_size)
 		return false;
 
diff --git a/src/gallium/drivers/radeon/r600_streamout.c b/src/gallium/drivers/radeon/r600_streamout.c
index a001700..24216de 100644
--- a/src/gallium/drivers/radeon/r600_streamout.c
+++ b/src/gallium/drivers/radeon/r600_streamout.c
@@ -46,7 +46,7 @@ r600_create_so_target(struct pipe_context *ctx,
 		return NULL;
 	}
 
-	u_suballocator_alloc(rctx->allocator_so_filled_size, 4,
+	u_suballocator_alloc(rctx->allocator_so_filled_size, 4, 4,
 			     &t->buf_filled_size_offset,
 			     (struct pipe_resource**)&t->buf_filled_size);
 	if (!t->buf_filled_size) {
diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c
index d66996a..7aaac39 100644
--- a/src/gallium/drivers/radeonsi/si_descriptors.c
+++ b/src/gallium/drivers/radeonsi/si_descriptors.c
@@ -140,7 +140,7 @@ static bool si_ce_upload(struct si_context *sctx, unsigned ce_offset, unsigned s
 			 unsigned *out_offset, struct r600_resource **out_buf) {
 	uint64_t va;
 
-	u_suballocator_alloc(sctx->ce_suballocator, size, out_offset,
+	u_suballocator_alloc(sctx->ce_suballocator, size, 64, out_offset,
 			     (struct pipe_resource**)out_buf);
 	if (!out_buf)
 			return false;
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
index 0987baf..7bb3dc2 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -164,7 +164,7 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen,
 
 		sctx->ce_suballocator =
 				u_suballocator_create(&sctx->b.b, 1024 * 1024,
-						      64, PIPE_BIND_CUSTOM,
+						      PIPE_BIND_CUSTOM,
 						      PIPE_USAGE_DEFAULT, FALSE);
 		if (!sctx->ce_suballocator)
 			goto fail;




More information about the mesa-commit mailing list