From ada3d8f31ef3aeeb73d6d365738a2d1968ced596 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Tue, 31 May 2016 19:06:45 +0200 Subject: [PATCH] gallium/u_suballoc: allow different alignment for each allocation MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Just move the alignment parameter from u_suballocator_create to u_suballocator_alloc. Reviewed-by: Alex Deucher Tested-by: Grazvydas Ignotas Tested-by: Dieter Nützel --- 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 3f9ede075f2..5aaddbcb55c 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 5f9ccde7980..fb08f16fe40 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 c48d7586cbb..2141cf20050 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 846513b8199..ddf880e990a 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 7ace34b8772..870d5b8e5c8 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 a001700ea19..24216dee5eb 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 d66996aa657..7aaac3950b8 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 0987baf86c5..7bb3dc24e52 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; -- 2.30.2