[Mesa-dev] [PATCH] radeonsi: add basic glClearBufferSubData acceleration

Marek Olšák maraeo at gmail.com
Tue Nov 3 15:47:11 PST 2015


From: Marek Olšák <marek.olsak at amd.com>

---
 src/gallium/drivers/radeonsi/si_blit.c | 55 ++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c
index fce014a..e934146 100644
--- a/src/gallium/drivers/radeonsi/si_blit.c
+++ b/src/gallium/drivers/radeonsi/si_blit.c
@@ -731,9 +731,64 @@ 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,
+				 int clear_value_size)
+{
+	struct si_context *sctx = (struct si_context*)ctx;
+	const uint32_t *u32 = clear_value;
+	unsigned i;
+	bool clear_value_fits_dword = true;
+	uint8_t *map;
+
+	if (clear_value_size > 4)
+		for (i = 1; i < clear_value_size / 4; i++)
+			if (u32[0] != u32[i]) {
+				clear_value_fits_dword = false;
+				break;
+			}
+
+	/* Use CP DMA for the simple case. */
+	if (offset % 4 == 0 && size % 4 == 0 && clear_value_fits_dword) {
+		uint32_t value = u32[0];
+
+		switch (clear_value_size) {
+		case 1:
+			value &= 0xff;
+			value |= (value << 8) | (value << 16) | (value << 24);
+			break;
+		case 2:
+			value &= 0xffff;
+			value |= value << 16;
+			break;
+		}
+
+		sctx->b.clear_buffer(ctx, dst, offset, size, value, false);
+		return;
+	}
+
+	/* TODO: use a compute shader for other cases. */
+
+	/* Software fallback. */
+	map = r600_buffer_map_sync_with_rings(&sctx->b, r600_resource(dst),
+					      PIPE_TRANSFER_WRITE);
+	if (!map)
+		return;
+
+	map += offset;
+	size /= clear_value_size;
+	for (i = 0; i < size; i++) {
+		memcpy(map, clear_value, clear_value_size);
+		map += clear_value_size;
+	}
+}
+
 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;
-- 
2.1.4



More information about the mesa-dev mailing list