mirror of
				https://github.com/ryujinx-mirror/ryujinx.git
				synced 2025-11-04 03:29:01 -06:00 
			
		
		
		
	Implement support for shader ATOM.EXCH instruction (#7320)
* Implement support for shader ATOM.EXCH instruction * Shader cache version bump * Check type
This commit is contained in:
		@@ -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";
 | 
			
		||||
 
 | 
			
		||||
@@ -222,30 +222,14 @@ 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
 | 
			
		||||
                    else if (type == AtomSize.U32)
 | 
			
		||||
                    {
 | 
			
		||||
                        context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}.");
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case AtomOp.Xor:
 | 
			
		||||
                    if (type == AtomSize.S32 || type == AtomSize.U32)
 | 
			
		||||
                    {
 | 
			
		||||
                        res = context.AtomicXor(storageKind, e0, e1, value);
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}.");
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case AtomOp.Or:
 | 
			
		||||
                    if (type == AtomSize.S32 || type == AtomSize.U32)
 | 
			
		||||
                    {
 | 
			
		||||
                        res = context.AtomicOr(storageKind, e0, e1, value);
 | 
			
		||||
                        res = context.AtomicMinU32(storageKind, e0, e1, value);
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
@@ -266,20 +250,49 @@ namespace Ryujinx.Graphics.Shader.Instructions
 | 
			
		||||
                        context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}.");
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case AtomOp.Min:
 | 
			
		||||
                    if (type == AtomSize.S32)
 | 
			
		||||
                case AtomOp.And:
 | 
			
		||||
                    if (type == AtomSize.S32 || type == AtomSize.U32)
 | 
			
		||||
                    {
 | 
			
		||||
                        res = context.AtomicMinS32(storageKind, e0, e1, value);
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (type == AtomSize.U32)
 | 
			
		||||
                    {
 | 
			
		||||
                        res = context.AtomicMinU32(storageKind, e0, e1, value);
 | 
			
		||||
                        res = context.AtomicAnd(storageKind, e0, e1, value);
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}.");
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case AtomOp.Or:
 | 
			
		||||
                    if (type == AtomSize.S32 || type == AtomSize.U32)
 | 
			
		||||
                    {
 | 
			
		||||
                        res = context.AtomicOr(storageKind, e0, e1, value);
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}.");
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case AtomOp.Xor:
 | 
			
		||||
                    if (type == AtomSize.S32 || type == AtomSize.U32)
 | 
			
		||||
                    {
 | 
			
		||||
                        res = context.AtomicXor(storageKind, e0, e1, value);
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        context.TranslatorContext.GpuAccessor.Log($"Invalid reduction type: {type}.");
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case AtomOp.Exch:
 | 
			
		||||
                    if (type == AtomSize.S32 || type == AtomSize.U32)
 | 
			
		||||
                    {
 | 
			
		||||
                        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;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user