[Mesa-dev] [PATCH 5/7] gallium/u_suballoc: allow setting pipe_resource::flags

Brian Paul brianp at vmware.com
Mon Feb 20 16:21:26 UTC 2017


On 02/16/2017 05:52 AM, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at 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 */

/* bitmask of PIPE_RESOURCE_FLAG_x */ would be more explicit.  And maybe 
even call the field 'resource_flags' instead.


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

Can you add a comment for the new param here?  As is, reading "unsigned 
flags" surely would require digging around to know what flags are expected.

\p flags  bitmask of PIPE_RESOURCE_FLAG_x bits.


I'd like to look at using true enums for some of our bitfield flags. 
Last time I looked, gdb was able to figure out when an enum represents a 
bitmask and helpfully printed the flag names.

-Brian


>    */
>   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)
>



More information about the mesa-dev mailing list