diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2024-04-22 15:05:55 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-22 15:05:55 -0300 |
| commit | c6f8bfed904e30f7c5d890a2f0ef531eb9e298e5 (patch) | |
| tree | e1c048d390867e8c9403904498184e3a64277e49 /src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs | |
| parent | 9b94662b4bb2ebf846e1baf45ba8097fcd7da684 (diff) | |
Add support for bindless textures from shader input (vertex buffer) on Vulkan (#6577)
* Add support for bindless textures from shader input (vertex buffer)
* Shader cache version bump
* Format whitespace
* Remove cache entries on pool removal, disable for OpenGL
* PR feedback
Diffstat (limited to 'src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs')
| -rw-r--r-- | src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs | 87 |
1 files changed, 26 insertions, 61 deletions
diff --git a/src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs b/src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs index b9abd8fc..117f79bb 100644 --- a/src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs +++ b/src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs @@ -43,11 +43,11 @@ namespace Ryujinx.Graphics.Vulkan int binding = segment.Binding; int count = segment.Count; - if (setIndex == PipelineBase.UniformSetIndex) + if (IsBufferType(segment.Type)) { entries[seg] = new DescriptorUpdateTemplateEntry() { - DescriptorType = DescriptorType.UniformBuffer, + DescriptorType = segment.Type.Convert(), DstBinding = (uint)binding, DescriptorCount = (uint)count, Offset = structureOffset, @@ -56,76 +56,31 @@ namespace Ryujinx.Graphics.Vulkan structureOffset += (nuint)(Unsafe.SizeOf<DescriptorBufferInfo>() * count); } - else if (setIndex == PipelineBase.StorageSetIndex) + else if (IsBufferTextureType(segment.Type)) { entries[seg] = new DescriptorUpdateTemplateEntry() { - DescriptorType = DescriptorType.StorageBuffer, + DescriptorType = segment.Type.Convert(), DstBinding = (uint)binding, DescriptorCount = (uint)count, Offset = structureOffset, - Stride = (nuint)Unsafe.SizeOf<DescriptorBufferInfo>() + Stride = (nuint)Unsafe.SizeOf<BufferView>() }; - structureOffset += (nuint)(Unsafe.SizeOf<DescriptorBufferInfo>() * count); - } - else if (setIndex == PipelineBase.TextureSetIndex) - { - if (segment.Type != ResourceType.BufferTexture) - { - entries[seg] = new DescriptorUpdateTemplateEntry() - { - DescriptorType = DescriptorType.CombinedImageSampler, - DstBinding = (uint)binding, - DescriptorCount = (uint)count, - Offset = structureOffset, - Stride = (nuint)Unsafe.SizeOf<DescriptorImageInfo>() - }; - - structureOffset += (nuint)(Unsafe.SizeOf<DescriptorImageInfo>() * count); - } - else - { - entries[seg] = new DescriptorUpdateTemplateEntry() - { - DescriptorType = DescriptorType.UniformTexelBuffer, - DstBinding = (uint)binding, - DescriptorCount = (uint)count, - Offset = structureOffset, - Stride = (nuint)Unsafe.SizeOf<BufferView>() - }; - - structureOffset += (nuint)(Unsafe.SizeOf<BufferView>() * count); - } + structureOffset += (nuint)(Unsafe.SizeOf<BufferView>() * count); } - else if (setIndex == PipelineBase.ImageSetIndex) + else { - if (segment.Type != ResourceType.BufferImage) - { - entries[seg] = new DescriptorUpdateTemplateEntry() - { - DescriptorType = DescriptorType.StorageImage, - DstBinding = (uint)binding, - DescriptorCount = (uint)count, - Offset = structureOffset, - Stride = (nuint)Unsafe.SizeOf<DescriptorImageInfo>() - }; - - structureOffset += (nuint)(Unsafe.SizeOf<DescriptorImageInfo>() * count); - } - else + entries[seg] = new DescriptorUpdateTemplateEntry() { - entries[seg] = new DescriptorUpdateTemplateEntry() - { - DescriptorType = DescriptorType.StorageTexelBuffer, - DstBinding = (uint)binding, - DescriptorCount = (uint)count, - Offset = structureOffset, - Stride = (nuint)Unsafe.SizeOf<BufferView>() - }; - - structureOffset += (nuint)(Unsafe.SizeOf<BufferView>() * count); - } + DescriptorType = segment.Type.Convert(), + DstBinding = (uint)binding, + DescriptorCount = (uint)count, + Offset = structureOffset, + Stride = (nuint)Unsafe.SizeOf<DescriptorImageInfo>() + }; + + structureOffset += (nuint)(Unsafe.SizeOf<DescriptorImageInfo>() * count); } } @@ -237,6 +192,16 @@ namespace Ryujinx.Graphics.Vulkan Template = result; } + private static bool IsBufferType(ResourceType type) + { + return type == ResourceType.UniformBuffer || type == ResourceType.StorageBuffer; + } + + private static bool IsBufferTextureType(ResourceType type) + { + return type == ResourceType.BufferTexture || type == ResourceType.BufferImage; + } + public unsafe void Dispose() { _gd.Api.DestroyDescriptorUpdateTemplate(_device, Template, null); |
