[Mesa-dev] [PATCH 2/6] u_upload_mgr: pass alignment to u_upload_alloc manually

Nicolai Hähnle nhaehnle at gmail.com
Tue Dec 29 06:27:09 PST 2015


On 21.12.2015 17:35, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> The fixed alignment of u_upload_mgr will go away.
> This is the first step.
>
> The motivation is that one u_upload_mgr can have multiple users,
> each allocating from the same buffer, but requiring a different alignment.
> ---
...
> diff --git a/src/gallium/auxiliary/util/u_upload_mgr.h b/src/gallium/auxiliary/util/u_upload_mgr.h
> index 67c6daa..1ad44fd 100644
> --- a/src/gallium/auxiliary/util/u_upload_mgr.h
> +++ b/src/gallium/auxiliary/util/u_upload_mgr.h
> @@ -74,13 +74,14 @@ void u_upload_unmap( struct u_upload_mgr *upload );
>    * \param upload           Upload manager
>    * \param min_out_offset   Minimum offset that should be returned in out_offset.
>    * \param size             Size of the allocation.
> + * \param alignment        Alignment of the suballocation within the buffer
>    * \param out_offset       Pointer to where the new buffer offset will be returned.
>    * \param outbuf           Pointer to where the upload buffer will be returned.
>    * \param ptr              Pointer to the allocated memory that is returned.
>    */
>   void u_upload_alloc(struct u_upload_mgr *upload,
>                       unsigned min_out_offset,
> -                    unsigned size,
> +                    unsigned size, unsigned alignment,
>                       unsigned *out_offset,
>                       struct pipe_resource **outbuf,
>                       void **ptr);

Personally, I feel it's better style to have each parameter on a line of 
its own. Otherwise, someone is bound to miss the additional parameter at 
a quick glance in the future.

With that change,

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

> diff --git a/src/gallium/auxiliary/util/u_vbuf.c b/src/gallium/auxiliary/util/u_vbuf.c
> index 54e9e71..dd64e2d 100644
> --- a/src/gallium/auxiliary/util/u_vbuf.c
> +++ b/src/gallium/auxiliary/util/u_vbuf.c
> @@ -454,7 +454,7 @@ u_vbuf_translate_buffers(struct u_vbuf *mgr, struct translate_key *key,
>
>         /* Create and map the output buffer. */
>         u_upload_alloc(mgr->uploader, 0,
> -                     key->output_stride * num_indices,
> +                     key->output_stride * num_indices, 4,
>                        &out_offset, &out_buffer,
>                        (void**)&out_map);
>         if (!out_buffer)
> @@ -487,7 +487,7 @@ u_vbuf_translate_buffers(struct u_vbuf *mgr, struct translate_key *key,
>         /* Create and map the output buffer. */
>         u_upload_alloc(mgr->uploader,
>                        key->output_stride * start_vertex,
> -                     key->output_stride * num_vertices,
> +                     key->output_stride * num_vertices, 4,
>                        &out_offset, &out_buffer,
>                        (void**)&out_map);
>         if (!out_buffer)
> diff --git a/src/gallium/auxiliary/vl/vl_compositor.c b/src/gallium/auxiliary/vl/vl_compositor.c
> index afe5306..f160df6 100644
> --- a/src/gallium/auxiliary/vl/vl_compositor.c
> +++ b/src/gallium/auxiliary/vl/vl_compositor.c
> @@ -716,6 +716,7 @@ gen_vertex_data(struct vl_compositor *c, struct vl_compositor_state *s, struct u
>      /* Allocate new memory for vertices. */
>      u_upload_alloc(c->upload, 0,
>                     c->vertex_buf.stride * VL_COMPOSITOR_MAX_LAYERS * 4, /* size */
> +                  4, /* alignment */
>                     &c->vertex_buf.buffer_offset, &c->vertex_buf.buffer,
>                     (void**)&vb);
>
> diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_context.c b/src/gallium/drivers/freedreno/a3xx/fd3_context.c
> index 74cbbf2..2413f15 100644
> --- a/src/gallium/drivers/freedreno/a3xx/fd3_context.c
> +++ b/src/gallium/drivers/freedreno/a3xx/fd3_context.c
> @@ -172,7 +172,7 @@ fd3_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
>   	fd3_query_context_init(pctx);
>
>   	fd3_ctx->border_color_uploader = u_upload_create(pctx, 4096,
> -			2 * PIPE_MAX_SAMPLERS * BORDERCOLOR_SIZE, 0);
> +			BORDER_COLOR_UPLOAD_SIZE, 0);
>
>   	return pctx;
>   }
> diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
> index 24afbc9..e65a352 100644
> --- a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
> +++ b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
> @@ -145,7 +145,8 @@ emit_textures(struct fd_context *ctx, struct fd_ringbuffer *ring,
>   	void *ptr;
>
>   	u_upload_alloc(fd3_ctx->border_color_uploader,
> -			0, 2 * PIPE_MAX_SAMPLERS * BORDERCOLOR_SIZE, &off,
> +			0, BORDER_COLOR_UPLOAD_SIZE,
> +		       BORDER_COLOR_UPLOAD_SIZE, &off,
>   			&fd3_ctx->border_color_buf,
>   			&ptr);
>
> diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_context.c b/src/gallium/drivers/freedreno/a4xx/fd4_context.c
> index e53e0c5..1037adf 100644
> --- a/src/gallium/drivers/freedreno/a4xx/fd4_context.c
> +++ b/src/gallium/drivers/freedreno/a4xx/fd4_context.c
> @@ -172,7 +172,7 @@ fd4_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
>   	fd4_query_context_init(pctx);
>
>   	fd4_ctx->border_color_uploader = u_upload_create(pctx, 4096,
> -			2 * PIPE_MAX_SAMPLERS * BORDERCOLOR_SIZE, 0);
> +			BORDER_COLOR_UPLOAD_SIZE, 0);
>
>   	return pctx;
>   }
> diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_emit.c b/src/gallium/drivers/freedreno/a4xx/fd4_emit.c
> index b9a2814..bc62a5d 100644
> --- a/src/gallium/drivers/freedreno/a4xx/fd4_emit.c
> +++ b/src/gallium/drivers/freedreno/a4xx/fd4_emit.c
> @@ -133,7 +133,8 @@ emit_textures(struct fd_context *ctx, struct fd_ringbuffer *ring,
>   	void *ptr;
>
>   	u_upload_alloc(fd4_ctx->border_color_uploader,
> -			0, 2 * PIPE_MAX_SAMPLERS * BORDERCOLOR_SIZE, &off,
> +			0, BORDER_COLOR_UPLOAD_SIZE,
> +		       BORDER_COLOR_UPLOAD_SIZE, &off,
>   			&fd4_ctx->border_color_buf,
>   			&ptr);
>
> diff --git a/src/gallium/drivers/freedreno/freedreno_context.h b/src/gallium/drivers/freedreno/freedreno_context.h
> index 571c814..418b71b 100644
> --- a/src/gallium/drivers/freedreno/freedreno_context.h
> +++ b/src/gallium/drivers/freedreno/freedreno_context.h
> @@ -40,6 +40,8 @@
>   #include "freedreno_gmem.h"
>   #include "freedreno_util.h"
>
> +#define BORDER_COLOR_UPLOAD_SIZE (2 * PIPE_MAX_SAMPLERS * BORDERCOLOR_SIZE)
> +
>   struct fd_vertex_stateobj;
>
>   struct fd_texture_stateobj {
> diff --git a/src/gallium/drivers/r300/r300_render_translate.c b/src/gallium/drivers/r300/r300_render_translate.c
> index caeeec0..7221211 100644
> --- a/src/gallium/drivers/r300/r300_render_translate.c
> +++ b/src/gallium/drivers/r300/r300_render_translate.c
> @@ -37,7 +37,7 @@ void r300_translate_index_buffer(struct r300_context *r300,
>       switch (*index_size) {
>       case 1:
>           *out_buffer = NULL;
> -        u_upload_alloc(r300->uploader, 0, count * 2,
> +        u_upload_alloc(r300->uploader, 0, count * 2, 4,
>                          &out_offset, out_buffer, &ptr);
>
>           util_shorten_ubyte_elts_to_userptr(
> @@ -51,7 +51,7 @@ void r300_translate_index_buffer(struct r300_context *r300,
>       case 2:
>           if (index_offset) {
>               *out_buffer = NULL;
> -            u_upload_alloc(r300->uploader, 0, count * 2,
> +            u_upload_alloc(r300->uploader, 0, count * 2, 4,
>                              &out_offset, out_buffer, &ptr);
>
>               util_rebuild_ushort_elts_to_userptr(&r300->context, ib,
> @@ -65,7 +65,7 @@ void r300_translate_index_buffer(struct r300_context *r300,
>       case 4:
>           if (index_offset) {
>               *out_buffer = NULL;
> -            u_upload_alloc(r300->uploader, 0, count * 4,
> +            u_upload_alloc(r300->uploader, 0, count * 4, 4,
>                              &out_offset, out_buffer, &ptr);
>
>               util_rebuild_uint_elts_to_userptr(&r300->context, ib,
> diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c
> index 6a66634..dde6b20 100644
> --- a/src/gallium/drivers/r600/r600_state_common.c
> +++ b/src/gallium/drivers/r600/r600_state_common.c
> @@ -1726,7 +1726,7 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info
>   				}
>   			}
>
> -			u_upload_alloc(rctx->b.uploader, start, count * 2,
> +			u_upload_alloc(rctx->b.uploader, start, count * 2, 256,
>   				       &out_offset, &out_buffer, &ptr);
>
>   			util_shorten_ubyte_elts_to_userptr(
> diff --git a/src/gallium/drivers/radeon/r600_buffer_common.c b/src/gallium/drivers/radeon/r600_buffer_common.c
> index 1892527..484f5c8 100644
> --- a/src/gallium/drivers/radeon/r600_buffer_common.c
> +++ b/src/gallium/drivers/radeon/r600_buffer_common.c
> @@ -298,7 +298,7 @@ static void *r600_buffer_transfer_map(struct pipe_context *ctx,
>   			struct r600_resource *staging = NULL;
>
>   			u_upload_alloc(rctx->uploader, 0, box->width + (box->x % R600_MAP_BUFFER_ALIGNMENT),
> -				       &offset, (struct pipe_resource**)&staging, (void**)&data);
> +				       256, &offset, (struct pipe_resource**)&staging, (void**)&data);
>
>   			if (staging) {
>   				data += box->x % R600_MAP_BUFFER_ALIGNMENT;
> diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c
> index 9a5e987..c044b61 100644
> --- a/src/gallium/drivers/radeon/r600_pipe_common.c
> +++ b/src/gallium/drivers/radeon/r600_pipe_common.c
> @@ -85,7 +85,7 @@ void r600_draw_rectangle(struct blitter_context *blitter,
>   	/* Upload vertices. The hw rectangle has only 3 vertices,
>   	 * I guess the 4th one is derived from the first 3.
>   	 * The vertex specification should match u_blitter's vertex element state. */
> -	u_upload_alloc(rctx->uploader, 0, sizeof(float) * 24, &offset, &buf, (void**)&vb);
> +	u_upload_alloc(rctx->uploader, 0, sizeof(float) * 24, 256, &offset, &buf, (void**)&vb);
>   	if (!buf)
>   		return;
>
> diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c
> index b3719de..5b0ad8f 100644
> --- a/src/gallium/drivers/radeonsi/si_descriptors.c
> +++ b/src/gallium/drivers/radeonsi/si_descriptors.c
> @@ -109,7 +109,7 @@ static bool si_upload_descriptors(struct si_context *sctx,
>   	if (!desc->list_dirty)
>   		return true;
>
> -	u_upload_alloc(sctx->b.uploader, 0, list_size,
> +	u_upload_alloc(sctx->b.uploader, 0, list_size, 256,
>   		       &desc->buffer_offset,
>   		       (struct pipe_resource**)&desc->buffer, &ptr);
>   	if (!desc->buffer)
> @@ -391,7 +391,7 @@ static bool si_upload_vertex_buffer_descriptors(struct si_context *sctx)
>   	 * directly through a staging buffer and don't go through
>   	 * the fine-grained upload path.
>   	 */
> -	u_upload_alloc(sctx->b.uploader, 0, count * 16, &desc->buffer_offset,
> +	u_upload_alloc(sctx->b.uploader, 0, count * 16, 256, &desc->buffer_offset,
>   		       (struct pipe_resource**)&desc->buffer, (void**)&ptr);
>   	if (!desc->buffer)
>   		return false;
> @@ -465,7 +465,7 @@ void si_upload_const_buffer(struct si_context *sctx, struct r600_resource **rbuf
>   {
>   	void *tmp;
>
> -	u_upload_alloc(sctx->b.uploader, 0, size, const_offset,
> +	u_upload_alloc(sctx->b.uploader, 0, size, 256, const_offset,
>   		       (struct pipe_resource**)rbuffer, &tmp);
>   	if (rbuffer)
>   		util_memcpy_cpu_to_le32(tmp, ptr, size);
> diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c
> index e550011..d5540be 100644
> --- a/src/gallium/drivers/radeonsi/si_state_draw.c
> +++ b/src/gallium/drivers/radeonsi/si_state_draw.c
> @@ -818,7 +818,7 @@ void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
>   			si_get_draw_start_count(sctx, info, &start, &count);
>   			start_offset = start * ib.index_size;
>
> -			u_upload_alloc(sctx->b.uploader, start_offset, count * 2,
> +			u_upload_alloc(sctx->b.uploader, start_offset, count * 2, 256,
>   				       &out_offset, &out_buffer, &ptr);
>   			if (!out_buffer) {
>   				pipe_resource_reference(&ib.buffer, NULL);
> diff --git a/src/gallium/drivers/svga/svga_context.c b/src/gallium/drivers/svga/svga_context.c
> index d407785..97e649e 100644
> --- a/src/gallium/drivers/svga/svga_context.c
> +++ b/src/gallium/drivers/svga/svga_context.c
> @@ -46,7 +46,6 @@
>   #include "svga_winsys.h"
>
>   #define CONST0_UPLOAD_DEFAULT_SIZE 65536
> -#define CONST0_UPLOAD_ALIGNMENT 256
>
>   DEBUG_GET_ONCE_BOOL_OPTION(no_swtnl, "SVGA_NO_SWTNL", FALSE)
>   DEBUG_GET_ONCE_BOOL_OPTION(force_swtnl, "SVGA_FORCE_SWTNL", FALSE);
> diff --git a/src/gallium/drivers/svga/svga_context.h b/src/gallium/drivers/svga/svga_context.h
> index 78e346a..c282932 100644
> --- a/src/gallium/drivers/svga/svga_context.h
> +++ b/src/gallium/drivers/svga/svga_context.h
> @@ -74,6 +74,8 @@
>    */
>   #define SVGA_MAX_CONST_BUF_SIZE (4096 * 4 * sizeof(int))
>
> +#define CONST0_UPLOAD_ALIGNMENT 256
> +
>   struct draw_vertex_shader;
>   struct draw_fragment_shader;
>   struct svga_shader_variant;
> diff --git a/src/gallium/drivers/svga/svga_state_constants.c b/src/gallium/drivers/svga/svga_state_constants.c
> index 2cf4113..8ab1693 100644
> --- a/src/gallium/drivers/svga/svga_state_constants.c
> +++ b/src/gallium/drivers/svga/svga_state_constants.c
> @@ -613,7 +613,8 @@ emit_constbuf_vgpu10(struct svga_context *svga, unsigned shader)
>       */
>      new_buf_size = align(new_buf_size, 16);
>
> -   u_upload_alloc(svga->const0_upload, 0, new_buf_size, &offset,
> +   u_upload_alloc(svga->const0_upload, 0, new_buf_size,
> +                  CONST0_UPLOAD_ALIGNMENT, &offset,
>                     &dst_buffer, &dst_map);
>      if (!dst_map) {
>         if (src_map)
> diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c
> index 9e6678a..308fb9f 100644
> --- a/src/gallium/drivers/vc4/vc4_resource.c
> +++ b/src/gallium/drivers/vc4/vc4_resource.c
> @@ -921,7 +921,7 @@ vc4_get_shadow_index_buffer(struct pipe_context *pctx,
>
>           void *data;
>           struct pipe_resource *shadow_rsc = NULL;
> -        u_upload_alloc(vc4->uploader, 0, count * 2,
> +        u_upload_alloc(vc4->uploader, 0, count * 2, 4,;
>                          shadow_offset, &shadow_rsc, &data);
>           uint16_t *dst = data;
>
> diff --git a/src/mesa/state_tracker/st_cb_bitmap.c b/src/mesa/state_tracker/st_cb_bitmap.c
> index a4a48a6..14e8354 100644
> --- a/src/mesa/state_tracker/st_cb_bitmap.c
> +++ b/src/mesa/state_tracker/st_cb_bitmap.c
> @@ -204,7 +204,7 @@ setup_bitmap_vertex_data(struct st_context *st, bool normalized,
>         tBot = (GLfloat) height;
>      }
>
> -   u_upload_alloc(st->uploader, 0, 4 * sizeof(vertices[0]),
> +   u_upload_alloc(st->uploader, 0, 4 * sizeof(vertices[0]), 4,
>                     vbuf_offset, vbuf, (void **) &vertices);
>      if (!*vbuf) {
>         return;
> diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c
> index 18efd14..e09f5ec 100644
> --- a/src/mesa/state_tracker/st_cb_clear.c
> +++ b/src/mesa/state_tracker/st_cb_clear.c
> @@ -184,7 +184,7 @@ draw_quad(struct st_context *st,
>
>      vb.stride = 8 * sizeof(float);
>
> -   u_upload_alloc(st->uploader, 0, 4 * sizeof(vertices[0]),
> +   u_upload_alloc(st->uploader, 0, 4 * sizeof(vertices[0]), 4,
>                     &vb.buffer_offset, &vb.buffer,
>                     (void **) &vertices);
>      if (!vb.buffer) {
> diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
> index a125d1f..86e8a55 100644
> --- a/src/mesa/state_tracker/st_cb_drawpixels.c
> +++ b/src/mesa/state_tracker/st_cb_drawpixels.c
> @@ -457,7 +457,7 @@ draw_quad(struct gl_context *ctx, GLfloat x0, GLfloat y0, GLfloat z,
>      struct pipe_resource *buf = NULL;
>      unsigned offset;
>
> -   u_upload_alloc(st->uploader, 0, 4 * sizeof(verts[0]), &offset,
> +   u_upload_alloc(st->uploader, 0, 4 * sizeof(verts[0]), 4, &offset,
>                     &buf, (void **) &verts);
>      if (!buf) {
>         return;
> diff --git a/src/mesa/state_tracker/st_cb_drawtex.c b/src/mesa/state_tracker/st_cb_drawtex.c
> index 2634b09..b3e4b5b 100644
> --- a/src/mesa/state_tracker/st_cb_drawtex.c
> +++ b/src/mesa/state_tracker/st_cb_drawtex.c
> @@ -150,7 +150,7 @@ st_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z,
>         GLuint attr;
>
>         u_upload_alloc(st->uploader, 0,
> -                     numAttribs * 4 * 4 * sizeof(GLfloat),
> +                     numAttribs * 4 * 4 * sizeof(GLfloat), 4,
>                        &offset, &vbuffer, (void **) &vbuf);
>         if (!vbuffer) {
>            return;
>


More information about the mesa-dev mailing list