From 8d168574eb04ae1e7026ac2b058e3b184f068fae Mon Sep 17 00:00:00 2001 From: gdkchan Date: Sun, 8 Nov 2020 08:10:00 -0300 Subject: Use explicit buffer and texture bindings on shaders (#1666) * Use explicit buffer and texture bindings on shaders * More XML docs and other nits --- Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs | 28 +++++++++++------ .../Image/TextureBindingsManager.cs | 36 +++++++++++----------- 2 files changed, 37 insertions(+), 27 deletions(-) (limited to 'Ryujinx.Graphics.Gpu/Image') diff --git a/Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs b/Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs index 422b66e2..a328fc2b 100644 --- a/Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs +++ b/Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs @@ -19,6 +19,11 @@ namespace Ryujinx.Graphics.Gpu.Image /// public Format Format { get; } + /// + /// Shader texture host binding point. + /// + public int Binding { get; } + /// /// Shader texture handle. /// This is an index into the texture constant buffer. @@ -53,13 +58,15 @@ namespace Ryujinx.Graphics.Gpu.Image /// /// The shader sampler target type /// Format of the image as declared on the shader + /// The shader texture binding point /// The shader texture handle (read index into the texture constant buffer) /// The texture's usage flags, indicating how it is used in the shader - public TextureBindingInfo(Target target, Format format, int handle, TextureUsageFlags flags) + public TextureBindingInfo(Target target, Format format, int binding, int handle, TextureUsageFlags flags) { - Target = target; - Format = format; - Handle = handle; + Target = target; + Format = format; + Binding = binding; + Handle = handle; IsBindless = false; @@ -73,9 +80,10 @@ namespace Ryujinx.Graphics.Gpu.Image /// Constructs the texture binding information structure. /// /// The shader sampler target type + /// The shader texture binding point /// The shader texture handle (read index into the texture constant buffer) /// The texture's usage flags, indicating how it is used in the shader - public TextureBindingInfo(Target target, int handle, TextureUsageFlags flags) : this(target, (Format)0, handle, flags) + public TextureBindingInfo(Target target, int binding, int handle, TextureUsageFlags flags) : this(target, (Format)0, binding, handle, flags) { } @@ -83,14 +91,16 @@ namespace Ryujinx.Graphics.Gpu.Image /// Constructs the bindless texture binding information structure. /// /// The shader sampler target type + /// The shader texture binding point /// Constant buffer slot where the bindless texture handle is located /// Constant buffer offset of the bindless texture handle /// The texture's usage flags, indicating how it is used in the shader - public TextureBindingInfo(Target target, int cbufSlot, int cbufOffset, TextureUsageFlags flags) + public TextureBindingInfo(Target target, int binding, int cbufSlot, int cbufOffset, TextureUsageFlags flags) { - Target = target; - Format = 0; - Handle = 0; + Target = target; + Format = 0; + Binding = binding; + Handle = 0; IsBindless = true; diff --git a/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs b/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs index 08c4082e..bfb6da25 100644 --- a/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs +++ b/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs @@ -265,11 +265,11 @@ namespace Ryujinx.Graphics.Gpu.Image for (int index = 0; index < _textureBindings[stageIndex].Length; index++) { - TextureBindingInfo binding = _textureBindings[stageIndex][index]; + TextureBindingInfo bindingInfo = _textureBindings[stageIndex][index]; int packedId; - if (binding.IsBindless) + if (bindingInfo.IsBindless) { ulong address; @@ -277,18 +277,18 @@ namespace Ryujinx.Graphics.Gpu.Image if (_isCompute) { - address = bufferManager.GetComputeUniformBufferAddress(binding.CbufSlot); + address = bufferManager.GetComputeUniformBufferAddress(bindingInfo.CbufSlot); } else { - address = bufferManager.GetGraphicsUniformBufferAddress(stageIndex, binding.CbufSlot); + address = bufferManager.GetGraphicsUniformBufferAddress(stageIndex, bindingInfo.CbufSlot); } - packedId = _context.PhysicalMemory.Read(address + (ulong)binding.CbufOffset * 4); + packedId = _context.PhysicalMemory.Read(address + (ulong)bindingInfo.CbufOffset * 4); } else { - packedId = ReadPackedId(stageIndex, binding.Handle, _textureBufferIndex); + packedId = ReadPackedId(stageIndex, bindingInfo.Handle, _textureBufferIndex); } int textureId = UnpackTextureId(packedId); @@ -305,18 +305,18 @@ namespace Ryujinx.Graphics.Gpu.Image Texture texture = pool.Get(textureId); - ITexture hostTexture = texture?.GetTargetTexture(binding.Target); + ITexture hostTexture = texture?.GetTargetTexture(bindingInfo.Target); if (_textureState[stageIndex][index].Texture != hostTexture || _rebind) { - if (UpdateScale(texture, binding, index, stage)) + if (UpdateScale(texture, bindingInfo, index, stage)) { - hostTexture = texture?.GetTargetTexture(binding.Target); + hostTexture = texture?.GetTargetTexture(bindingInfo.Target); } _textureState[stageIndex][index].Texture = hostTexture; - _context.Renderer.Pipeline.SetTexture(index, stage, hostTexture); + _context.Renderer.Pipeline.SetTexture(bindingInfo.Binding, hostTexture); } if (hostTexture != null && texture.Info.Target == Target.TextureBuffer) @@ -335,7 +335,7 @@ namespace Ryujinx.Graphics.Gpu.Image { _textureState[stageIndex][index].Sampler = hostSampler; - _context.Renderer.Pipeline.SetSampler(index, stage, hostSampler); + _context.Renderer.Pipeline.SetSampler(bindingInfo.Binding, hostSampler); } } } @@ -359,14 +359,14 @@ namespace Ryujinx.Graphics.Gpu.Image for (int index = 0; index < _imageBindings[stageIndex].Length; index++) { - TextureBindingInfo binding = _imageBindings[stageIndex][index]; + TextureBindingInfo bindingInfo = _imageBindings[stageIndex][index]; - int packedId = ReadPackedId(stageIndex, binding.Handle, _textureBufferIndex); + int packedId = ReadPackedId(stageIndex, bindingInfo.Handle, _textureBufferIndex); int textureId = UnpackTextureId(packedId); Texture texture = pool.Get(textureId); - ITexture hostTexture = texture?.GetTargetTexture(binding.Target); + ITexture hostTexture = texture?.GetTargetTexture(bindingInfo.Target); if (hostTexture != null && texture.Info.Target == Target.TextureBuffer) { @@ -378,21 +378,21 @@ namespace Ryujinx.Graphics.Gpu.Image if (_imageState[stageIndex][index].Texture != hostTexture || _rebind) { - if (UpdateScale(texture, binding, baseScaleIndex + index, stage)) + if (UpdateScale(texture, bindingInfo, baseScaleIndex + index, stage)) { - hostTexture = texture?.GetTargetTexture(binding.Target); + hostTexture = texture?.GetTargetTexture(bindingInfo.Target); } _imageState[stageIndex][index].Texture = hostTexture; - Format format = binding.Format; + Format format = bindingInfo.Format; if (format == 0 && texture != null) { format = texture.Format; } - _context.Renderer.Pipeline.SetImage(index, stage, hostTexture, format); + _context.Renderer.Pipeline.SetImage(bindingInfo.Binding, hostTexture, format); } } } -- cgit v1.2.3