diff options
Diffstat (limited to 'Ryujinx.Graphics.Vulkan/PipelineState.cs')
-rw-r--r-- | Ryujinx.Graphics.Vulkan/PipelineState.cs | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/Ryujinx.Graphics.Vulkan/PipelineState.cs b/Ryujinx.Graphics.Vulkan/PipelineState.cs index d33bc8ce..7b6a2649 100644 --- a/Ryujinx.Graphics.Vulkan/PipelineState.cs +++ b/Ryujinx.Graphics.Vulkan/PipelineState.cs @@ -312,6 +312,7 @@ namespace Ryujinx.Graphics.Vulkan public NativeArray<PipelineShaderStageCreateInfo> Stages; public NativeArray<PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT> StageRequiredSubgroupSizes; public PipelineLayout PipelineLayout; + public SpecData SpecializationData; public void Initialize() { @@ -334,7 +335,7 @@ namespace Ryujinx.Graphics.Vulkan ShaderCollection program, PipelineCache cache) { - if (program.TryGetComputePipeline(out var pipeline)) + if (program.TryGetComputePipeline(ref SpecializationData, out var pipeline)) { return pipeline; } @@ -354,20 +355,36 @@ namespace Ryujinx.Graphics.Vulkan Pipeline pipelineHandle = default; - gd.Api.CreateComputePipelines(device, cache, 1, &pipelineCreateInfo, null, &pipelineHandle).ThrowOnError(); + bool hasSpec = program.SpecDescriptions != null; + + var desc = hasSpec ? program.SpecDescriptions[0] : SpecDescription.Empty; + + if (hasSpec && SpecializationData.Length < (int)desc.Info.DataSize) + { + throw new InvalidOperationException("Specialization data size does not match description"); + } + + fixed (SpecializationInfo* info = &desc.Info) + fixed (SpecializationMapEntry* map = desc.Map) + fixed (byte* data = SpecializationData.Span) + { + if (hasSpec) + { + info->PMapEntries = map; + info->PData = data; + pipelineCreateInfo.Stage.PSpecializationInfo = info; + } + + gd.Api.CreateComputePipelines(device, cache, 1, &pipelineCreateInfo, null, &pipelineHandle).ThrowOnError(); + } pipeline = new Auto<DisposablePipeline>(new DisposablePipeline(gd.Api, device, pipelineHandle)); - program.AddComputePipeline(pipeline); + program.AddComputePipeline(ref SpecializationData, pipeline); return pipeline; } - public unsafe void DestroyComputePipeline(ShaderCollection program) - { - program.RemoveComputePipeline(); - } - public unsafe Auto<DisposablePipeline> CreateGraphicsPipeline( VulkanRenderer gd, Device device, |