Vulkan: Support list topology primitive restart (#4483)
This commit is contained in:
parent
9b1cc2cec6
commit
5d85468302
4 changed files with 62 additions and 5 deletions
|
@ -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;
|
||||||
|
|
|
@ -417,11 +417,22 @@ namespace Ryujinx.Graphics.Vulkan
|
||||||
|
|
||||||
bool primitiveRestartEnable = PrimitiveRestartEnable;
|
bool primitiveRestartEnable = PrimitiveRestartEnable;
|
||||||
|
|
||||||
primitiveRestartEnable &= Topology == PrimitiveTopology.LineStrip ||
|
bool topologySupportsRestart;
|
||||||
|
|
||||||
|
if (gd.Capabilities.SupportsPrimitiveTopologyListRestart)
|
||||||
|
{
|
||||||
|
topologySupportsRestart = gd.Capabilities.SupportsPrimitiveTopologyPatchListRestart || Topology != PrimitiveTopology.PatchList;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
topologySupportsRestart = Topology == PrimitiveTopology.LineStrip ||
|
||||||
Topology == PrimitiveTopology.TriangleStrip ||
|
Topology == PrimitiveTopology.TriangleStrip ||
|
||||||
Topology == PrimitiveTopology.TriangleFan ||
|
Topology == PrimitiveTopology.TriangleFan ||
|
||||||
Topology == PrimitiveTopology.LineStripWithAdjacency ||
|
Topology == PrimitiveTopology.LineStripWithAdjacency ||
|
||||||
Topology == PrimitiveTopology.TriangleStripWithAdjacency;
|
Topology == PrimitiveTopology.TriangleStripWithAdjacency;
|
||||||
|
}
|
||||||
|
|
||||||
|
primitiveRestartEnable &= topologySupportsRestart;
|
||||||
|
|
||||||
var inputAssemblyState = new PipelineInputAssemblyStateCreateInfo()
|
var inputAssemblyState = new PipelineInputAssemblyStateCreateInfo()
|
||||||
{
|
{
|
||||||
|
|
|
@ -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"))
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Reference in a new issue