From 73e68edd09cc322579ec832576f766c836851fdf Mon Sep 17 00:00:00 2001 From: gdk Date: Sun, 24 Nov 2019 19:49:19 -0300 Subject: Revert "Simplify shader uniform buffer access codegen" This reverts commit 2fe9ebaf118d690be8d0cb302529dd359d7c402b. --- .../CodeGen/Glsl/OperandManager.cs | 24 ++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs') diff --git a/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs b/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs index 802b32e1..4c9d5b55 100644 --- a/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs +++ b/Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs @@ -93,7 +93,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl return NumberFormatter.FormatInt(operand.Value); case OperandType.ConstantBuffer: - return GetUniformBufferAccessor(operand.CbufSlot, operand.CbufOffset, stage); + return GetConstantBufferName(operand.CbufSlot, operand.CbufOffset, stage); case OperandType.LocalVariable: return _locals[operand]; @@ -105,16 +105,28 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl throw new ArgumentException($"Invalid operand type \"{operand.Type}\"."); } - public static string GetUniformBufferAccessor(int slot, int offset, ShaderStage stage) + public static string GetConstantBufferName(int slot, int offset, ShaderStage stage) { - return GetUniformBufferAccessor(slot, NumberFormatter.FormatInt(offset), stage); + string ubName = GetUbName(stage, slot); + + ubName += "[" + (offset >> 2) + "]"; + + return ubName + "." + GetSwizzleMask(offset & 3); } - public static string GetUniformBufferAccessor(int slot, string offsetExpr, ShaderStage stage) + public static string GetConstantBufferName(IAstNode slot, string offsetExpr, ShaderStage stage) { - string ubName = GetUbName(stage, slot); + // Non-constant slots are not supported. + // It is expected that upstream stages are never going to generate non-constant + // slot access. + AstOperand operand = (AstOperand)slot; + + string ubName = GetUbName(stage, operand.Value); + + string index0 = "[" + offsetExpr + " >> 2]"; + string index1 = "[" + offsetExpr + " & 3]"; - return $"{ubName}[{offsetExpr}]"; + return ubName + index0 + index1; } public static string GetOutAttributeName(AstOperand attr, ShaderStage stage) -- cgit v1.2.3