diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2021-10-18 20:24:15 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-10-18 20:24:15 -0300 |
| commit | 63f1663fa959d8809d1762d99e9364565ba9b3d8 (patch) | |
| tree | 4317d6067048cbd912eed16b563b76d6b9ab6cfe /Ryujinx.Graphics.Shader/Translation/Rewriter.cs | |
| parent | 052deebf26beb5e62e677e8d31c2eb024beaa82f (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.cs | 27 |
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++) |
