diff options
author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-04-30 05:18:28 +0200 |
---|---|---|
committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-05-03 02:46:25 +0200 |
commit | b7d412c99bb42291dca616910a269dabca7a3938 (patch) | |
tree | a2f3f07a0885f159d0f9cd54ff38c616798c981c /src/video_core/renderer_opengl | |
parent | gl_shader_decompiler: Declare all possible varyings on physical attribute usage (diff) | |
download | yuzu-b7d412c99bb42291dca616910a269dabca7a3938.tar yuzu-b7d412c99bb42291dca616910a269dabca7a3938.tar.gz yuzu-b7d412c99bb42291dca616910a269dabca7a3938.tar.bz2 yuzu-b7d412c99bb42291dca616910a269dabca7a3938.tar.lz yuzu-b7d412c99bb42291dca616910a269dabca7a3938.tar.xz yuzu-b7d412c99bb42291dca616910a269dabca7a3938.tar.zst yuzu-b7d412c99bb42291dca616910a269dabca7a3938.zip |
Diffstat (limited to 'src/video_core/renderer_opengl')
-rw-r--r-- | src/video_core/renderer_opengl/gl_shader_decompiler.cpp | 55 |
1 files changed, 26 insertions, 29 deletions
diff --git a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp index 8df91a4c6..1ad33107d 100644 --- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp +++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp @@ -134,6 +134,19 @@ bool IsPrecise(Node node) { return false; } +constexpr bool IsGenericAttribute(Attribute::Index index) { + return index >= Attribute::Index::Attribute_0 && index <= Attribute::Index::Attribute_31; +} + +constexpr Attribute::Index ToGenericAttribute(u32 value) { + return static_cast<Attribute::Index>(value + static_cast<u32>(Attribute::Index::Attribute_0)); +} + +u32 GetGenericAttributeIndex(Attribute::Index index) { + ASSERT(IsGenericAttribute(index)); + return static_cast<u32>(index) - static_cast<u32>(Attribute::Index::Attribute_0); +} + class GLSLDecompiler final { public: explicit GLSLDecompiler(const Device& device, const ShaderIR& ir, ShaderStage stage, @@ -320,9 +333,7 @@ private: const u32 num_inputs{stage == ShaderStage::Vertex ? GetNumPhysicalAttributes() : GetNumPhysicalVaryings()}; for (u32 i = 0; i < num_inputs; ++i) { - constexpr auto generic_base{static_cast<u32>(Attribute::Index::Attribute_0)}; - const auto index{static_cast<Attribute::Index>(generic_base + i)}; - DeclareInputAttribute(index); + DeclareInputAttribute(ToGenericAttribute(i)); } code.AddNewLine(); return; @@ -330,24 +341,22 @@ private: const auto& attributes = ir.GetInputAttributes(); for (const auto index : attributes) { - if (index < Attribute::Index::Attribute_0 || index > Attribute::Index::Attribute_31) { - // Skip when it's not a generic attribute - continue; + if (IsGenericAttribute(index)) { + DeclareInputAttribute(index); } - DeclareInputAttribute(index); } if (!attributes.empty()) code.AddNewLine(); } void DeclareInputAttribute(Attribute::Index index) { - const u32 generic_index{static_cast<u32>(index) - - static_cast<u32>(Attribute::Index::Attribute_0)}; + const u32 generic_index{GetGenericAttributeIndex(index)}; std::string name{GetInputAttribute(index)}; if (stage == ShaderStage::Geometry) { name = "gs_" + name + "[]"; } + std::string suffix; if (stage == ShaderStage::Fragment) { const auto input_mode{header.ps.GetAttributeUse(generic_index)}; @@ -367,9 +376,7 @@ private: void DeclareOutputAttributes() { if (ir.HasPhysicalAttributes()) { for (u32 i = 0; i < GetNumPhysicalVaryings(); ++i) { - constexpr auto generic_base{static_cast<u32>(Attribute::Index::Attribute_0)}; - const auto index{static_cast<Attribute::Index>(generic_base + i)}; - DeclareOutputAttribute(index); + DeclareOutputAttribute(ToGenericAttribute(i)); } code.AddNewLine(); return; @@ -377,20 +384,16 @@ private: const auto& attributes = ir.GetOutputAttributes(); for (const auto index : attributes) { - if (index < Attribute::Index::Attribute_0 || index > Attribute::Index::Attribute_31) { - // Skip when it's not a generic attribute - continue; + if (IsGenericAttribute(index)) { + DeclareOutputAttribute(index); } - DeclareOutputAttribute(index); } if (!attributes.empty()) code.AddNewLine(); } void DeclareOutputAttribute(Attribute::Index index) { - const auto location{static_cast<u32>(index) - - static_cast<u32>(Attribute::Index::Attribute_0) + - GENERIC_VARYING_START_LOCATION}; + const u32 location{GetGenericAttributeIndex(index) + GENERIC_VARYING_START_LOCATION}; code.AddLine("layout (location = " + std::to_string(location) + ") out vec4 " + GetOutputAttribute(index) + ';'); } @@ -569,8 +572,7 @@ private: UNIMPLEMENTED_MSG("Unmanaged FrontFacing element={}", element); return "0"; default: - if (attribute >= Attribute::Index::Attribute_0 && - attribute <= Attribute::Index::Attribute_31) { + if (IsGenericAttribute(attribute)) { return GeometryPass(GetInputAttribute(attribute)) + GetSwizzle(element); } break; @@ -873,8 +875,7 @@ private: case Attribute::Index::ClipDistances4567: return "gl_ClipDistance[" + std::to_string(abuf->GetElement() + 4) + ']'; default: - if (attribute >= Attribute::Index::Attribute_0 && - attribute <= Attribute::Index::Attribute_31) { + if (IsGenericAttribute(attribute)) { return GetOutputAttribute(attribute) + GetSwizzle(abuf->GetElement()); } UNIMPLEMENTED_MSG("Unhandled output attribute: {}", @@ -1631,15 +1632,11 @@ private: } std::string GetInputAttribute(Attribute::Index attribute) const { - const auto index{static_cast<u32>(attribute) - - static_cast<u32>(Attribute::Index::Attribute_0)}; - return GetDeclarationWithSuffix(index, "input_attr"); + return GetDeclarationWithSuffix(GetGenericAttributeIndex(attribute), "input_attr"); } std::string GetOutputAttribute(Attribute::Index attribute) const { - const auto index{static_cast<u32>(attribute) - - static_cast<u32>(Attribute::Index::Attribute_0)}; - return GetDeclarationWithSuffix(index, "output_attr"); + return GetDeclarationWithSuffix(GetGenericAttributeIndex(attribute), "output_attr"); } std::string GetConstBuffer(u32 index) const { |