aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2024-04-22 15:05:55 -0300
committerGitHub <noreply@github.com>2024-04-22 15:05:55 -0300
commitc6f8bfed904e30f7c5d890a2f0ef531eb9e298e5 (patch)
treee1c048d390867e8c9403904498184e3a64277e49 /src/Ryujinx.Graphics.Vulkan/DescriptorSetTemplate.cs
parent9b94662b4bb2ebf846e1baf45ba8097fcd7da684 (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.cs87
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);