From 40eef6a066e1bf7ca4868e03c94521b4d8ca6e5c Mon Sep 17 00:00:00 2001 From: squidbus <175574877+squidbus@users.noreply.github.com> Date: Mon, 10 Feb 2025 21:33:30 -0800 Subject: [PATCH] shader_recompiler: Exclude defaulted fragment inputs from quad/rect passthrough. (#2383) --- .../backend/spirv/emit_spirv_quad_rect.cpp | 12 ++++++++++-- .../backend/spirv/spirv_emit_context.cpp | 2 +- src/shader_recompiler/runtime_info.h | 4 ++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_quad_rect.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_quad_rect.cpp index 74a807c57..e74044f63 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_quad_rect.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_quad_rect.cpp @@ -254,10 +254,14 @@ private: gl_per_vertex = AddOutput(gl_per_vertex_type); } for (int i = 0; i < fs_info.num_inputs; i++) { + const auto& input = fs_info.inputs[i]; + if (input.IsDefault()) { + continue; + } outputs[i] = AddOutput(model == spv::ExecutionModel::TessellationControl ? TypeArray(vec4_id, Int(4)) : vec4_id); - Decorate(outputs[i], spv::Decoration::Location, fs_info.inputs[i].param_index); + Decorate(outputs[i], spv::Decoration::Location, input.param_index); } } @@ -273,8 +277,12 @@ private: gl_in = AddInput(gl_per_vertex_array); const Id float_arr{TypeArray(vec4_id, Int(32))}; for (int i = 0; i < fs_info.num_inputs; i++) { + const auto& input = fs_info.inputs[i]; + if (input.IsDefault()) { + continue; + } inputs[i] = AddInput(float_arr); - Decorate(inputs[i], spv::Decoration::Location, fs_info.inputs[i].param_index); + Decorate(inputs[i], spv::Decoration::Location, input.param_index); } } diff --git a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp index 2ab5ca05d..4d5e817b4 100644 --- a/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp +++ b/src/shader_recompiler/backend/spirv/spirv_emit_context.cpp @@ -316,7 +316,7 @@ void EmitContext::DefineInputs() { const auto& input = runtime_info.fs_info.inputs[i]; const u32 semantic = input.param_index; ASSERT(semantic < IR::NumParams); - if (input.is_default && !input.is_flat) { + if (input.IsDefault()) { input_params[semantic] = { MakeDefaultValue(*this, input.default_value), input_f32, F32[1], 4, false, true, }; diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index d1ae2c09d..78973c2d4 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -174,6 +174,10 @@ struct FragmentRuntimeInfo { bool is_flat; u8 default_value; + [[nodiscard]] bool IsDefault() const { + return is_default && !is_flat; + } + auto operator<=>(const PsInput&) const noexcept = default; }; AmdGpu::Liverpool::PsInput en_flags;