summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2020-03-16 01:03:54 +0100
committerReinUsesLisp <reinuseslisp@airmail.cc>2020-03-16 01:03:59 +0100
commit5afc397d52f71e0831fee72d6e1aca3683a3a0ef (patch)
tree3227d732197b47662f5bc3ff3026849f4bbaeeb6
parentshader/shader_ir: Track usage in input attribute and of legacy varyings (diff)
downloadyuzu-5afc397d52f71e0831fee72d6e1aca3683a3a0ef.tar
yuzu-5afc397d52f71e0831fee72d6e1aca3683a3a0ef.tar.gz
yuzu-5afc397d52f71e0831fee72d6e1aca3683a3a0ef.tar.bz2
yuzu-5afc397d52f71e0831fee72d6e1aca3683a3a0ef.tar.lz
yuzu-5afc397d52f71e0831fee72d6e1aca3683a3a0ef.tar.xz
yuzu-5afc397d52f71e0831fee72d6e1aca3683a3a0ef.tar.zst
yuzu-5afc397d52f71e0831fee72d6e1aca3683a3a0ef.zip
-rw-r--r--src/video_core/renderer_opengl/gl_shader_decompiler.cpp63
1 files changed, 57 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 3adf7f0cb..f53d7021e 100644
--- a/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
+++ b/src/video_core/renderer_opengl/gl_shader_decompiler.cpp
@@ -366,10 +366,19 @@ constexpr bool IsGenericAttribute(Attribute::Index index) {
return index >= Attribute::Index::Attribute_0 && index <= Attribute::Index::Attribute_31;
}
+constexpr bool IsLegacyTexCoord(Attribute::Index index) {
+ return static_cast<int>(index) >= static_cast<int>(Attribute::Index::TexCoord_0) &&
+ static_cast<int>(index) <= static_cast<int>(Attribute::Index::TexCoord_7);
+}
+
constexpr Attribute::Index ToGenericAttribute(u64 value) {
return static_cast<Attribute::Index>(value + static_cast<u64>(Attribute::Index::Attribute_0));
}
+constexpr int GetLegacyTexCoordIndex(Attribute::Index index) {
+ return static_cast<int>(index) - static_cast<int>(Attribute::Index::TexCoord_0);
+}
+
u32 GetGenericAttributeIndex(Attribute::Index index) {
ASSERT(IsGenericAttribute(index));
return static_cast<u32>(index) - static_cast<u32>(Attribute::Index::Attribute_0);
@@ -502,7 +511,7 @@ private:
if (!identifier.empty()) {
code.AddLine("// {}", identifier);
}
- code.AddLine("#version 440 core");
+ code.AddLine("#version 440 {}", ir.UsesLegacyVaryings() ? "compatibility" : "core");
code.AddLine("#extension GL_ARB_separate_shader_objects : enable");
if (device.HasShaderBallot()) {
code.AddLine("#extension GL_ARB_shader_ballot : require");
@@ -564,6 +573,16 @@ private:
if (stage != ShaderType::Fragment) {
return;
}
+ if (ir.UsesLegacyVaryings()) {
+ code.AddLine("in gl_PerFragment {{");
+ ++code.scope;
+ code.AddLine("vec4 gl_TexCoord[8];");
+ code.AddLine("vec4 gl_Color;");
+ code.AddLine("vec4 gl_SecondaryColor;");
+ --code.scope;
+ code.AddLine("}};");
+ }
+
for (u32 rt = 0; rt < Maxwell::NumRenderTargets; ++rt) {
code.AddLine("layout (location = {}) out vec4 frag_color{};", rt, rt);
}
@@ -628,6 +647,14 @@ private:
code.AddLine("int gl_VertexID;");
}
+ if (ir.UsesLegacyVaryings()) {
+ code.AddLine("vec4 gl_TexCoord[8];");
+ code.AddLine("vec4 gl_FrontColor;");
+ code.AddLine("vec4 gl_FrontSecondaryColor;");
+ code.AddLine("vec4 gl_BackColor;");
+ code.AddLine("vec4 gl_BackSecondaryColor;");
+ }
+
--code.scope;
code.AddLine("}};");
code.AddNewLine();
@@ -1131,6 +1158,10 @@ private:
default:
UNREACHABLE();
}
+ case Attribute::Index::FrontColor:
+ return {"gl_Color"s + GetSwizzle(element), Type::Float};
+ case Attribute::Index::FrontSecondaryColor:
+ return {"gl_SecondaryColor"s + GetSwizzle(element), Type::Float};
case Attribute::Index::PointCoord:
switch (element) {
case 0:
@@ -1171,6 +1202,12 @@ private:
return {GeometryPass(GetGenericInputAttribute(attribute)) + GetSwizzle(element),
Type::Float};
}
+ if (IsLegacyTexCoord(attribute)) {
+ UNIMPLEMENTED_IF(stage == ShaderType::Geometry);
+ return {fmt::format("gl_TexCoord[{}]{}", GetLegacyTexCoordIndex(attribute),
+ GetSwizzle(element)),
+ Type::Float};
+ }
break;
}
UNIMPLEMENTED_MSG("Unhandled input attribute: {}", static_cast<u32>(attribute));
@@ -1209,11 +1246,12 @@ private:
}
std::optional<Expression> GetOutputAttribute(const AbufNode* abuf) {
+ const u32 element = abuf->GetElement();
switch (const auto attribute = abuf->GetIndex()) {
case Attribute::Index::Position:
- return {{"gl_Position"s + GetSwizzle(abuf->GetElement()), Type::Float}};
+ return {{"gl_Position"s + GetSwizzle(element), Type::Float}};
case Attribute::Index::LayerViewportPointSize:
- switch (abuf->GetElement()) {
+ switch (element) {
case 0:
UNIMPLEMENTED();
return {};
@@ -1231,13 +1269,26 @@ private:
return {{"gl_PointSize", Type::Float}};
}
return {};
+ case Attribute::Index::FrontColor:
+ return {{"gl_FrontColor"s + GetSwizzle(element), Type::Float}};
+ case Attribute::Index::FrontSecondaryColor:
+ return {{"gl_FrontSecondaryColor"s + GetSwizzle(element), Type::Float}};
+ case Attribute::Index::BackColor:
+ return {{"gl_BackColor"s + GetSwizzle(element), Type::Float}};
+ case Attribute::Index::BackSecondaryColor:
+ return {{"gl_BackSecondaryColor"s + GetSwizzle(element), Type::Float}};
case Attribute::Index::ClipDistances0123:
- return {{fmt::format("gl_ClipDistance[{}]", abuf->GetElement()), Type::Float}};
+ return {{fmt::format("gl_ClipDistance[{}]", element), Type::Float}};
case Attribute::Index::ClipDistances4567:
- return {{fmt::format("gl_ClipDistance[{}]", abuf->GetElement() + 4), Type::Float}};
+ return {{fmt::format("gl_ClipDistance[{}]", element + 4), Type::Float}};
default:
if (IsGenericAttribute(attribute)) {
- return {{GetGenericOutputAttribute(attribute, abuf->GetElement()), Type::Float}};
+ return {{GetGenericOutputAttribute(attribute, element), Type::Float}};
+ }
+ if (IsLegacyTexCoord(attribute)) {
+ return {{fmt::format("gl_TexCoord[{}]{}", GetLegacyTexCoordIndex(attribute),
+ GetSwizzle(element)),
+ Type::Float}};
}
UNIMPLEMENTED_MSG("Unhandled output attribute: {}", static_cast<u32>(attribute));
return {};