radeonsi: add return value to gfx10_ngg_calculate_subgroup_info
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Tue, 9 Jun 2020 10:23:04 +0000 (12:23 +0200)
committerPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Wed, 10 Jun 2020 07:33:48 +0000 (09:33 +0200)
gfx10_ngg_calculate_subgroup_info uses assert to detect invalid configuration,
but if asserts are disabled it will continue its execution.

This commits adds a boolean return value to let the caller know that something
went wrong and that the results mustn't be used.

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3103
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5401>

src/gallium/drivers/radeonsi/gfx10_shader_ngg.c
src/gallium/drivers/radeonsi/si_shader.c
src/gallium/drivers/radeonsi/si_shader_internal.h

index 06eba4a1f61f2bcab2613771833aa6e373b5c427..62aa8b4fb6693e02ffd077688d25077df65df77c 100644 (file)
@@ -1884,7 +1884,7 @@ static void clamp_gsprims_to_esverts(unsigned *max_gsprims, unsigned max_esverts
  * This happens before the shader is uploaded, since LDS relocations during
  * upload depend on the subgroup size.
  */
-void gfx10_ngg_calculate_subgroup_info(struct si_shader *shader)
+bool gfx10_ngg_calculate_subgroup_info(struct si_shader *shader)
 {
    const struct si_shader_selector *gs_sel = shader->selector;
    const struct si_shader_selector *es_sel =
@@ -2047,4 +2047,9 @@ void gfx10_ngg_calculate_subgroup_info(struct si_shader *shader)
    shader->ngg.ngg_emit_size = max_gsprims * gsprim_lds_size;
 
    assert(shader->ngg.hw_max_esverts >= 24); /* HW limitation */
+
+   /* If asserts are disabled, we use the same conditions to return false */
+   return max_esverts >= max_verts_per_prim && max_gsprims >= 1 &&
+          max_out_vertices <= 256 &&
+          shader->ngg.hw_max_esverts >= 24;
 }
index 011abed49f325941d89dd1104f637a366551e8ba..cec837d6ebaa6bed1f9bb68647a922110bce9e66 100644 (file)
@@ -2502,7 +2502,10 @@ bool si_create_shader_variant(struct si_screen *sscreen, struct ac_llvm_compiler
 
    if (shader->key.as_ngg) {
       assert(!shader->key.as_es && !shader->key.as_ls);
-      gfx10_ngg_calculate_subgroup_info(shader);
+      if (!gfx10_ngg_calculate_subgroup_info(shader)) {
+         fprintf(stderr, "Failed to compute subgroup info\n");
+         return false;
+      }
    } else if (sscreen->info.chip_class >= GFX9 && sel->type == PIPE_SHADER_GEOMETRY) {
       gfx9_get_gs_info(shader->previous_stage_sel, sel, &shader->gs_info);
    }
index 2aba488b35b4fcef7ebb557c81d6911517fa84b3..f5d6d629f3555b5e85dd0f7347b5e80747522281 100644 (file)
@@ -219,7 +219,7 @@ void gfx10_emit_ngg_epilogue(struct ac_shader_abi *abi, unsigned max_outputs, LL
 void gfx10_ngg_gs_emit_vertex(struct si_shader_context *ctx, unsigned stream, LLVMValueRef *addrs);
 void gfx10_ngg_gs_emit_prologue(struct si_shader_context *ctx);
 void gfx10_ngg_gs_emit_epilogue(struct si_shader_context *ctx);
-void gfx10_ngg_calculate_subgroup_info(struct si_shader *shader);
+bool gfx10_ngg_calculate_subgroup_info(struct si_shader *shader);
 
 /* si_shader_llvm.c */
 bool si_compile_llvm(struct si_screen *sscreen, struct si_shader_binary *binary,