From: Marek Olšák <marek.ol...@amd.com> --- src/gallium/auxiliary/util/u_suballoc.c | 22 ++++++++++++++++++---- src/gallium/auxiliary/util/u_suballoc.h | 2 +- src/gallium/drivers/r600/r600_pipe.c | 5 +++-- src/gallium/drivers/radeon/r600_pipe_common.c | 2 +- src/gallium/drivers/radeonsi/si_pipe.c | 2 +- 5 files changed, 24 insertions(+), 9 deletions(-)
diff --git a/src/gallium/auxiliary/util/u_suballoc.c b/src/gallium/auxiliary/util/u_suballoc.c index 8c463c9..392bba7 100644 --- a/src/gallium/auxiliary/util/u_suballoc.c +++ b/src/gallium/auxiliary/util/u_suballoc.c @@ -36,46 +36,48 @@ #include "u_suballoc.h" struct u_suballocator { struct pipe_context *pipe; 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. */ unsigned offset; /* Aligned offset pointing at the first unused byte. */ }; /** * Create a suballocator. * * \p zero_buffer_memory determines whether the buffer contents should be * cleared to 0 after the allocation. */ 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); if (!allocator) return NULL; allocator->pipe = pipe; allocator->size = size; allocator->bind = bind; allocator->usage = usage; + allocator->flags = flags; allocator->zero_buffer_memory = zero_buffer_memory; return allocator; } void u_suballocator_destroy(struct u_suballocator *allocator) { pipe_resource_reference(&allocator->buffer, NULL); FREE(allocator); } @@ -90,23 +92,35 @@ u_suballocator_alloc(struct u_suballocator *allocator, unsigned size, /* Don't allow allocations larger than the buffer size. */ if (size > allocator->size) goto fail; /* Make sure we have enough space in the buffer. */ if (!allocator->buffer || allocator->offset + size > allocator->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; /* Clear the memory if needed. */ if (allocator->zero_buffer_memory) { struct pipe_context *pipe = allocator->pipe; if (pipe->clear_buffer) { unsigned clear_value = 0; diff --git a/src/gallium/auxiliary/util/u_suballoc.h b/src/gallium/auxiliary/util/u_suballoc.h index fb08f16..e35382f 100644 --- a/src/gallium/auxiliary/util/u_suballoc.h +++ b/src/gallium/auxiliary/util/u_suballoc.h @@ -28,21 +28,21 @@ /* A simple allocator that suballocates memory from a large buffer. */ #ifndef U_SUBALLOC #define U_SUBALLOC 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 u_suballocator_destroy(struct u_suballocator *allocator); void u_suballocator_alloc(struct u_suballocator *allocator, unsigned size, unsigned alignment, unsigned *out_offset, struct pipe_resource **outbuf); diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index 5290f40..1803c26 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -181,22 +181,23 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, break; default: R600_ERR("Unsupported chip class %d.\n", rctx->b.chip_class); goto fail; } rctx->b.gfx.cs = ws->cs_create(rctx->b.ctx, RING_GFX, 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; rctx->isa = calloc(1, sizeof(struct r600_isa)); if (!rctx->isa || r600_isa_init(rctx, rctx->isa)) goto fail; if (rscreen->b.debug_flags & DBG_FORCE_DMA) rctx->b.b.resource_copy_region = rctx->b.dma_copy; diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c index 53d3dc6..8405c5e 100644 --- a/src/gallium/drivers/radeon/r600_pipe_common.c +++ b/src/gallium/drivers/radeon/r600_pipe_common.c @@ -591,21 +591,21 @@ bool r600_common_context_init(struct r600_common_context *rctx, rctx->b.set_device_reset_callback = r600_set_device_reset_callback; r600_init_context_texture_functions(rctx); r600_init_viewport_functions(rctx); r600_streamout_init(rctx); r600_query_init(rctx); cayman_init_msaa(&rctx->b); 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; rctx->b.stream_uploader = u_upload_create(&rctx->b, 1024 * 1024, 0, PIPE_USAGE_STREAM); if (!rctx->b.stream_uploader) return false; rctx->b.const_uploader = rctx->b.stream_uploader; rctx->ctx = rctx->ws->ctx_create(rctx->ws); diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 8806027..2dc884a 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -198,21 +198,21 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen, if (ws->cs_add_const_preamble_ib) { sctx->ce_preamble_ib = ws->cs_add_const_preamble_ib(sctx->b.gfx.cs); if (!sctx->ce_preamble_ib) goto fail; } 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; } sctx->b.gfx.flush = si_context_gfx_flush; /* Border colors. */ sctx->border_color_table = malloc(SI_MAX_BORDER_COLORS * sizeof(*sctx->border_color_table)); if (!sctx->border_color_table) -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev