diff options
author | gdkchan <gab.dark.100@gmail.com> | 2023-07-03 14:29:27 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-03 14:29:27 -0300 |
commit | 1c7a90ef359d9974e5bd257c4d8e9bf526a6966c (patch) | |
tree | 3ab1644927819b90b0aef78ed6749c6434150490 /src/Ryujinx.Graphics.Shader/Instructions/InstEmitSurface.cs | |
parent | 3b46bb73f781a011705ecbc8a1d3207dfb145829 (diff) |
Stop identifying shader textures with handle and cbuf, use binding instead (#5266)1.1.952
* Stop identifying shader textures with handle and cbuf, use binding instead
* Remove now unused code
* Consider image operations as having accurate type information too
I don't know why that was not the case before
* Fix missing unscale on InsertCoordNormalization, stop calling SetUsageFlagsForTextureQuery when not needed
* Shader cache version bump
* Change get texture methods to return descriptors created from ResourceManager state
This is required to ensure that reserved textures and images will not be bound as a guest texture/image
* Fix BindlessElimination.SetHandle inserting coords at the wrong place
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/Instructions/InstEmitSurface.cs')
-rw-r--r-- | src/Ryujinx.Graphics.Shader/Instructions/InstEmitSurface.cs | 66 |
1 files changed, 29 insertions, 37 deletions
diff --git a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitSurface.cs b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitSurface.cs index 78fc313d..0b929307 100644 --- a/src/Ryujinx.Graphics.Shader/Instructions/InstEmitSurface.cs +++ b/src/Ryujinx.Graphics.Shader/Instructions/InstEmitSurface.cs @@ -218,7 +218,7 @@ namespace Ryujinx.Graphics.Shader.Instructions return context.Copy(Register(srcB++, RegisterType.Gpr)); } - Operand destOperand = dest != RegisterConsts.RegisterZeroIndex ? Register(dest, RegisterType.Gpr) : null; + Operand d = dest != RegisterConsts.RegisterZeroIndex ? Register(dest, RegisterType.Gpr) : null; List<Operand> sourcesList = new(); @@ -277,17 +277,17 @@ namespace Ryujinx.Graphics.Shader.Instructions flags |= TextureFlags.Bindless; } - TextureOperation operation = context.CreateTextureOperation( + int binding = isBindless ? 0 : context.Config.ResourceManager.GetTextureOrImageBinding( Instruction.ImageAtomic, type, format, flags, - imm, - 0, - new[] { destOperand }, - sources); + TextureOperation.DefaultCbufSlot, + imm); + + Operand res = context.ImageAtomic(type, format, flags, binding, sources); - context.Add(operation); + context.Copy(d, res); } private static void EmitSuld( @@ -383,21 +383,17 @@ namespace Ryujinx.Graphics.Shader.Instructions Array.Resize(ref dests, outputIndex); } - TextureOperation operation = context.CreateTextureOperation( + TextureFormat format = isBindless ? TextureFormat.Unknown : context.Config.GetTextureFormat(handle); + + int binding = isBindless ? 0 : context.Config.ResourceManager.GetTextureOrImageBinding( Instruction.ImageLoad, type, + format, flags, - handle, - (int)componentMask, - dests, - sources); - - if (!isBindless) - { - operation.Format = context.Config.GetTextureFormat(handle); - } + TextureOperation.DefaultCbufSlot, + handle); - context.Add(operation); + context.ImageLoad(type, format, flags, binding, (int)componentMask, dests, sources); } else { @@ -430,17 +426,17 @@ namespace Ryujinx.Graphics.Shader.Instructions Array.Resize(ref dests, outputIndex); } - TextureOperation operation = context.CreateTextureOperation( + TextureFormat format = GetTextureFormat(size); + + int binding = isBindless ? 0 : context.Config.ResourceManager.GetTextureOrImageBinding( Instruction.ImageLoad, type, - GetTextureFormat(size), + format, flags, - handle, - compMask, - dests, - sources); + TextureOperation.DefaultCbufSlot, + handle); - context.Add(operation); + context.ImageLoad(type, format, flags, binding, compMask, dests, sources); switch (size) { @@ -552,17 +548,15 @@ namespace Ryujinx.Graphics.Shader.Instructions flags |= TextureFlags.Bindless; } - TextureOperation operation = context.CreateTextureOperation( + int binding = isBindless ? 0 : context.Config.ResourceManager.GetTextureOrImageBinding( Instruction.ImageAtomic, type, format, flags, - imm, - 0, - null, - sources); + TextureOperation.DefaultCbufSlot, + imm); - context.Add(operation); + context.ImageAtomic(type, format, flags, binding, sources); } private static void EmitSust( @@ -681,17 +675,15 @@ namespace Ryujinx.Graphics.Shader.Instructions flags |= TextureFlags.Coherent; } - TextureOperation operation = context.CreateTextureOperation( + int binding = isBindless ? 0 : context.Config.ResourceManager.GetTextureOrImageBinding( Instruction.ImageStore, type, format, flags, - handle, - 0, - null, - sources); + TextureOperation.DefaultCbufSlot, + handle); - context.Add(operation); + context.ImageStore(type, format, flags, binding, sources); } private static int GetComponentSizeInBytesLog2(SuatomSize size) |