[Mesa-dev] [PATCH 15/21] r600/compute: add support for indirect dispatch

Dave Airlie airlied at gmail.com
Wed Nov 29 04:36:24 UTC 2017


From: Dave Airlie <airlied at redhat.com>

---
 src/gallium/drivers/r600/evergreen_compute.c | 28 ++++++++++++++++++++--------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c
index b976b61..7df1c55 100644
--- a/src/gallium/drivers/r600/evergreen_compute.c
+++ b/src/gallium/drivers/r600/evergreen_compute.c
@@ -630,14 +630,26 @@ static void evergreen_emit_dispatch(struct r600_context *rctx,
 	radeon_compute_set_context_reg(cs, R_0288E8_SQ_LDS_ALLOC,
 					lds_size | (num_waves << 14));
 
-	/* Dispatch packet */
-	radeon_emit(cs, PKT3C(PKT3_DISPATCH_DIRECT, 3, 0));
-	radeon_emit(cs, info->grid[0]);
-	radeon_emit(cs, info->grid[1]);
-	radeon_emit(cs, info->grid[2]);
-	/* VGT_DISPATCH_INITIATOR = COMPUTE_SHADER_EN */
-	radeon_emit(cs, 1);
-
+	if (info->indirect) {
+		struct r600_resource *resource = r600_resource(info->indirect);
+		unsigned reloc = radeon_add_to_buffer_list(&rctx->b, &rctx->b.gfx,
+							   resource,
+							   RADEON_USAGE_READ,
+							   RADEON_PRIO_SHADER_RW_BUFFER);
+		radeon_emit(cs, PKT3C(PKT3_DISPATCH_INDIRECT, 1, 0));
+		radeon_emit(cs, resource->gpu_address + info->indirect_offset);
+		radeon_emit(cs, 1);
+		radeon_emit(cs, PKT3(PKT3_NOP, 0, 0));
+		radeon_emit(cs, reloc);
+	} else {
+		/* Dispatch packet */
+		radeon_emit(cs, PKT3C(PKT3_DISPATCH_DIRECT, 3, 0));
+		radeon_emit(cs, info->grid[0]);
+		radeon_emit(cs, info->grid[1]);
+		radeon_emit(cs, info->grid[2]);
+		/* VGT_DISPATCH_INITIATOR = COMPUTE_SHADER_EN */
+		radeon_emit(cs, 1);
+	}
 	if (rctx->is_debug)
 		eg_trace_emit(rctx);
 }
-- 
2.9.5



More information about the mesa-dev mailing list