aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2020-07-28 19:01:11 -0300
committerGitHub <noreply@github.com>2020-07-29 08:01:11 +1000
commit991784868f278b62f7e847321f0cfd7309fe2f79 (patch)
treed861d050233c3c54f8c8dc3dc64d3f4e002ca427 /Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs
parent43c13057da7726c324f2b5d674e5e1308eb1f6a7 (diff)
Fix shader regression on Intel iGPUs by reverting layout changes (#1425)
Diffstat (limited to 'Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs')
-rw-r--r--Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs40
1 files changed, 27 insertions, 13 deletions
diff --git a/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs b/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs
index 4ae9a00a..e04ce649 100644
--- a/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs
+++ b/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs
@@ -92,18 +92,18 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
return name;
}
- public string GetExpression(AstOperand operand, ShaderStage stage)
+ public string GetExpression(AstOperand operand, ShaderConfig config)
{
switch (operand.Type)
{
case OperandType.Attribute:
- return GetAttributeName(operand, stage);
+ return GetAttributeName(operand, config);
case OperandType.Constant:
return NumberFormatter.FormatInt(operand.Value);
case OperandType.ConstantBuffer:
- return GetConstantBufferName(operand.CbufSlot, operand.CbufOffset, stage);
+ return GetConstantBufferName(operand.CbufSlot, operand.CbufOffset, config.Stage);
case OperandType.LocalVariable:
return _locals[operand];
@@ -148,12 +148,12 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
return GetVec4Indexed(ubName + index0, offsetExpr + " & 3");
}
- public static string GetOutAttributeName(AstOperand attr, ShaderStage stage)
+ public static string GetOutAttributeName(AstOperand attr, ShaderConfig config)
{
- return GetAttributeName(attr, stage, isOutAttr: true);
+ return GetAttributeName(attr, config, isOutAttr: true);
}
- public static string GetAttributeName(AstOperand attr, ShaderStage stage, bool isOutAttr = false, string indexExpr = "0")
+ public static string GetAttributeName(AstOperand attr, ShaderConfig config, bool isOutAttr = false, string indexExpr = "0")
{
int value = attr.Value;
@@ -167,14 +167,28 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
? DefaultNames.OAttributePrefix
: DefaultNames.IAttributePrefix;
- string name = $"{prefix}{(value >> 4)}_{swzMask}";
-
- if (stage == ShaderStage.Geometry && !isOutAttr)
+ if ((config.Flags & TranslationFlags.Feedback) != 0)
{
- name += $"[{indexExpr}]";
+ string name = $"{prefix}{(value >> 4)}_{swzMask}";
+
+ if (config.Stage == ShaderStage.Geometry && !isOutAttr)
+ {
+ name += $"[{indexExpr}]";
+ }
+
+ return name;
}
+ else
+ {
+ string name = $"{prefix}{(value >> 4)}";
- return name;
+ if (config.Stage == ShaderStage.Geometry && !isOutAttr)
+ {
+ name += $"[{indexExpr}]";
+ }
+
+ return name + '.' + swzMask;
+ }
}
else
{
@@ -187,7 +201,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
else if (_builtInAttributes.TryGetValue(value & ~3, out BuiltInAttribute builtInAttr))
{
// TODO: There must be a better way to handle this...
- if (stage == ShaderStage.Fragment)
+ if (config.Stage == ShaderStage.Fragment)
{
switch (value & ~3)
{
@@ -200,7 +214,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
string name = builtInAttr.Name;
- if (stage == ShaderStage.Geometry && !isOutAttr)
+ if (config.Stage == ShaderStage.Geometry && !isOutAttr)
{
name = $"gl_in[{indexExpr}].{name}";
}