diff --git a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp index 79a947c213..017044dc6d 100644 --- a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp @@ -460,7 +460,9 @@ void FragmentProgramDecompiler::AddCodeCond(const std::string& dst, const std::s } // NOTE: dst = _select(dst, src, cond) is equivalent to dst = cond? src : dst; - const auto cond = ShaderVariable(dst).match_size(GetRawCond()); + const auto dst_var = ShaderVariable(dst); + const auto raw_cond = dst_var.add_mask(GetRawCond()); + const auto cond = dst_var.match_size(raw_cond); AddCode(dst + " = _select(" + dst + ", " + src_prefix + src + ", " + cond + ");"); } diff --git a/rpcs3/Emu/RSX/Common/ShaderParam.h b/rpcs3/Emu/RSX/Common/ShaderParam.h index 9315deaaa0..eec54c2913 100644 --- a/rpcs3/Emu/RSX/Common/ShaderParam.h +++ b/rpcs3/Emu/RSX/Common/ShaderParam.h @@ -311,6 +311,16 @@ public: return result; } } + + std::string add_mask(const std::string& other_var) const + { + if (swizzles.back() != "xyzw") + { + return other_var + "." + swizzles.back(); + } + + return other_var; + } }; struct vertex_reg_info diff --git a/rpcs3/Emu/RSX/Common/VertexProgramDecompiler.cpp b/rpcs3/Emu/RSX/Common/VertexProgramDecompiler.cpp index a7aa58ac19..0b62636f8a 100644 --- a/rpcs3/Emu/RSX/Common/VertexProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Common/VertexProgramDecompiler.cpp @@ -310,7 +310,9 @@ void VertexProgramDecompiler::AddCodeCond(const std::string& dst, const std::str } // NOTE: dst = _select(dst, src, cond) is equivalent to dst = cond? src : dst; - const auto cond = ShaderVariable(dst).match_size(GetRawCond()); + const auto dst_var = ShaderVariable(dst); + const auto raw_cond = dst_var.add_mask(GetRawCond()); + const auto cond = dst_var.match_size(raw_cond); AddCode(dst + " = _select(" + dst + ", " + src + ", " + cond + ");"); }