diff options
author | gdkchan <gab.dark.100@gmail.com> | 2024-09-18 15:48:55 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-18 15:48:55 -0300 |
commit | ef81658fbd5b2aa23bf7e71b22a636da9a16c67b (patch) | |
tree | 162068fa579f06f78db9528a5da51627a2e5867c /src/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs | |
parent | 062ef43eb46ffec0ddc441907d38da3cfc235f09 (diff) |
Implement support for shader ATOM.EXCH instruction (#7320)1.1.1394
* Implement support for shader ATOM.EXCH instruction
* Shader cache version bump
* Check type
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs')
-rw-r--r-- | src/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs index 40129252..3fcb821d 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitMemory.cs @@ -222,20 +222,38 @@ namespace Ryujinx.Graphics.Shader.Instructions context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}."); } break; - case AtomOp.And: - if (type == AtomSize.S32 || type == AtomSize.U32) + case AtomOp.Min: + if (type == AtomSize.S32) { - res = context.AtomicAnd(storageKind, e0, e1, value); + res = context.AtomicMinS32(storageKind, e0, e1, value); + } + else if (type == AtomSize.U32) + { + res = context.AtomicMinU32(storageKind, e0, e1, value); } else { context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}."); } break; - case AtomOp.Xor: + case AtomOp.Max: + if (type == AtomSize.S32) + { + res = context.AtomicMaxS32(storageKind, e0, e1, value); + } + else if (type == AtomSize.U32) + { + res = context.AtomicMaxU32(storageKind, e0, e1, value); + } + else + { + context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}."); + } + break; + case AtomOp.And: if (type == AtomSize.S32 || type == AtomSize.U32) { - res = context.AtomicXor(storageKind, e0, e1, value); + res = context.AtomicAnd(storageKind, e0, e1, value); } else { @@ -252,34 +270,29 @@ namespace Ryujinx.Graphics.Shader.Instructions context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}."); } break; - case AtomOp.Max: - if (type == AtomSize.S32) - { - res = context.AtomicMaxS32(storageKind, e0, e1, value); - } - else if (type == AtomSize.U32) + case AtomOp.Xor: + if (type == AtomSize.S32 || type == AtomSize.U32) { - res = context.AtomicMaxU32(storageKind, e0, e1, value); + res = context.AtomicXor(storageKind, e0, e1, value); } else { context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}."); } break; - case AtomOp.Min: - if (type == AtomSize.S32) - { - res = context.AtomicMinS32(storageKind, e0, e1, value); - } - else if (type == AtomSize.U32) + case AtomOp.Exch: + if (type == AtomSize.S32 || type == AtomSize.U32) { - res = context.AtomicMinU32(storageKind, e0, e1, value); + res = context.AtomicSwap(storageKind, e0, e1, value); } else { context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}."); } break; + default: + context.TranslatorContext.GpuAccessor.Log($"Invalid atomic operation: {op}."); + break; } return res; |