Răsfoiți Sursa

Vulkan: Support list topology primitive restart (#4483)

gdkchan 3 ani în urmă
părinte
comite
5d85468302

+ 6 - 0
Ryujinx.Graphics.Vulkan/HardwareCapabilities.cs

@@ -33,6 +33,8 @@ namespace Ryujinx.Graphics.Vulkan
         public readonly bool SupportsMultiView;
         public readonly bool SupportsMultiView;
         public readonly bool SupportsNullDescriptors;
         public readonly bool SupportsNullDescriptors;
         public readonly bool SupportsPushDescriptors;
         public readonly bool SupportsPushDescriptors;
+        public readonly bool SupportsPrimitiveTopologyListRestart;
+        public readonly bool SupportsPrimitiveTopologyPatchListRestart;
         public readonly bool SupportsTransformFeedback;
         public readonly bool SupportsTransformFeedback;
         public readonly bool SupportsTransformFeedbackQueries;
         public readonly bool SupportsTransformFeedbackQueries;
         public readonly bool SupportsPreciseOcclusionQueries;
         public readonly bool SupportsPreciseOcclusionQueries;
@@ -63,6 +65,8 @@ namespace Ryujinx.Graphics.Vulkan
             bool supportsMultiView,
             bool supportsMultiView,
             bool supportsNullDescriptors,
             bool supportsNullDescriptors,
             bool supportsPushDescriptors,
             bool supportsPushDescriptors,
+            bool supportsPrimitiveTopologyListRestart,
+            bool supportsPrimitiveTopologyPatchListRestart,
             bool supportsTransformFeedback,
             bool supportsTransformFeedback,
             bool supportsTransformFeedbackQueries,
             bool supportsTransformFeedbackQueries,
             bool supportsPreciseOcclusionQueries,
             bool supportsPreciseOcclusionQueries,
@@ -92,6 +96,8 @@ namespace Ryujinx.Graphics.Vulkan
             SupportsMultiView = supportsMultiView;
             SupportsMultiView = supportsMultiView;
             SupportsNullDescriptors = supportsNullDescriptors;
             SupportsNullDescriptors = supportsNullDescriptors;
             SupportsPushDescriptors = supportsPushDescriptors;
             SupportsPushDescriptors = supportsPushDescriptors;
+            SupportsPrimitiveTopologyListRestart = supportsPrimitiveTopologyListRestart;
+            SupportsPrimitiveTopologyPatchListRestart = supportsPrimitiveTopologyPatchListRestart;
             SupportsTransformFeedback = supportsTransformFeedback;
             SupportsTransformFeedback = supportsTransformFeedback;
             SupportsTransformFeedbackQueries = supportsTransformFeedbackQueries;
             SupportsTransformFeedbackQueries = supportsTransformFeedbackQueries;
             SupportsPreciseOcclusionQueries = supportsPreciseOcclusionQueries;
             SupportsPreciseOcclusionQueries = supportsPreciseOcclusionQueries;

+ 16 - 5
Ryujinx.Graphics.Vulkan/PipelineState.cs

@@ -417,11 +417,22 @@ namespace Ryujinx.Graphics.Vulkan
 
 
                 bool primitiveRestartEnable = PrimitiveRestartEnable;
                 bool primitiveRestartEnable = PrimitiveRestartEnable;
 
 
-                primitiveRestartEnable &= Topology == PrimitiveTopology.LineStrip ||
-                                          Topology == PrimitiveTopology.TriangleStrip ||
-                                          Topology == PrimitiveTopology.TriangleFan ||
-                                          Topology == PrimitiveTopology.LineStripWithAdjacency ||
-                                          Topology == PrimitiveTopology.TriangleStripWithAdjacency;
+                bool topologySupportsRestart;
+
+                if (gd.Capabilities.SupportsPrimitiveTopologyListRestart)
+                {
+                    topologySupportsRestart = gd.Capabilities.SupportsPrimitiveTopologyPatchListRestart || Topology != PrimitiveTopology.PatchList;
+                }
+                else
+                {
+                    topologySupportsRestart = Topology == PrimitiveTopology.LineStrip ||
+                                              Topology == PrimitiveTopology.TriangleStrip ||
+                                              Topology == PrimitiveTopology.TriangleFan ||
+                                              Topology == PrimitiveTopology.LineStripWithAdjacency ||
+                                              Topology == PrimitiveTopology.TriangleStripWithAdjacency;
+                }
+
+                primitiveRestartEnable &= topologySupportsRestart;
 
 
                 var inputAssemblyState = new PipelineInputAssemblyStateCreateInfo()
                 var inputAssemblyState = new PipelineInputAssemblyStateCreateInfo()
                 {
                 {

+ 27 - 0
Ryujinx.Graphics.Vulkan/VulkanInitialization.cs

@@ -32,6 +32,7 @@ namespace Ryujinx.Graphics.Vulkan
             "VK_EXT_descriptor_indexing", // Enabling this works around an issue with disposed buffer bindings on RADV.
             "VK_EXT_descriptor_indexing", // Enabling this works around an issue with disposed buffer bindings on RADV.
             "VK_EXT_fragment_shader_interlock",
             "VK_EXT_fragment_shader_interlock",
             "VK_EXT_index_type_uint8",
             "VK_EXT_index_type_uint8",
+            "VK_EXT_primitive_topology_list_restart",
             "VK_EXT_robustness2",
             "VK_EXT_robustness2",
             "VK_EXT_shader_stencil_export",
             "VK_EXT_shader_stencil_export",
             "VK_KHR_shader_float16_int8",
             "VK_KHR_shader_float16_int8",
@@ -429,6 +430,17 @@ namespace Ryujinx.Graphics.Vulkan
                 features2.PNext = &supportedFeaturesCustomBorderColor;
                 features2.PNext = &supportedFeaturesCustomBorderColor;
             }
             }
 
 
+            PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT supportedFeaturesPrimitiveTopologyListRestart = new PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT()
+            {
+                SType = StructureType.PhysicalDevicePrimitiveTopologyListRestartFeaturesExt,
+                PNext = features2.PNext
+            };
+
+            if (supportedExtensions.Contains("VK_EXT_primitive_topology_list_restart"))
+            {
+                features2.PNext = &supportedFeaturesPrimitiveTopologyListRestart;
+            }
+
             PhysicalDeviceTransformFeedbackFeaturesEXT supportedFeaturesTransformFeedback = new PhysicalDeviceTransformFeedbackFeaturesEXT()
             PhysicalDeviceTransformFeedbackFeaturesEXT supportedFeaturesTransformFeedback = new PhysicalDeviceTransformFeedbackFeaturesEXT()
             {
             {
                 SType = StructureType.PhysicalDeviceTransformFeedbackFeaturesExt,
                 SType = StructureType.PhysicalDeviceTransformFeedbackFeaturesExt,
@@ -497,6 +509,21 @@ namespace Ryujinx.Graphics.Vulkan
                 pExtendedFeatures = &featuresTransformFeedback;
                 pExtendedFeatures = &featuresTransformFeedback;
             }
             }
 
 
+            PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT featuresPrimitiveTopologyListRestart;
+
+            if (supportedExtensions.Contains("VK_EXT_primitive_topology_list_restart"))
+            {
+                featuresPrimitiveTopologyListRestart = new PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT()
+                {
+                    SType = StructureType.PhysicalDevicePrimitiveTopologyListRestartFeaturesExt,
+                    PNext = pExtendedFeatures,
+                    PrimitiveTopologyListRestart = supportedFeaturesPrimitiveTopologyListRestart.PrimitiveTopologyListRestart,
+                    PrimitiveTopologyPatchListRestart = supportedFeaturesPrimitiveTopologyListRestart.PrimitiveTopologyPatchListRestart
+                };
+
+                pExtendedFeatures = &featuresPrimitiveTopologyListRestart;
+            }
+
             PhysicalDeviceRobustness2FeaturesEXT featuresRobustness2;
             PhysicalDeviceRobustness2FeaturesEXT featuresRobustness2;
 
 
             if (supportedExtensions.Contains("VK_EXT_robustness2"))
             if (supportedExtensions.Contains("VK_EXT_robustness2"))

+ 13 - 0
Ryujinx.Graphics.Vulkan/VulkanRenderer.cs

@@ -195,6 +195,11 @@ namespace Ryujinx.Graphics.Vulkan
                 SType = StructureType.PhysicalDeviceFeatures2
                 SType = StructureType.PhysicalDeviceFeatures2
             };
             };
 
 
+            PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT featuresPrimitiveTopologyListRestart = new PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT()
+            {
+                SType = StructureType.PhysicalDevicePrimitiveTopologyListRestartFeaturesExt
+            };
+
             PhysicalDeviceRobustness2FeaturesEXT featuresRobustness2 = new PhysicalDeviceRobustness2FeaturesEXT()
             PhysicalDeviceRobustness2FeaturesEXT featuresRobustness2 = new PhysicalDeviceRobustness2FeaturesEXT()
             {
             {
                 SType = StructureType.PhysicalDeviceRobustness2FeaturesExt
                 SType = StructureType.PhysicalDeviceRobustness2FeaturesExt
@@ -215,8 +220,14 @@ namespace Ryujinx.Graphics.Vulkan
                 SType = StructureType.PhysicalDevicePortabilitySubsetFeaturesKhr
                 SType = StructureType.PhysicalDevicePortabilitySubsetFeaturesKhr
             };
             };
 
 
+            if (supportedExtensions.Contains("VK_EXT_primitive_topology_list_restart"))
+            {
+                features2.PNext = &featuresPrimitiveTopologyListRestart;
+            }
+
             if (supportedExtensions.Contains("VK_EXT_robustness2"))
             if (supportedExtensions.Contains("VK_EXT_robustness2"))
             {
             {
+                featuresRobustness2.PNext = features2.PNext;
                 features2.PNext = &featuresRobustness2;
                 features2.PNext = &featuresRobustness2;
             }
             }
 
 
@@ -288,6 +299,8 @@ namespace Ryujinx.Graphics.Vulkan
                 features2.Features.MultiViewport,
                 features2.Features.MultiViewport,
                 featuresRobustness2.NullDescriptor || IsMoltenVk,
                 featuresRobustness2.NullDescriptor || IsMoltenVk,
                 supportedExtensions.Contains(KhrPushDescriptor.ExtensionName),
                 supportedExtensions.Contains(KhrPushDescriptor.ExtensionName),
+                featuresPrimitiveTopologyListRestart.PrimitiveTopologyListRestart,
+                featuresPrimitiveTopologyListRestart.PrimitiveTopologyPatchListRestart,
                 supportsTransformFeedback,
                 supportsTransformFeedback,
                 propertiesTransformFeedback.TransformFeedbackQueries,
                 propertiesTransformFeedback.TransformFeedbackQueries,
                 features2.Features.OcclusionQueryPrecise,
                 features2.Features.OcclusionQueryPrecise,