diff options
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Image')
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs | 21 | ||||
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs | 25 |
2 files changed, 45 insertions, 1 deletions
diff --git a/Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs b/Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs index 19090ab3..042635ee 100644 --- a/Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs +++ b/Ryujinx.Graphics.Gpu/Image/TextureBindingInfo.cs @@ -8,10 +8,31 @@ namespace Ryujinx.Graphics.Gpu.Image public int Handle { get; } + public bool IsBindless { get; } + + public int CbufSlot { get; } + public int CbufOffset { get; } + public TextureBindingInfo(Target target, int handle) { Target = target; Handle = handle; + + IsBindless = false; + + CbufSlot = 0; + CbufOffset = 0; + } + + public TextureBindingInfo(Target target, int cbufSlot, int cbufOffset) + { + Target = target; + Handle = 0; + + IsBindless = true; + + CbufSlot = cbufSlot; + CbufOffset = cbufOffset; } } }
\ No newline at end of file diff --git a/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs b/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs index ce58e5c5..0c09661f 100644 --- a/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs +++ b/Ryujinx.Graphics.Gpu/Image/TextureBindingsManager.cs @@ -2,6 +2,7 @@ using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.Gpu.State; using Ryujinx.Graphics.Shader; using System; +using System.Runtime.InteropServices; namespace Ryujinx.Graphics.Gpu.Image { @@ -133,7 +134,29 @@ namespace Ryujinx.Graphics.Gpu.Image { TextureBindingInfo binding = _textureBindings[stageIndex][index]; - int packedId = ReadPackedId(stageIndex, binding.Handle); + int packedId; + + if (binding.IsBindless) + { + ulong address; + + var bufferManager = _context.Methods.BufferManager; + + if (_isCompute) + { + address = bufferManager.GetComputeUniformBufferAddress(binding.CbufSlot); + } + else + { + address = bufferManager.GetGraphicsUniformBufferAddress(stageIndex, binding.CbufSlot); + } + + packedId = MemoryMarshal.Cast<byte, int>(_context.PhysicalMemory.Read(address + (ulong)binding.CbufOffset * 4, 4))[0]; + } + else + { + packedId = ReadPackedId(stageIndex, binding.Handle); + } int textureId = UnpackTextureId(packedId); int samplerId; |
