[Mesa-dev] [PATCH 7/7] radeonsi: fix a compute shader hang with big threadgroups on SI & CI
Marek Olšák
maraeo at gmail.com
Fri Jun 24 12:15:43 UTC 2016
From: Marek Olšák <marek.olsak at amd.com>
ported from Vulkan
Cc: 12.0 <mesa-stable at lists.freedesktop.org>
---
src/gallium/drivers/radeonsi/si_compute.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/src/gallium/drivers/radeonsi/si_compute.c b/src/gallium/drivers/radeonsi/si_compute.c
index 2f7e172..f19e830 100644
--- a/src/gallium/drivers/radeonsi/si_compute.c
+++ b/src/gallium/drivers/radeonsi/si_compute.c
@@ -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;
}
--
2.7.4
More information about the mesa-dev
mailing list