Selaa lähdekoodia

Implement support for shader ATOM.EXCH instruction (#7320)

* Implement support for shader ATOM.EXCH instruction

* Shader cache version bump

* Check type
gdkchan 1 vuosi sitten
vanhempi
sitoutus
ef81658fbd

+ 1 - 1
src/Ryujinx.Graphics.Gpu/Shader/DiskCache/DiskCacheHostStorage.cs

@@ -22,7 +22,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
         private const ushort FileFormatVersionMajor = 1;
         private const ushort FileFormatVersionMinor = 2;
         private const uint FileFormatVersionPacked = ((uint)FileFormatVersionMajor << 16) | FileFormatVersionMinor;
-        private const uint CodeGenVersion = 7131;
+        private const uint CodeGenVersion = 7320;
 
         private const string SharedTocFileName = "shared.toc";
         private const string SharedDataFileName = "shared.data";

+ 32 - 19
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;