summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp18
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;