gallium/u_suballoc: allow setting pipe_resource::flags

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
Marek Olšák 2017-02-15 20:55:15 +01:00
parent edf6bcf6c6
commit 22c34bbc55
5 changed files with 24 additions and 9 deletions

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

View 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

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

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

View 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;
}