From: Dave Airlie <airl...@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

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to