aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Shader/Translation/Rewriter.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2021-10-18 20:24:15 -0300
committerGitHub <noreply@github.com>2021-10-18 20:24:15 -0300
commit63f1663fa959d8809d1762d99e9364565ba9b3d8 (patch)
tree4317d6067048cbd912eed16b563b76d6b9ab6cfe /Ryujinx.Graphics.Shader/Translation/Rewriter.cs
parent052deebf26beb5e62e677e8d31c2eb024beaa82f (diff)
Fix shader 8-bit and 16-bit STS/STG (#2741)
* Fix 8 and 16-bit STG * Fix 8 and 16-bit STS * Shader cache version bump
Diffstat (limited to 'Ryujinx.Graphics.Shader/Translation/Rewriter.cs')
-rw-r--r--Ryujinx.Graphics.Shader/Translation/Rewriter.cs27
1 files changed, 21 insertions, 6 deletions
diff --git a/Ryujinx.Graphics.Shader/Translation/Rewriter.cs b/Ryujinx.Graphics.Shader/Translation/Rewriter.cs
index 47428520..02a0feda 100644
--- a/Ryujinx.Graphics.Shader/Translation/Rewriter.cs
+++ b/Ryujinx.Graphics.Shader/Translation/Rewriter.cs
@@ -49,7 +49,8 @@ namespace Ryujinx.Graphics.Shader.Translation
Operation operation = (Operation)node.Value;
bool isAtomic = operation.Inst.IsAtomic();
- bool isWrite = isAtomic || operation.Inst == Instruction.StoreGlobal;
+ bool isStg16Or8 = operation.Inst == Instruction.StoreGlobal16 || operation.Inst == Instruction.StoreGlobal8;
+ bool isWrite = isAtomic || operation.Inst == Instruction.StoreGlobal || isStg16Or8;
Operation storageOp;
@@ -95,14 +96,21 @@ namespace Ryujinx.Graphics.Shader.Translation
Operand alignMask = Const(-config.GpuAccessor.QueryHostStorageBufferOffsetAlignment());
- Operand baseAddrTrunc = PrependOperation(Instruction.BitwiseAnd, sbBaseAddrLow, alignMask);
- Operand byteOffset = PrependOperation(Instruction.Subtract, addrLow, baseAddrTrunc);
- Operand wordOffset = PrependOperation(Instruction.ShiftRightU32, byteOffset, Const(2));
+ Operand baseAddrTrunc = PrependOperation(Instruction.BitwiseAnd, sbBaseAddrLow, alignMask);
+ Operand byteOffset = PrependOperation(Instruction.Subtract, addrLow, baseAddrTrunc);
Operand[] sources = new Operand[operation.SourcesCount];
sources[0] = sbSlot;
- sources[1] = wordOffset;
+
+ if (isStg16Or8)
+ {
+ sources[1] = byteOffset;
+ }
+ else
+ {
+ sources[1] = PrependOperation(Instruction.ShiftRightU32, byteOffset, Const(2));
+ }
for (int index = 2; index < operation.SourcesCount; index++)
{
@@ -121,7 +129,14 @@ namespace Ryujinx.Graphics.Shader.Translation
}
else
{
- storageOp = new Operation(Instruction.StoreStorage, null, sources);
+ Instruction storeInst = operation.Inst switch
+ {
+ Instruction.StoreGlobal16 => Instruction.StoreStorage16,
+ Instruction.StoreGlobal8 => Instruction.StoreStorage8,
+ _ => Instruction.StoreStorage
+ };
+
+ storageOp = new Operation(storeInst, null, sources);
}
for (int index = 0; index < operation.SourcesCount; index++)