[Mesa-dev] [PATCH 6/6] radeonsi: add glClearBufferSubData acceleration

Nicolai Hähnle nhaehnle at gmail.com
Mon Nov 9 01:07:13 PST 2015


On 08.11.2015 22:44, Marek Olšák wrote:
> From: Marek Olšák <marek.olsak at amd.com>
>
> Unaligned 8-bit and 16-bit clears are done in software.

I found this confusing at first. I think a better phrasing is something 
along the lines of:

8-bit and 16-bit clears which are not aligned to dwords are done in 
software.

With this, the whole series is

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

> ---
>   src/gallium/drivers/radeonsi/si_blit.c | 60 ++++++++++++++++++++++++++++++++++
>   1 file changed, 60 insertions(+)
>
> diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c
> index d320ac4..31f22c4 100644
> --- a/src/gallium/drivers/radeonsi/si_blit.c
> +++ b/src/gallium/drivers/radeonsi/si_blit.c
> @@ -737,9 +737,69 @@ static void si_flush_resource(struct pipe_context *ctx,
>   	}
>   }
>
> +static void si_pipe_clear_buffer(struct pipe_context *ctx,
> +				 struct pipe_resource *dst,
> +				 unsigned offset, unsigned size,
> +				 const void *clear_value_ptr,
> +				 int clear_value_size)
> +{
> +	struct si_context *sctx = (struct si_context*)ctx;
> +	uint32_t dword_value;
> +	unsigned i;
> +
> +	assert(offset % clear_value_size == 0);
> +	assert(size % clear_value_size == 0);
> +
> +	if (clear_value_size > 4) {
> +		const uint32_t *u32 = clear_value_ptr;
> +		bool clear_dword_duplicated = true;
> +
> +		/* See if we can lower large fills to dword fills. */
> +		for (i = 1; i < clear_value_size / 4; i++)
> +			if (u32[0] != u32[i]) {
> +				clear_dword_duplicated = false;
> +				break;
> +			}
> +
> +		if (!clear_dword_duplicated) {
> +			/* Use transform feedback for 64-bit, 96-bit, and
> +			 * 128-bit fills.
> +			 */
> +			union pipe_color_union clear_value;
> +
> +			memcpy(&clear_value, clear_value_ptr, clear_value_size);
> +			si_blitter_begin(ctx, SI_DISABLE_RENDER_COND);
> +			util_blitter_clear_buffer(sctx->blitter, dst, offset,
> +						  size, clear_value_size / 4,
> +						  &clear_value);
> +			si_blitter_end(ctx);
> +			return;
> +		}
> +	}
> +
> +	/* Expand the clear value to a dword. */
> +	switch (clear_value_size) {
> +	case 1:
> +		dword_value = *(uint8_t*)clear_value_ptr;
> +		dword_value |= (dword_value << 8) |
> +			       (dword_value << 16) |
> +			       (dword_value << 24);
> +		break;
> +	case 2:
> +		dword_value = *(uint16_t*)clear_value_ptr;
> +		dword_value |= dword_value << 16;
> +		break;
> +	default:
> +		dword_value = *(uint32_t*)clear_value_ptr;
> +	}
> +
> +	sctx->b.clear_buffer(ctx, dst, offset, size, dword_value, false);
> +}
> +
>   void si_init_blit_functions(struct si_context *sctx)
>   {
>   	sctx->b.b.clear = si_clear;
> +	sctx->b.b.clear_buffer = si_pipe_clear_buffer;
>   	sctx->b.b.clear_render_target = si_clear_render_target;
>   	sctx->b.b.clear_depth_stencil = si_clear_depth_stencil;
>   	sctx->b.b.resource_copy_region = si_resource_copy_region;
>



More information about the mesa-dev mailing list