aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-06-10 18:31:38 -0300
committerGitHub <noreply@github.com>2023-06-10 18:31:38 -0300
commiteb0bb36bbfc3a4f5f2ac1c8721e192239f899a1d (patch)
treee43650855d28e8d49d7ad2d82466647263c3fe16 /src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs
parent0e95a8271ac96b2c54907858140e2511a25a2b10 (diff)
Implement transform feedback emulation for hardware without native support (#5080)
* Implement transform feedback emulation for hardware without native support * Stop doing some useless buffer updates and account for non-zero base instance * Reduce redundant updates even more * Update descriptor init logic to account for ResourceLayout * Fix transform feedback and storage buffers not being updated in some cases * Shader cache version bump * PR feedback * SetInstancedDrawVertexCount must be always called after UpdateState * Minor typo
Diffstat (limited to 'src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs')
-rw-r--r--src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs33
1 files changed, 8 insertions, 25 deletions
diff --git a/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs b/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs
index cbac1cd4..b09a0667 100644
--- a/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs
+++ b/src/Ryujinx.Graphics.Vulkan/DescriptorSetUpdater.cs
@@ -596,36 +596,19 @@ namespace Ryujinx.Graphics.Vulkan
}
}
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
private void Initialize(CommandBufferScoped cbs, int setIndex, DescriptorSetCollection dsc)
{
- var dummyBuffer = _dummyBuffer?.GetBuffer().Get(cbs).Value ?? default;
+ // We don't support clearing texture descriptors currently.
+ if (setIndex != PipelineBase.UniformSetIndex && setIndex != PipelineBase.StorageSetIndex)
+ {
+ return;
+ }
- uint stages = _program.Stages;
+ var dummyBuffer = _dummyBuffer?.GetBuffer().Get(cbs).Value ?? default;
- while (stages != 0)
+ foreach (ResourceBindingSegment segment in _program.ClearSegments[setIndex])
{
- int stage = BitOperations.TrailingZeroCount(stages);
- stages &= ~(1u << stage);
-
- if (setIndex == PipelineBase.UniformSetIndex)
- {
- dsc.InitializeBuffers(
- 0,
- 1 + stage * Constants.MaxUniformBuffersPerStage,
- Constants.MaxUniformBuffersPerStage,
- DescriptorType.UniformBuffer,
- dummyBuffer);
- }
- else if (setIndex == PipelineBase.StorageSetIndex)
- {
- dsc.InitializeBuffers(
- 0,
- stage * Constants.MaxStorageBuffersPerStage,
- Constants.MaxStorageBuffersPerStage,
- DescriptorType.StorageBuffer,
- dummyBuffer);
- }
+ dsc.InitializeBuffers(0, segment.Binding, segment.Count, segment.Type.Convert(), dummyBuffer);
}
}