From 297f97a42b83fdf6cfc3789a2e5bb9dff84d6fc9 Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Mon, 20 Mar 2023 11:49:20 +0800 Subject: [PATCH] ac/llvm: vs_rel_patch_id can also be fixed up MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It's currently used when LS store output to LDS. The LS/HS bug fix seems does not affect this case. But we'd better treat it as other fixed args. Reviewed-by: Marek Olšák Signed-off-by: Qiang Yu Part-of: --- src/amd/llvm/ac_nir_to_llvm.c | 4 ++-- src/amd/llvm/ac_shader_abi.h | 1 + src/amd/vulkan/radv_nir_to_llvm.c | 8 +++----- src/gallium/drivers/radeonsi/si_shader_llvm.c | 2 ++ 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c index 129ec5f9eab..8d0d3d6ab6b 100644 --- a/src/amd/llvm/ac_nir_to_llvm.c +++ b/src/amd/llvm/ac_nir_to_llvm.c @@ -2907,8 +2907,8 @@ static LLVMValueRef visit_load_local_invocation_index(struct ac_nir_context *ctx ac_unpack_param(&ctx->ac, ac_get_arg(&ctx->ac, ctx->args->tcs_wave_id), 0, 3), LLVMConstInt(ctx->ac.i32, ctx->ac.wave_size, 0), ac_get_thread_id(&ctx->ac)); - } else if (ctx->args->vs_rel_patch_id.used) { - return ac_get_arg(&ctx->ac, ctx->args->vs_rel_patch_id); + } else if (ctx->abi->vs_rel_patch_id) { + return ctx->abi->vs_rel_patch_id; } else if (ctx->args->merged_wave_info.used) { /* Thread ID in threadgroup in merged ESGS. */ LLVMValueRef wave_id = ac_unpack_param(&ctx->ac, ac_get_arg(&ctx->ac, ctx->args->merged_wave_info), 24, 4); diff --git a/src/amd/llvm/ac_shader_abi.h b/src/amd/llvm/ac_shader_abi.h index 6a84e685127..ee56be08395 100644 --- a/src/amd/llvm/ac_shader_abi.h +++ b/src/amd/llvm/ac_shader_abi.h @@ -44,6 +44,7 @@ struct ac_shader_abi { /* These input registers sometimes need to be fixed up. */ LLVMValueRef vertex_id; + LLVMValueRef vs_rel_patch_id; LLVMValueRef instance_id; LLVMValueRef persp_centroid, linear_centroid; LLVMValueRef color0, color1; diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c index b5aab118742..7f2e31bc0f8 100644 --- a/src/amd/vulkan/radv_nir_to_llvm.c +++ b/src/amd/vulkan/radv_nir_to_llvm.c @@ -56,8 +56,6 @@ struct radv_shader_context { LLVMValueRef descriptor_sets[MAX_SETS]; - LLVMValueRef vs_rel_patch_id; - LLVMValueRef gs_wave_id; uint64_t output_mask; @@ -626,9 +624,9 @@ ac_nir_fixup_ls_hs_input_vgprs(struct radv_shader_context *ctx) ctx->abi.instance_id = LLVMBuildSelect(ctx->ac.builder, hs_empty, ac_get_arg(&ctx->ac, ctx->args->ac.vertex_id), ctx->abi.instance_id, ""); - ctx->vs_rel_patch_id = + ctx->abi.vs_rel_patch_id = LLVMBuildSelect(ctx->ac.builder, hs_empty, ac_get_arg(&ctx->ac, ctx->args->ac.tcs_rel_ids), - ctx->vs_rel_patch_id, ""); + ctx->abi.vs_rel_patch_id, ""); ctx->abi.vertex_id = LLVMBuildSelect(ctx->ac.builder, hs_empty, ac_get_arg(&ctx->ac, ctx->args->ac.tcs_patch_id), ctx->abi.vertex_id, ""); @@ -744,7 +742,7 @@ ac_translate_nir_to_llvm(struct ac_llvm_compiler *ac_llvm, if (args->ac.vertex_id.used) ctx.abi.vertex_id = ac_get_arg(&ctx.ac, args->ac.vertex_id); if (args->ac.vs_rel_patch_id.used) - ctx.vs_rel_patch_id = ac_get_arg(&ctx.ac, args->ac.vs_rel_patch_id); + ctx.abi.vs_rel_patch_id = ac_get_arg(&ctx.ac, args->ac.vs_rel_patch_id); if (args->ac.instance_id.used) ctx.abi.instance_id = ac_get_arg(&ctx.ac, args->ac.instance_id); diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c b/src/gallium/drivers/radeonsi/si_shader_llvm.c index 304d626ca0c..af2717780bc 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c @@ -244,6 +244,8 @@ void si_llvm_create_main_func(struct si_shader_context *ctx) if (ctx->stage == MESA_SHADER_VERTEX) { ctx->abi.vertex_id = ac_get_arg(&ctx->ac, ctx->args->ac.vertex_id); ctx->abi.instance_id = ac_get_arg(&ctx->ac, ctx->args->ac.instance_id); + if (ctx->args->ac.vs_rel_patch_id.used) + ctx->abi.vs_rel_patch_id = ac_get_arg(&ctx->ac, ctx->args->ac.vs_rel_patch_id); } else if (ctx->stage == MESA_SHADER_FRAGMENT) { ctx->abi.persp_centroid = ac_get_arg(&ctx->ac, ctx->args->ac.persp_centroid); ctx->abi.linear_centroid = ac_get_arg(&ctx->ac, ctx->args->ac.linear_centroid);