diff options
author | gdkchan <gab.dark.100@gmail.com> | 2023-06-03 20:12:18 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-03 20:12:18 -0300 |
commit | 21c9ac6240a3db3300143d1d0dd4a1070d4f576f (patch) | |
tree | 1d3fbafa1861368efe7cf8c923752cb0b621f717 /src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGen.cs | |
parent | 81c9052847f1aa4a70010fefa8e6ee38b5ace612 (diff) |
Implement shader storage buffer operations using new Load/Store instructions (#4993)1.1.861
* Implement storage buffer operations using new Load/Store instruction
* Extend GenerateMultiTargetStorageOp to also match access with constant offset, and log and comments
* Remove now unused code
* Catch more complex cases of global memory usage
* Shader cache version bump
* Extend global access elimination to work with more shared memory cases
* Change alignment requirement from 16 bytes to 8 bytes, handle cases where we need more than 16 storage buffers
* Tweak preferencing to catch more cases
* Enable CB0 elimination even when host storage buffer alignment is > 16 (for Intel)
* Fix storage buffer bindings
* Simplify some code
* Shader cache version bump
* Fix typo
* Extend global memory elimination to handle shared memory with multiple possible offsets and local memory
Diffstat (limited to 'src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGen.cs')
-rw-r--r-- | src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGen.cs | 56 |
1 files changed, 28 insertions, 28 deletions
diff --git a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGen.cs b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGen.cs index 24ea66d0..01d8a6e7 100644 --- a/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGen.cs +++ b/src/Ryujinx.Graphics.Shader/CodeGen/Glsl/Instructions/InstGen.cs @@ -68,33 +68,45 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions string args = string.Empty; - for (int argIndex = 0; argIndex < arity; argIndex++) + if (atomic && operation.StorageKind == StorageKind.StorageBuffer) { + args = GenerateLoadOrStore(context, operation, isStore: false); + + AggregateType dstType = operation.Inst == Instruction.AtomicMaxS32 || operation.Inst == Instruction.AtomicMinS32 + ? AggregateType.S32 + : AggregateType.U32; + + for (int argIndex = operation.SourcesCount - arity + 2; argIndex < operation.SourcesCount; argIndex++) + { + args += ", " + GetSoureExpr(context, operation.GetSource(argIndex), dstType); + } + } + else if (atomic && operation.StorageKind == StorageKind.SharedMemory) + { + args = LoadShared(context, operation); + // For shared memory access, the second argument is unused and should be ignored. // It is there to make both storage and shared access have the same number of arguments. // For storage, both inputs are consumed when the argument index is 0, so we should skip it here. - if (argIndex == 1 && (atomic || operation.StorageKind == StorageKind.SharedMemory)) - { - continue; - } - if (argIndex != 0) + for (int argIndex = 2; argIndex < arity; argIndex++) { args += ", "; - } - if (argIndex == 0 && atomic) - { - switch (operation.StorageKind) - { - case StorageKind.SharedMemory: args += LoadShared(context, operation); break; - case StorageKind.StorageBuffer: args += LoadStorage(context, operation); break; + AggregateType dstType = GetSrcVarType(inst, argIndex); - default: throw new InvalidOperationException($"Invalid storage kind \"{operation.StorageKind}\"."); - } + args += GetSoureExpr(context, operation.GetSource(argIndex), dstType); } - else + } + else + { + for (int argIndex = 0; argIndex < arity; argIndex++) { + if (argIndex != 0) + { + args += ", "; + } + AggregateType dstType = GetSrcVarType(inst, argIndex); args += GetSoureExpr(context, operation.GetSource(argIndex), dstType); @@ -173,9 +185,6 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions case Instruction.LoadShared: return LoadShared(context, operation); - case Instruction.LoadStorage: - return LoadStorage(context, operation); - case Instruction.Lod: return Lod(context, operation); @@ -203,15 +212,6 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl.Instructions case Instruction.StoreShared8: return StoreShared8(context, operation); - case Instruction.StoreStorage: - return StoreStorage(context, operation); - - case Instruction.StoreStorage16: - return StoreStorage16(context, operation); - - case Instruction.StoreStorage8: - return StoreStorage8(context, operation); - case Instruction.TextureSample: return TextureSample(context, operation); |