From dcf659735e9927ad2052c9843cb2657703da714d Mon Sep 17 00:00:00 2001 From: Vladislav Mikhalin Date: Fri, 6 Dec 2024 19:55:34 +0300 Subject: [PATCH] handle en/addr separately --- .../frontend/translate/translate.cpp | 18 +++++++--- src/shader_recompiler/runtime_info.h | 10 +++--- .../renderer_vulkan/vk_pipeline_cache.cpp | 36 +++++++++++-------- 3 files changed, 41 insertions(+), 23 deletions(-) diff --git a/src/shader_recompiler/frontend/translate/translate.cpp b/src/shader_recompiler/frontend/translate/translate.cpp index 8e16d848b..df5cf8a1a 100644 --- a/src/shader_recompiler/frontend/translate/translate.cpp +++ b/src/shader_recompiler/frontend/translate/translate.cpp @@ -59,12 +59,22 @@ void Translator::EmitPrologue() { // inputs it can be more For now assume that this isn't the case. dst_vreg = IR::VectorReg::V2; for (u32 i = 0; i < 4; i++) { - if (True(runtime_info.fs_info.en_flags & Shader::PsInputEnableFlags(1 << i))) { - ir.SetVectorReg(dst_vreg++, ir.GetAttribute(IR::Attribute::FragCoord, i)); + if (True(runtime_info.fs_info.addr_flags & Shader::PsInputFlags(1 << i))) { + if (True(runtime_info.fs_info.en_flags & Shader::PsInputFlags(1 << i))) { + ir.SetVectorReg(dst_vreg, ir.GetAttribute(IR::Attribute::FragCoord, i)); + } else { + ir.SetVectorReg(dst_vreg, ir.Imm32(0.0f)); + } + ++dst_vreg; } } - if (True(runtime_info.fs_info.en_flags & Shader::PsInputEnableFlags::FrontFacing)) { - ir.SetVectorReg(dst_vreg++, ir.GetAttributeU32(IR::Attribute::IsFrontFace)); + if (True(runtime_info.fs_info.addr_flags & Shader::PsInputFlags::FrontFacing)) { + if (True(runtime_info.fs_info.en_flags & Shader::PsInputFlags::FrontFacing)) { + ir.SetVectorReg(dst_vreg, ir.GetAttributeU32(IR::Attribute::IsFrontFace)); + } else { + ir.SetVectorReg(dst_vreg, ir.Imm32(0)); + } + ++dst_vreg; } break; case Stage::Compute: diff --git a/src/shader_recompiler/runtime_info.h b/src/shader_recompiler/runtime_info.h index 67ccaf6a8..4819027fc 100644 --- a/src/shader_recompiler/runtime_info.h +++ b/src/shader_recompiler/runtime_info.h @@ -96,7 +96,7 @@ enum class MrtSwizzle : u8 { }; static constexpr u32 MaxColorBuffers = 8; -enum class PsInputEnableFlags : u8 { +enum class PsInputFlags : u8 { None = 0, PosX = 1 << 0, PosY = 1 << 1, @@ -104,7 +104,7 @@ enum class PsInputEnableFlags : u8 { PosW = 1 << 3, FrontFacing = 1 << 4, }; -DECLARE_ENUM_FLAG_OPERATORS(PsInputEnableFlags) +DECLARE_ENUM_FLAG_OPERATORS(PsInputFlags) struct FragmentRuntimeInfo { struct PsInput { @@ -115,7 +115,8 @@ struct FragmentRuntimeInfo { auto operator<=>(const PsInput&) const noexcept = default; }; - PsInputEnableFlags en_flags; + PsInputFlags en_flags; + PsInputFlags addr_flags; u32 num_inputs; std::array inputs; struct PsColorBuffer { @@ -128,7 +129,8 @@ struct FragmentRuntimeInfo { bool operator==(const FragmentRuntimeInfo& other) const noexcept { return std::ranges::equal(color_buffers, other.color_buffers) && - en_flags == other.en_flags && num_inputs == other.num_inputs && + en_flags == other.en_flags && addr_flags == other.addr_flags && + num_inputs == other.num_inputs && std::ranges::equal(inputs.begin(), inputs.begin() + num_inputs, other.inputs.begin(), other.inputs.begin() + num_inputs); } diff --git a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp index 7e7f9c1a8..b321aec82 100644 --- a/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_pipeline_cache.cpp @@ -124,21 +124,27 @@ Shader::RuntimeInfo PipelineCache::BuildRuntimeInfo(Shader::Stage stage) { case Shader::Stage::Fragment: { BuildCommon(regs.ps_program); info.fs_info.en_flags = - ((regs.ps_input_addr.pos_x_float_ena && regs.ps_input_ena.pos_x_float_ena) - ? Shader::PsInputEnableFlags::PosX - : Shader::PsInputEnableFlags::None) | - ((regs.ps_input_addr.pos_y_float_ena && regs.ps_input_ena.pos_y_float_ena) - ? Shader::PsInputEnableFlags::PosY - : Shader::PsInputEnableFlags::None) | - ((regs.ps_input_addr.pos_z_float_ena && regs.ps_input_ena.pos_z_float_ena) - ? Shader::PsInputEnableFlags::PosZ - : Shader::PsInputEnableFlags::None) | - ((regs.ps_input_addr.pos_w_float_ena && regs.ps_input_ena.pos_w_float_ena) - ? Shader::PsInputEnableFlags::PosW - : Shader::PsInputEnableFlags::None) | - ((regs.ps_input_addr.front_face_ena && regs.ps_input_ena.front_face_ena) - ? Shader::PsInputEnableFlags::FrontFacing - : Shader::PsInputEnableFlags::None); + (regs.ps_input_ena.pos_x_float_ena ? Shader::PsInputFlags::PosX + : Shader::PsInputFlags::None) | + (regs.ps_input_ena.pos_y_float_ena ? Shader::PsInputFlags::PosY + : Shader::PsInputFlags::None) | + (regs.ps_input_ena.pos_z_float_ena ? Shader::PsInputFlags::PosZ + : Shader::PsInputFlags::None) | + (regs.ps_input_ena.pos_w_float_ena ? Shader::PsInputFlags::PosW + : Shader::PsInputFlags::None) | + (regs.ps_input_ena.front_face_ena ? Shader::PsInputFlags::FrontFacing + : Shader::PsInputFlags::None); + info.fs_info.addr_flags = + (regs.ps_input_addr.pos_x_float_ena ? Shader::PsInputFlags::PosX + : Shader::PsInputFlags::None) | + (regs.ps_input_addr.pos_y_float_ena ? Shader::PsInputFlags::PosY + : Shader::PsInputFlags::None) | + (regs.ps_input_addr.pos_z_float_ena ? Shader::PsInputFlags::PosZ + : Shader::PsInputFlags::None) | + (regs.ps_input_addr.pos_w_float_ena ? Shader::PsInputFlags::PosW + : Shader::PsInputFlags::None) | + (regs.ps_input_addr.front_face_ena ? Shader::PsInputFlags::FrontFacing + : Shader::PsInputFlags::None); const auto& ps_inputs = regs.ps_inputs; info.fs_info.num_inputs = regs.num_interp; for (u32 i = 0; i < regs.num_interp; i++) {