diff options
Diffstat (limited to 'src/shader_recompiler/frontend')
5 files changed, 15 insertions, 2 deletions
diff --git a/src/shader_recompiler/frontend/ir/microinstruction.cpp b/src/shader_recompiler/frontend/ir/microinstruction.cpp index 631446cf7..4a2564f47 100644 --- a/src/shader_recompiler/frontend/ir/microinstruction.cpp +++ b/src/shader_recompiler/frontend/ir/microinstruction.cpp | |||
| @@ -326,6 +326,11 @@ void Inst::AddPhiOperand(Block* predecessor, const Value& value) { | |||
| 326 | phi_args.emplace_back(predecessor, value); | 326 | phi_args.emplace_back(predecessor, value); |
| 327 | } | 327 | } |
| 328 | 328 | ||
| 329 | void Inst::ErasePhiOperand(size_t index) { | ||
| 330 | const auto operand_it{phi_args.begin() + static_cast<ptrdiff_t>(index)}; | ||
| 331 | phi_args.erase(operand_it); | ||
| 332 | } | ||
| 333 | |||
| 329 | void Inst::OrderPhiArgs() { | 334 | void Inst::OrderPhiArgs() { |
| 330 | if (op != Opcode::Phi) { | 335 | if (op != Opcode::Phi) { |
| 331 | throw LogicError("{} is not a Phi instruction", op); | 336 | throw LogicError("{} is not a Phi instruction", op); |
diff --git a/src/shader_recompiler/frontend/ir/value.h b/src/shader_recompiler/frontend/ir/value.h index 947579852..14f6e55bc 100644 --- a/src/shader_recompiler/frontend/ir/value.h +++ b/src/shader_recompiler/frontend/ir/value.h | |||
| @@ -179,9 +179,13 @@ public: | |||
| 179 | 179 | ||
| 180 | /// Get a pointer to the block of a phi argument. | 180 | /// Get a pointer to the block of a phi argument. |
| 181 | [[nodiscard]] Block* PhiBlock(size_t index) const; | 181 | [[nodiscard]] Block* PhiBlock(size_t index) const; |
| 182 | |||
| 182 | /// Add phi operand to a phi instruction. | 183 | /// Add phi operand to a phi instruction. |
| 183 | void AddPhiOperand(Block* predecessor, const Value& value); | 184 | void AddPhiOperand(Block* predecessor, const Value& value); |
| 184 | 185 | ||
| 186 | // Erase the phi operand at the given index. | ||
| 187 | void ErasePhiOperand(size_t index); | ||
| 188 | |||
| 185 | /// Orders the Phi arguments from farthest away to nearest. | 189 | /// Orders the Phi arguments from farthest away to nearest. |
| 186 | void OrderPhiArgs(); | 190 | void OrderPhiArgs(); |
| 187 | 191 | ||
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/exit_program.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/exit_program.cpp index 6cd13ec48..62d20ebe4 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/exit_program.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/exit_program.cpp | |||
| @@ -11,9 +11,13 @@ void ExitFragment(TranslatorVisitor& v) { | |||
| 11 | const ProgramHeader sph{v.env.SPH()}; | 11 | const ProgramHeader sph{v.env.SPH()}; |
| 12 | IR::Reg src_reg{IR::Reg::R0}; | 12 | IR::Reg src_reg{IR::Reg::R0}; |
| 13 | for (u32 render_target = 0; render_target < 8; ++render_target) { | 13 | for (u32 render_target = 0; render_target < 8; ++render_target) { |
| 14 | if (!sph.ps.HasOutputComponents(render_target)) { | ||
| 15 | continue; | ||
| 16 | } | ||
| 14 | const std::array<bool, 4> mask{sph.ps.EnabledOutputComponents(render_target)}; | 17 | const std::array<bool, 4> mask{sph.ps.EnabledOutputComponents(render_target)}; |
| 15 | for (u32 component = 0; component < 4; ++component) { | 18 | for (u32 component = 0; component < 4; ++component) { |
| 16 | if (!mask[component]) { | 19 | if (!mask[component]) { |
| 20 | ++src_reg; | ||
| 17 | continue; | 21 | continue; |
| 18 | } | 22 | } |
| 19 | v.ir.SetFragColor(render_target, component, v.F(src_reg)); | 23 | v.ir.SetFragColor(render_target, component, v.F(src_reg)); |
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_load.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_load.cpp index 57b4f0eee..60732215b 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_load.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_load.cpp | |||
| @@ -132,7 +132,7 @@ void Impl(TranslatorVisitor& v, u64 insn, bool is_bindless) { | |||
| 132 | multisample = v.X(meta_reg++); | 132 | multisample = v.X(meta_reg++); |
| 133 | } | 133 | } |
| 134 | if (tld.clamp != 0) { | 134 | if (tld.clamp != 0) { |
| 135 | throw NotImplementedException("TLD.CL - CLAMP is not implmented"); | 135 | throw NotImplementedException("TLD.CL - CLAMP is not implemented"); |
| 136 | } | 136 | } |
| 137 | IR::TextureInstInfo info{}; | 137 | IR::TextureInstInfo info{}; |
| 138 | info.type.Assign(GetType(tld.type)); | 138 | info.type.Assign(GetType(tld.type)); |
diff --git a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_mipmap_level.cpp b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_mipmap_level.cpp index 311a9e763..f89ce1b68 100644 --- a/src/shader_recompiler/frontend/maxwell/translate/impl/texture_mipmap_level.cpp +++ b/src/shader_recompiler/frontend/maxwell/translate/impl/texture_mipmap_level.cpp | |||
| @@ -81,7 +81,7 @@ void Impl(TranslatorVisitor& v, u64 insn, bool is_bindless) { | |||
| 81 | } const tmml{insn}; | 81 | } const tmml{insn}; |
| 82 | 82 | ||
| 83 | if ((tmml.mask & 0b1100) != 0) { | 83 | if ((tmml.mask & 0b1100) != 0) { |
| 84 | throw NotImplementedException("TMML BA results are not implmented"); | 84 | throw NotImplementedException("TMML BA results are not implemented"); |
| 85 | } | 85 | } |
| 86 | const IR::Value coords{MakeCoords(v, tmml.coord_reg, tmml.type)}; | 86 | const IR::Value coords{MakeCoords(v, tmml.coord_reg, tmml.type)}; |
| 87 | 87 | ||