Просмотр исходного кода

ShaderGen: Register id 255 is special and is hardcoded to return 0 (SR_ZERO).

Subv 8 лет назад
Родитель
Сommit
d03fc77475

+ 3 - 0
src/video_core/engines/shader_bytecode.h

@@ -13,6 +13,9 @@ namespace Tegra {
 namespace Shader {
 namespace Shader {
 
 
 struct Register {
 struct Register {
+    // Register 255 is special cased to always be 0
+    static constexpr size_t ZeroIndex = 255;
+
     constexpr Register() = default;
     constexpr Register() = default;
 
 
     constexpr Register(u64 value) : value(value) {}
     constexpr Register(u64 value) : value(value) {}

+ 2 - 0
src/video_core/renderer_opengl/gl_shader_decompiler.cpp

@@ -220,6 +220,8 @@ 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)
+            return "0";
         if (stage == Maxwell3D::Regs::ShaderStage::Fragment && reg < 4) {
         if (stage == Maxwell3D::Regs::ShaderStage::Fragment && reg < 4) {
             // GPRs 0-3 are output color for the fragment shader
             // GPRs 0-3 are output color for the fragment shader
             return std::string{"color."} + "rgba"[(reg + elem) & 3];
             return std::string{"color."} + "rgba"[(reg + elem) & 3];