aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu/Engine/Methods.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2020-11-08 08:10:00 -0300
committerGitHub <noreply@github.com>2020-11-08 12:10:00 +0100
commit8d168574eb04ae1e7026ac2b058e3b184f068fae (patch)
tree6e0f79447276619af980055419874f5e99595b58 /Ryujinx.Graphics.Gpu/Engine/Methods.cs
parent5561a3b95e9c980e3354366570e7896a213b95ae (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.cs32
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);
}