diff options
author | riperiperi <rhy3756547@hotmail.com> | 2022-12-04 17:18:40 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-12-04 18:18:40 +0100 |
commit | 4965681e069eeedc5272030b131c2a45e6131e61 (patch) | |
tree | 050a6596728c6a040c5c17fd21339c913b97ee8f /Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs | |
parent | 3868a0020611491e30db19e5b27d33a7559c7071 (diff) |
GPU: Swap bindings array instead of copying (#4003)1.1.418
* GPU: Swap bindings array instead of copying
Reduces work on UpdateShaderState. Now the cost is a few reference moves for arrays, rather than copying data.
Downside: bindings arrays are no longer readonly.
* Micro optimisation
* Add missing docs
* Address Feedback
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs')
-rw-r--r-- | Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs | 52 |
1 files changed, 2 insertions, 50 deletions
diff --git a/Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs b/Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs index cd509471..2ac738fd 100644 --- a/Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs +++ b/Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs @@ -202,57 +202,9 @@ namespace Ryujinx.Graphics.Gpu.Engine.Compute _channel.BufferManager.SetComputeUniformBuffer(cb.Slot, cbDescriptor.PackAddress(), (uint)cbDescriptor.Size); } - _channel.BufferManager.SetComputeStorageBufferBindings(info.SBuffers); - _channel.BufferManager.SetComputeUniformBufferBindings(info.CBuffers); + _channel.BufferManager.SetComputeBufferBindings(cs.Bindings); - int maxTextureBinding = -1; - int maxImageBinding = -1; - - TextureBindingInfo[] textureBindings = _channel.TextureManager.RentComputeTextureBindings(info.Textures.Count); - - for (int index = 0; index < info.Textures.Count; index++) - { - var descriptor = info.Textures[index]; - - Target target = ShaderTexture.GetTarget(descriptor.Type); - - textureBindings[index] = new TextureBindingInfo( - target, - descriptor.Binding, - descriptor.CbufSlot, - descriptor.HandleIndex, - descriptor.Flags); - - if (descriptor.Binding > maxTextureBinding) - { - maxTextureBinding = descriptor.Binding; - } - } - - TextureBindingInfo[] imageBindings = _channel.TextureManager.RentComputeImageBindings(info.Images.Count); - - for (int index = 0; index < info.Images.Count; index++) - { - var descriptor = info.Images[index]; - - Target target = ShaderTexture.GetTarget(descriptor.Type); - Format format = ShaderTexture.GetFormat(descriptor.Format); - - imageBindings[index] = new TextureBindingInfo( - target, - format, - descriptor.Binding, - descriptor.CbufSlot, - descriptor.HandleIndex, - descriptor.Flags); - - if (descriptor.Binding > maxImageBinding) - { - maxImageBinding = descriptor.Binding; - } - } - - _channel.TextureManager.SetComputeMaxBindings(maxTextureBinding, maxImageBinding); + _channel.TextureManager.SetComputeBindings(cs.Bindings); // Should never return false for mismatching spec state, since the shader was fetched above. _channel.TextureManager.CommitComputeBindings(cs.SpecializationState); |