diff options
Diffstat (limited to '')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index 3dffb205d..82fd7a0de 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp | |||
| @@ -221,14 +221,11 @@ private: | |||
| 221 | 221 | ||
| 222 | /// Generates code representing a temporary (GPR) register. | 222 | /// Generates code representing a temporary (GPR) register. |
| 223 | std::string GetRegister(const Register& reg, unsigned elem = 0) { | 223 | std::string GetRegister(const Register& reg, unsigned elem = 0) { |
| 224 | if (reg == Register::ZeroIndex) | 224 | if (reg == Register::ZeroIndex) { |
| 225 | return "0"; | 225 | return "0"; |
| 226 | if (stage == Maxwell3D::Regs::ShaderStage::Fragment && reg < 4) { | ||
| 227 | // GPRs 0-3 are output color for the fragment shader | ||
| 228 | return std::string{"color."} + "rgba"[(reg + elem) & 3]; | ||
| 229 | } | 226 | } |
| 230 | 227 | return *declr_register.insert("register_" + std::to_string(reg.GetSwizzledIndex(elem))) | |
| 231 | return *declr_register.insert("register_" + std::to_string(reg + elem)).first; | 228 | .first; |
| 232 | } | 229 | } |
| 233 | 230 | ||
| 234 | /// Generates code representing a uniform (C buffer) register. | 231 | /// Generates code representing a uniform (C buffer) register. |
| @@ -628,6 +625,15 @@ private: | |||
| 628 | case OpCode::Id::EXIT: { | 625 | case OpCode::Id::EXIT: { |
| 629 | ASSERT_MSG(instr.pred.pred_index == static_cast<u64>(Pred::UnusedIndex), | 626 | ASSERT_MSG(instr.pred.pred_index == static_cast<u64>(Pred::UnusedIndex), |
| 630 | "Predicated exits not implemented"); | 627 | "Predicated exits not implemented"); |
| 628 | |||
| 629 | // Final color output is currently hardcoded to GPR0-3 for fragment shaders | ||
| 630 | if (stage == Maxwell3D::Regs::ShaderStage::Fragment) { | ||
| 631 | shader.AddLine("color.r = " + GetRegister(0) + ";"); | ||
| 632 | shader.AddLine("color.g = " + GetRegister(1) + ";"); | ||
| 633 | shader.AddLine("color.b = " + GetRegister(2) + ";"); | ||
| 634 | shader.AddLine("color.a = " + GetRegister(3) + ";"); | ||
| 635 | } | ||
| 636 | |||
| 631 | shader.AddLine("return true;"); | 637 | shader.AddLine("return true;"); |
| 632 | offset = PROGRAM_END - 1; | 638 | offset = PROGRAM_END - 1; |
| 633 | break; | 639 | break; |