Module: Mesa Branch: master Commit: a56e92c79e35a44590e20a5b9032b0a29db80c73 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=a56e92c79e35a44590e20a5b9032b0a29db80c73
Author: Marek Olšák <[email protected]> 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 <[email protected]> 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]; _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
