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