On 12.07.2016 22:52, Marek Olšák wrote:
From: Marek Olšák <marek.ol...@amd.com>

This patch may be dropped depending on feedback.

Cc: 12.0 <mesa-sta...@lists.freedesktop.org>
---
  src/gallium/drivers/radeonsi/si_shader.c | 33 ++++++++++++++++++++++++++++++++
  1 file changed, 33 insertions(+)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index 79c3496..81d071e 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -6705,6 +6705,39 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,

        radeon_llvm_dispose(&ctx.radeon_bld);

+       /* Validate SGPR and VGPR usage for compute to detect compiler bugs. */

There should probably be some comment about which versions of LLVM are affected.

Apart from this and the comment on patch #1, the series is

Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com>

+       if (sel->type == PIPE_SHADER_COMPUTE) {
+               unsigned *props = sel->info.properties;
+               unsigned wave_size = 64;
+               unsigned max_vgprs = 256;
+               unsigned max_sgprs = sscreen->b.chip_class >= VI ? 800 : 512;
+               unsigned max_sgprs_per_wave = 128;
+               unsigned min_waves_per_cu =
+                       DIV_ROUND_UP(props[TGSI_PROPERTY_CS_FIXED_BLOCK_WIDTH] *
+                                    props[TGSI_PROPERTY_CS_FIXED_BLOCK_HEIGHT] 
*
+                                    props[TGSI_PROPERTY_CS_FIXED_BLOCK_DEPTH],
+                                    wave_size);
+               unsigned min_waves_per_simd = DIV_ROUND_UP(min_waves_per_cu, 4);
+
+               max_vgprs = max_vgprs / min_waves_per_simd;
+               max_sgprs = MIN2(max_sgprs / min_waves_per_simd, 
max_sgprs_per_wave);
+
+               if (shader->config.num_sgprs > max_sgprs ||
+                   shader->config.num_vgprs > max_vgprs) {
+                       fprintf(stderr, "LLVM failed to compile a shader correctly: 
"
+                               "SGPR:VGPR usage is %u:%u, but the hw limit is 
%u:%u\n",
+                               shader->config.num_sgprs, 
shader->config.num_vgprs,
+                               max_sgprs, max_vgprs);
+
+                       /* Just terminate the process, because dependent
+                        * shaders can hang due to bad input data, but use
+                        * the env var to allow shader-db to work.
+                        */
+                       if (!debug_get_bool_option("SI_PASS_BAD_SHADERS", 
false))
+                               exit(0);
+               }
+       }
+
        /* Add the scratch offset to input SGPRs. */
        if (shader->config.scratch_bytes_per_wave)
                shader->info.num_input_sgprs += 1; /* scratch byte offset */

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

Reply via email to