diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2020-11-08 08:10:00 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-08 12:10:00 +0100 |
| commit | 8d168574eb04ae1e7026ac2b058e3b184f068fae (patch) | |
| tree | 6e0f79447276619af980055419874f5e99595b58 /Ryujinx.Graphics.Gpu/Engine/Methods.cs | |
| parent | 5561a3b95e9c980e3354366570e7896a213b95ae (diff) | |
Use explicit buffer and texture bindings on shaders (#1666)
* Use explicit buffer and texture bindings on shaders
* More XML docs and other nits
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Engine/Methods.cs')
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Engine/Methods.cs | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/Ryujinx.Graphics.Gpu/Engine/Methods.cs b/Ryujinx.Graphics.Gpu/Engine/Methods.cs index d4988f35..8bc2c22d 100644 --- a/Ryujinx.Graphics.Gpu/Engine/Methods.cs +++ b/Ryujinx.Graphics.Gpu/Engine/Methods.cs @@ -6,6 +6,7 @@ using Ryujinx.Graphics.Gpu.Shader; using Ryujinx.Graphics.Gpu.State; using Ryujinx.Graphics.Shader; using System; +using System.Linq; using System.Runtime.InteropServices; namespace Ryujinx.Graphics.Gpu.Engine @@ -997,6 +998,9 @@ namespace Ryujinx.Graphics.Gpu.Engine _vsUsesInstanceId = gs.Shaders[0]?.Program.Info.UsesInstanceId ?? false; + int storageBufferBindingsCount = 0; + int uniformBufferBindingsCount = 0; + for (int stage = 0; stage < Constants.ShaderStages; stage++) { ShaderProgramInfo info = gs.Shaders[stage]?.Program.Info; @@ -1005,6 +1009,10 @@ namespace Ryujinx.Graphics.Gpu.Engine if (info == null) { + TextureManager.SetGraphicsTextures(stage, Array.Empty<TextureBindingInfo>()); + TextureManager.SetGraphicsImages(stage, Array.Empty<TextureBindingInfo>()); + BufferManager.SetGraphicsStorageBufferBindings(stage, null); + BufferManager.SetGraphicsUniformBufferBindings(stage, null); continue; } @@ -1018,11 +1026,11 @@ namespace Ryujinx.Graphics.Gpu.Engine if (descriptor.IsBindless) { - textureBindings[index] = new TextureBindingInfo(target, descriptor.CbufSlot, descriptor.CbufOffset, descriptor.Flags); + textureBindings[index] = new TextureBindingInfo(target, descriptor.Binding, descriptor.CbufSlot, descriptor.CbufOffset, descriptor.Flags); } else { - textureBindings[index] = new TextureBindingInfo(target, descriptor.HandleIndex, descriptor.Flags); + textureBindings[index] = new TextureBindingInfo(target, descriptor.Binding, descriptor.HandleIndex, descriptor.Flags); } } @@ -1037,28 +1045,28 @@ namespace Ryujinx.Graphics.Gpu.Engine Target target = ShaderTexture.GetTarget(descriptor.Type); Format format = ShaderTexture.GetFormat(descriptor.Format); - imageBindings[index] = new TextureBindingInfo(target, format, descriptor.HandleIndex, descriptor.Flags); + imageBindings[index] = new TextureBindingInfo(target, format, descriptor.Binding, descriptor.HandleIndex, descriptor.Flags); } TextureManager.SetGraphicsImages(stage, imageBindings); - uint sbEnableMask = 0; - uint ubEnableMask = 0; + BufferManager.SetGraphicsStorageBufferBindings(stage, info.SBuffers); + BufferManager.SetGraphicsUniformBufferBindings(stage, info.CBuffers); - for (int index = 0; index < info.SBuffers.Count; index++) + if (info.SBuffers.Count != 0) { - sbEnableMask |= 1u << info.SBuffers[index].Slot; + storageBufferBindingsCount = Math.Max(storageBufferBindingsCount, info.SBuffers.Max(x => x.Binding) + 1); } - for (int index = 0; index < info.CBuffers.Count; index++) + if (info.CBuffers.Count != 0) { - ubEnableMask |= 1u << info.CBuffers[index].Slot; + uniformBufferBindingsCount = Math.Max(uniformBufferBindingsCount, info.CBuffers.Max(x => x.Binding) + 1); } - - BufferManager.SetGraphicsStorageBufferEnableMask(stage, sbEnableMask); - BufferManager.SetGraphicsUniformBufferEnableMask(stage, ubEnableMask); } + BufferManager.SetGraphicsStorageBufferBindingsCount(storageBufferBindingsCount); + BufferManager.SetGraphicsUniformBufferBindingsCount(uniformBufferBindingsCount); + _context.Renderer.Pipeline.SetProgram(gs.HostProgram); } |
