Преглед изворни кода

gl_shader_decompiler: Move color output to EXIT instruction.

bunnei пре 8 година
родитељ
комит
37fa9a15cd
1 измењених фајлова са 12 додато и 6 уклоњено
  1. 12 6
      src/video_core/renderer_opengl/gl_shader_decompiler.cpp

+ 12 - 6
src/video_core/renderer_opengl/gl_shader_decompiler.cpp

@@ -221,14 +221,11 @@ private:
 
 
     /// Generates code representing a temporary (GPR) register.
     /// Generates code representing a temporary (GPR) register.
     std::string GetRegister(const Register& reg, unsigned elem = 0) {
     std::string GetRegister(const Register& reg, unsigned elem = 0) {
-        if (reg == Register::ZeroIndex)
+        if (reg == Register::ZeroIndex) {
             return "0";
             return "0";
-        if (stage == Maxwell3D::Regs::ShaderStage::Fragment && reg < 4) {
-            // GPRs 0-3 are output color for the fragment shader
-            return std::string{"color."} + "rgba"[(reg + elem) & 3];
         }
         }
-
-        return *declr_register.insert("register_" + std::to_string(reg + elem)).first;
+        return *declr_register.insert("register_" + std::to_string(reg.GetSwizzledIndex(elem)))
+                    .first;
     }
     }
 
 
     /// Generates code representing a uniform (C buffer) register.
     /// Generates code representing a uniform (C buffer) register.
@@ -628,6 +625,15 @@ private:
             case OpCode::Id::EXIT: {
             case OpCode::Id::EXIT: {
                 ASSERT_MSG(instr.pred.pred_index == static_cast<u64>(Pred::UnusedIndex),
                 ASSERT_MSG(instr.pred.pred_index == static_cast<u64>(Pred::UnusedIndex),
                            "Predicated exits not implemented");
                            "Predicated exits not implemented");
+
+                // Final color output is currently hardcoded to GPR0-3 for fragment shaders
+                if (stage == Maxwell3D::Regs::ShaderStage::Fragment) {
+                    shader.AddLine("color.r = " + GetRegister(0) + ";");
+                    shader.AddLine("color.g = " + GetRegister(1) + ";");
+                    shader.AddLine("color.b = " + GetRegister(2) + ";");
+                    shader.AddLine("color.a = " + GetRegister(3) + ";");
+                }
+
                 shader.AddLine("return true;");
                 shader.AddLine("return true;");
                 offset = PROGRAM_END - 1;
                 offset = PROGRAM_END - 1;
                 break;
                 break;