radeonsi: fix a compute shader hang with big threadgroups on SI & CI
authorMarek Olšák <marek.olsak@amd.com>
Fri, 24 Jun 2016 00:22:42 +0000 (02:22 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 24 Jun 2016 14:24:53 +0000 (16:24 +0200)
ported from Vulkan

Cc: 12.0 <mesa-stable@lists.freedesktop.org>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_compute.c

index 2f7e1721c89b98f764326e64a4335a61fc58bf0e..f19e830c58012bcdf82b0eaaf5034c48df900e4e 100644 (file)
@@ -443,6 +443,21 @@ static void si_launch_grid(
        struct si_context *sctx = (struct si_context*)ctx;
        struct si_compute *program = sctx->cs_shader_state.program;
        int i;
+       /* HW bug workaround when CS threadgroups > 256 threads and async
+        * compute isn't used, i.e. only one compute job can run at a time.
+        * If async compute is possible, the threadgroup size must be limited
+        * to 256 threads on all queues to avoid the bug.
+        * Only SI and certain CIK chips are affected.
+        */
+       bool cs_regalloc_hang =
+               (sctx->b.chip_class == SI ||
+                sctx->b.family == CHIP_BONAIRE ||
+                sctx->b.family == CHIP_KABINI) &&
+               info->block[0] * info->block[1] * info->block[2] > 256;
+
+       if (cs_regalloc_hang)
+               sctx->b.flags |= SI_CONTEXT_PS_PARTIAL_FLUSH |
+                                SI_CONTEXT_CS_PARTIAL_FLUSH;
 
        si_decompress_compute_textures(sctx);
 
@@ -493,6 +508,9 @@ static void si_launch_grid(
        sctx->b.num_compute_calls++;
        if (sctx->cs_shader_state.uses_scratch)
                sctx->b.num_spill_compute_calls++;
+
+       if (cs_regalloc_hang)
+               sctx->b.flags |= SI_CONTEXT_CS_PARTIAL_FLUSH;
 }