diff options
| author | bunnei <bunneidev@gmail.com> | 2019-02-24 23:04:22 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-02-24 23:04:22 -0500 | 
| commit | c07987dfab78e32a14ea3cb883f71323c99ad034 (patch) | |
| tree | 1da5948cc12c8261b5e740ce14d3cccee78e0536 /src/video_core/engines | |
| parent | c4243c07cc716505fb5c1c2abbf964a2714b7dec (diff) | |
| parent | 10682ad7e055391757686e91252dabe2832d58cd (diff) | |
Merge pull request #2118 from FernandoS27/ipa-improve
shader_decompiler: Improve Accuracy of Attribute Interpolation.
Diffstat (limited to 'src/video_core/engines')
| -rw-r--r-- | src/video_core/engines/shader_bytecode.h | 6 | ||||
| -rw-r--r-- | src/video_core/engines/shader_header.h | 41 | 
2 files changed, 41 insertions, 6 deletions
diff --git a/src/video_core/engines/shader_bytecode.h b/src/video_core/engines/shader_bytecode.h index 1f425f90b..252592edd 100644 --- a/src/video_core/engines/shader_bytecode.h +++ b/src/video_core/engines/shader_bytecode.h @@ -376,9 +376,9 @@ enum class R2pMode : u64 {  };  enum class IpaInterpMode : u64 { -    Linear = 0, -    Perspective = 1, -    Flat = 2, +    Pass = 0, +    Multiply = 1, +    Constant = 2,      Sc = 3,  }; diff --git a/src/video_core/engines/shader_header.h b/src/video_core/engines/shader_header.h index cf2b76ff6..e86a7f04a 100644 --- a/src/video_core/engines/shader_header.h +++ b/src/video_core/engines/shader_header.h @@ -16,6 +16,13 @@ enum class OutputTopology : u32 {      TriangleStrip = 7,  }; +enum class AttributeUse : u8 { +    Unused = 0, +    Constant = 1, +    Perspective = 2, +    ScreenLinear = 3, +}; +  // Documentation in:  // http://download.nvidia.com/open-gpu-doc/Shader-Program-Header/1/Shader-Program-Header.html#ImapTexture  struct Header { @@ -84,9 +91,15 @@ struct Header {          } vtg;          struct { -            INSERT_PADDING_BYTES(3);  // ImapSystemValuesA -            INSERT_PADDING_BYTES(1);  // ImapSystemValuesB -            INSERT_PADDING_BYTES(32); // ImapGenericVector[32] +            INSERT_PADDING_BYTES(3); // ImapSystemValuesA +            INSERT_PADDING_BYTES(1); // ImapSystemValuesB +            union { +                BitField<0, 2, AttributeUse> x; +                BitField<2, 2, AttributeUse> y; +                BitField<4, 2, AttributeUse> w; +                BitField<6, 2, AttributeUse> z; +                u8 raw; +            } imap_generic_vector[32];              INSERT_PADDING_BYTES(2);  // ImapColor              INSERT_PADDING_BYTES(2);  // ImapSystemValuesC              INSERT_PADDING_BYTES(10); // ImapFixedFncTexture[10] @@ -103,6 +116,28 @@ struct Header {                  const u32 bit = render_target * 4 + component;                  return omap.target & (1 << bit);              } +            AttributeUse GetAttributeIndexUse(u32 attribute, u32 index) const { +                return static_cast<AttributeUse>( +                    (imap_generic_vector[attribute].raw >> (index * 2)) & 0x03); +            } +            AttributeUse GetAttributeUse(u32 attribute) const { +                AttributeUse result = AttributeUse::Unused; +                for (u32 i = 0; i < 4; i++) { +                    const auto index = GetAttributeIndexUse(attribute, i); +                    if (index == AttributeUse::Unused) { +                        continue; +                    } +                    if (result == AttributeUse::Unused || result == index) { +                        result = index; +                        continue; +                    } +                    LOG_CRITICAL(HW_GPU, "Generic Attribute Conflict in Interpolation Mode"); +                    if (index == AttributeUse::Perspective) { +                        result = index; +                    } +                } +                return result; +            }          } ps;      };  | 
