Mesa (master): radeonsi: merge TCS and TCS epilog conditional blocks

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Nov 23 03:15:54 UTC 2020


Module: Mesa
Branch: master
Commit: a56e92c79e35a44590e20a5b9032b0a29db80c73
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a56e92c79e35a44590e20a5b9032b0a29db80c73

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Sat Nov 14 00:36:51 2020 -0500

radeonsi: merge TCS and TCS epilog conditional blocks

Instead of:
    if (TCS) {
       TCS;
    }
    if (TCS && epilog) {
       epilog;
    }

Do:
    if (TCS) {
	TCS;
	if (epilog) {
	    epilog;
    }

Only monolithic shaders can do it.

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7623>

---

 src/gallium/drivers/radeonsi/si_shader.c           | 22 ++++++++++++++++------
 src/gallium/drivers/radeonsi/si_shader_llvm.c      | 16 ++++++++++++++++
 src/gallium/drivers/radeonsi/si_shader_llvm_tess.c |  2 +-
 3 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index 1e5742f2a7e..fbeed398a28 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -1450,7 +1450,7 @@ static bool si_build_main_function(struct si_shader_context *ctx, struct si_shad
          si_init_exec_from_input(ctx, ctx->merged_wave_info, 0);
       } else if (ctx->stage == MESA_SHADER_TESS_CTRL || ctx->stage == MESA_SHADER_GEOMETRY ||
                  (shader->key.as_ngg && !shader->key.as_es)) {
-         LLVMValueRef thread_enabled;
+         LLVMValueRef thread_enabled = NULL;
          bool nested_barrier;
 
          if (!shader->is_monolithic || (ctx->stage == MESA_SHADER_TESS_EVAL && shader->key.as_ngg &&
@@ -1468,8 +1468,16 @@ static bool si_build_main_function(struct si_shader_context *ctx, struct si_shad
                gfx10_ngg_build_export_prim(ctx, NULL, NULL);
          }
 
-         if (ctx->stage == MESA_SHADER_TESS_CTRL || ctx->stage == MESA_SHADER_GEOMETRY) {
-            if (ctx->stage == MESA_SHADER_GEOMETRY && shader->key.as_ngg) {
+         if (ctx->stage == MESA_SHADER_TESS_CTRL) {
+            nested_barrier = true;
+            /* The wrapper inserts the conditional for monolithic shaders,
+             * and if this is a monolithic shader, we are already inside
+             * the conditional, so don't insert it.
+             */
+            if (!shader->is_monolithic)
+               thread_enabled = si_is_gs_thread(ctx); /* 2nd shader thread really */
+         } else if (ctx->stage == MESA_SHADER_GEOMETRY) {
+            if (shader->key.as_ngg) {
                gfx10_ngg_gs_emit_prologue(ctx);
                nested_barrier = false;
             } else {
@@ -1482,9 +1490,11 @@ static bool si_build_main_function(struct si_shader_context *ctx, struct si_shad
             nested_barrier = false;
          }
 
-         ctx->merged_wrap_if_entry_block = LLVMGetInsertBlock(ctx->ac.builder);
-         ctx->merged_wrap_if_label = 11500;
-         ac_build_ifcc(&ctx->ac, thread_enabled, ctx->merged_wrap_if_label);
+         if (thread_enabled) {
+            ctx->merged_wrap_if_entry_block = LLVMGetInsertBlock(ctx->ac.builder);
+            ctx->merged_wrap_if_label = 11500;
+            ac_build_ifcc(&ctx->ac, thread_enabled, ctx->merged_wrap_if_label);
+         }
 
          if (nested_barrier) {
             /* Execute a barrier before the second shader in
diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c b/src/gallium/drivers/radeonsi/si_shader_llvm.c
index f3ffee660f8..d327e8a524d 100644
--- a/src/gallium/drivers/radeonsi/si_shader_llvm.c
+++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c
@@ -689,6 +689,18 @@ void si_build_wrapper_function(struct si_shader_context *ctx, LLVMValueRef *part
          memcpy(out, initial, sizeof(initial));
          num_out = initial_num_out;
          num_out_sgpr = initial_num_out_sgpr;
+
+         /* Execute the second shader conditionally based on the number of
+          * enabled threads there.
+          */
+         if (ctx->stage == MESA_SHADER_TESS_CTRL) {
+            LLVMValueRef ena, count = initial[3];
+
+            count = LLVMBuildLShr(builder, count, LLVMConstInt(ctx->ac.i32, 8, 0), "");
+            count = LLVMBuildAnd(builder, count, LLVMConstInt(ctx->ac.i32, 0x7f, 0), "");
+            ena = LLVMBuildICmp(builder, LLVMIntULT, ac_get_thread_id(&ctx->ac), count, "");
+            ac_build_ifcc(&ctx->ac, ena, 6507);
+         }
          continue;
       }
 
@@ -716,6 +728,10 @@ void si_build_wrapper_function(struct si_shader_context *ctx, LLVMValueRef *part
       }
    }
 
+   /* Close the conditional wrapping the second shader. */
+   if (ctx->stage == MESA_SHADER_TESS_CTRL && si_is_multi_part_shader(ctx->shader))
+      ac_build_endif(&ctx->ac, 6507);
+
    /* Return the value from the last part. */
    if (LLVMGetTypeKind(LLVMTypeOf(ret)) == LLVMVoidTypeKind)
       LLVMBuildRetVoid(builder);
diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c b/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c
index 112e4486b79..bedab127e1a 100644
--- a/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c
+++ b/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c
@@ -846,7 +846,7 @@ static void si_llvm_emit_tcs_epilogue(struct ac_shader_abi *abi, unsigned max_ou
    invocation_id = si_unpack_param(ctx, ctx->args.tcs_rel_ids, 8, 5);
    tf_lds_offset = get_tcs_out_current_patch_data_offset(ctx);
 
-   if (ctx->screen->info.chip_class >= GFX9) {
+   if (ctx->screen->info.chip_class >= GFX9 && !ctx->shader->is_monolithic) {
       LLVMBasicBlockRef blocks[2] = {LLVMGetInsertBlock(builder), ctx->merged_wrap_if_entry_block};
       LLVMValueRef values[2];
 



More information about the mesa-commit mailing list