aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader/CodeGen
diff options
context:
space:
mode:
authorgdk <gab.dark.100@gmail.com>2019-11-24 19:49:19 -0300
committerThog <thog@protonmail.com>2020-01-09 02:13:00 +0100
commit73e68edd09cc322579ec832576f766c836851fdf (patch)
treee2c1a457666a11427ca3a26d701720bfe508e0e3 /Ryujinx.Graphics.Shader/CodeGen
parent1df78e7ad65459d990fa2dcf391da1296dfd886c (diff)
Revert "Simplify shader uniform buffer access codegen"
This reverts commit 2fe9ebaf118d690be8d0cb302529dd359d7c402b.
Diffstat (limited to 'Ryujinx.Graphics.Shader/CodeGen')
-rw-r--r--Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs6
-rw-r--r--Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs9
-rw-r--r--Ryujinx.Graphics.Shader/CodeGen/Glsl/OperandManager.cs24
3 files changed, 23 insertions, 16 deletions
diff --git a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs
index bedfbaee..e8b44961 100644
--- a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs
+++ b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs
@@ -206,13 +206,13 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
context.CBufferDescriptors.Add(new BufferDescriptor(ubName, cbufSlot));
- context.AppendLine("uniform " + ubName);
+ context.AppendLine("layout (std140) uniform " + ubName);
context.EnterScope();
- string ubSize = "[" + NumberFormatter.FormatInt(Constants.ConstantBufferSize / 4) + "]";
+ string ubSize = "[" + NumberFormatter.FormatInt(Constants.ConstantBufferSize / 16) + "]";
- context.AppendLine("precise float " + OperandManager.GetUbName(context.Config.Stage, cbufSlot) + ubSize + ";");
+ context.AppendLine("vec4 " + OperandManager.GetUbName(context.Config.Stage, cbufSlot) + ubSize + ";");
context.LeaveScope(";");
}
diff --git a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs
index 2d070e08..c535d8fc 100644
--- a/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs
+++ b/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGenMemory.cs
@@ -116,12 +116,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
offsetExpr = Enclose(offsetExpr, src2, Instruction.ShiftRightS32, isLhs: true);
- // TODO: For now this is assumed to be constant
- // (we only use constant slots right now), but we should also
- // support non-constant values, necessary for full LDC implementation.
- int slot = ((AstOperand)src1).Value;
-
- return OperandManager.GetUniformBufferAccessor(slot, offsetExpr, context.Config.Stage);
+ return OperandManager.GetConstantBufferName(src1, offsetExpr, context.Config.Stage);
}
public static string LoadGlobal(CodeGenContext context, AstOperation operation)
@@ -508,7 +503,7 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions
// restrictions.
int ubOffset = GlobalToStorage.GetStorageCbOffset(stage, slot);
- string ubName = OperandManager.GetUniformBufferAccessor(0, ubOffset, stage);
+ string ubName = OperandManager.GetConstantBufferName(0, ubOffset, stage);
offsetExpr = $"{offsetExpr} - int((floatBitsToUint({ubName}) & {mask}) >> 2)";
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)