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@amd.com>
Tested-by: Grazvydas Ignotas <notasas@gmail.com>
Tested-by: Dieter Nützel <Dieter@nuetzel-hh.de>
This commit is contained in:
Marek Olšák
2016-05-31 19:06:45 +02:00
parent 441194edd9
commit ada3d8f31e
8 changed files with 20 additions and 21 deletions

View File

@@ -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:

View File

@@ -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

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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;