diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2020-07-28 19:01:11 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-07-29 08:01:11 +1000 |
| commit | 991784868f278b62f7e847321f0cfd7309fe2f79 (patch) | |
| tree | d861d050233c3c54f8c8dc3dc64d3f4e002ca427 /Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs | |
| parent | 43c13057da7726c324f2b5d674e5e1308eb1f6a7 (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.cs | 40 |
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}"; } |
