From f6a4fe8f5f08970f1a84c16c22d47903634e86e6 Mon Sep 17 00:00:00 2001 From: gdk Date: Sun, 12 Dec 2021 23:33:44 -0300 Subject: [PATCH] Fix some validation errors around extended dynamic state --- Ryujinx.Graphics.Vulkan/PipelineBase.cs | 2 +- Ryujinx.Graphics.Vulkan/PipelineState.cs | 18 ++++++++++++------ .../VulkanInitialization.cs | 15 ++++++++++++--- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/Ryujinx.Graphics.Vulkan/PipelineBase.cs b/Ryujinx.Graphics.Vulkan/PipelineBase.cs index 01a79e131..ce631c4a6 100644 --- a/Ryujinx.Graphics.Vulkan/PipelineBase.cs +++ b/Ryujinx.Graphics.Vulkan/PipelineBase.cs @@ -1103,7 +1103,7 @@ namespace Ryujinx.Graphics.Vulkan var pipeline = pbp == PipelineBindPoint.Compute ? _newState.CreateComputePipeline(Gd.Api, Device, _program, _pipelineCache) - : _newState.CreateGraphicsPipeline(Gd.Api, Device, _program, _pipelineCache, _renderPass.Get(Cbs).Value); + : _newState.CreateGraphicsPipeline(Gd, Device, _program, _pipelineCache, _renderPass.Get(Cbs).Value); ulong pipelineHandle = pipeline.GetUnsafe().Value.Handle; diff --git a/Ryujinx.Graphics.Vulkan/PipelineState.cs b/Ryujinx.Graphics.Vulkan/PipelineState.cs index 246a84c79..6da2e23eb 100644 --- a/Ryujinx.Graphics.Vulkan/PipelineState.cs +++ b/Ryujinx.Graphics.Vulkan/PipelineState.cs @@ -329,7 +329,7 @@ namespace Ryujinx.Graphics.Vulkan } public unsafe Auto CreateGraphicsPipeline( - Vk api, + VulkanGraphicsDevice gd, Device device, ShaderCollection program, PipelineCache cache, @@ -467,9 +467,10 @@ namespace Ryujinx.Graphics.Vulkan if (VulkanConfiguration.UseDynamicState) { - const int DynamicStates = 7; + bool supportsExtDynamicState = gd.Capabilities.SupportsExtendedDynamicState; + int dynamicStatesCount = supportsExtDynamicState ? 8 : 7; - DynamicState* dynamicStates = stackalloc DynamicState[DynamicStates]; + DynamicState* dynamicStates = stackalloc DynamicState[dynamicStatesCount]; dynamicStates[0] = DynamicState.Viewport; dynamicStates[1] = DynamicState.Scissor; @@ -479,10 +480,15 @@ namespace Ryujinx.Graphics.Vulkan dynamicStates[5] = DynamicState.StencilWriteMask; dynamicStates[6] = DynamicState.StencilReference; + if (supportsExtDynamicState) + { + dynamicStates[7] = DynamicState.VertexInputBindingStrideExt; + } + var pipelineDynamicStateCreateInfo = new PipelineDynamicStateCreateInfo() { SType = StructureType.PipelineDynamicStateCreateInfo, - DynamicStateCount = DynamicStates, + DynamicStateCount = (uint)dynamicStatesCount, PDynamicStates = dynamicStates }; @@ -508,10 +514,10 @@ namespace Ryujinx.Graphics.Vulkan BasePipelineIndex = -1 }; - api.CreateGraphicsPipelines(device, cache, 1, &pipelineCreateInfo, null, &pipelineHandle).ThrowOnError(); + gd.Api.CreateGraphicsPipelines(device, cache, 1, &pipelineCreateInfo, null, &pipelineHandle).ThrowOnError(); } - pipeline = new Auto(new DisposablePipeline(api, device, pipelineHandle)); + pipeline = new Auto(new DisposablePipeline(gd.Api, device, pipelineHandle)); program.AddGraphicsPipeline(ref Internal, pipeline); diff --git a/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs b/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs index 5c64e76ec..66f36855e 100644 --- a/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs +++ b/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs @@ -39,8 +39,10 @@ namespace Ryujinx.Graphics.Vulkan "UNASSIGNED-CoreValidation-Shader-OutputNotConsumed", // TODO: Figure out if fixable "VUID-vkCmdDrawIndexed-None-04584", - // TODO: might be worth looking into making this happy to possibly optimize copies. - "UNASSIGNED-CoreValidation-DrawState-InvalidImageLayout" + // TODO: Might be worth looking into making this happy to possibly optimize copies. + "UNASSIGNED-CoreValidation-DrawState-InvalidImageLayout", + // TODO: Fix this, it's causing too much noise right now. + "VUID-VkSubpassDependency-srcSubpass-00867" }; public static Instance CreateInstance(Vk api, GraphicsDebugLevel logLevel, string[] requiredExtensions, out ExtDebugReport debugReport, out DebugReportCallbackEXT debugReportCallback) @@ -365,10 +367,17 @@ namespace Ryujinx.Graphics.Vulkan NullDescriptor = true }; + var featuresExtendedDynamicState = new PhysicalDeviceExtendedDynamicStateFeaturesEXT() + { + SType = StructureType.PhysicalDeviceExtendedDynamicStateFeaturesExt, + PNext = &featuresRobustness2, + ExtendedDynamicState = supportedExtensions.Contains(ExtExtendedDynamicState.ExtensionName) + }; + var featuresVk12 = new PhysicalDeviceVulkan12Features() { SType = StructureType.PhysicalDeviceVulkan12Features, - PNext = &featuresRobustness2, + PNext = &featuresExtendedDynamicState, DrawIndirectCount = supportedExtensions.Contains(KhrDrawIndirectCount.ExtensionName) };