VK_EXT_extended_dynamic_state3
This document details the motivation behind another extended dynamic state extension, which follows VK_EXT_extended_dynamic_state and VK_EXT_extended_dynamic_state2.
1. Problem Statement
Since the release of VK_EXT_extended_dynamic_state and VK_EXT_extended_dynamic_state2 in Vulkan 1.3, which made more pipeline state dynamic, there is still some remaining pipeline state that cannot be changed dynamically. Dynamic state helps applications reduce the number of pipelines they need to create and bind. It was also noted that several extensions that add pipeline state lack dynamic state equivalents.
Reducing the amount of state required to build a pipeline can also help applications build pipelines ahead of time and avoid hitching since that state might not be known until right before the draw command is recorded. By making it dynamic there is less state that applications need to hash and cache for on-demand pipeline creation.
These additional dynamic states can also help pare down the pipeline state to help other extensions build on this and potentially remove the need to create and bind linked monolithic pipeline objects at all.
2. Solution Space
This proposal adds more dynamic state that hardware vendors can optionally implement, with enough in common between most vendors to be useful for applications. This extension also sets a baseline for a potential roadmap for future hardware to handle all dynamic state efficiently.
Some of the dynamic state added by this proposal may not have immediate benefits for applications since the state could be constant throughout the application, but it is added anyway to capture as much pipeline state as possible and lay a foundation for potentially doing away with linked monolithic pipeline objects.
Adding more and more dynamic state by itself is not the solution to all pipeline problems, and this extension does not attempt go beyond adding dynamic state to address those other problems.
3. Proposal
IHVs should only implement support for the dynamic state below if it is efficient on their platform. Feature bits are provided for all state so IHVs can implement any subset of VK_EXT_extended_dynamic_state3.
3.1. New Dynamic State
This adds the following dynamic state:
- VK_DYNAMIC_STATE_TESSELLATION_DOMAIN_ORIGIN_EXT
-
VkPipelineTessellationDomainOriginStateCreateInfo::domainOrigin
-
Assuming VkPhysicalDeviceFeatures::tessellationShader is enabled
-
Requires VK_KHR_maintenance2
-
- VK_DYNAMIC_STATE_DEPTH_CLAMP_ENABLE_EXT
-
VkPipelineRasterizationStateCreateInfo::depthClampEnable
-
Assuming VkPhysicalDeviceFeatures::depthClamp is enabled
-
- VK_DYNAMIC_STATE_POLYGON_MODE_EXT
-
VkPipelineRasterizationStateCreateInfo::polygonMode
-
Assuming VkPhysicalDeviceFeatures::fillModeNonSolid is enabled
-
- VK_DYNAMIC_STATE_RASTERIZATION_SAMPLES_EXT
-
VkPipelineMultisampleStateCreateInfo::rasterizationSamples
-
There are restrictions on what values this can be set to based on the variableMultisampleRate feature, the render pass instance attachments, and the extensions VK_NV_framebuffer_mixed_samples and VK_AMD_mixed_attachment_samples.
-
- VK_DYNAMIC_STATE_SAMPLE_MASK_EXT
-
VkPipelineMultisampleStateCreateInfo::pSampleMask
- VK_DYNAMIC_STATE_ALPHA_TO_COVERAGE_ENABLE_EXT
-
VkPipelineMultisampleStateCreateInfo::alphaToCoverageEnable
- VK_DYNAMIC_STATE_ALPHA_TO_ONE_ENABLE_EXT
-
VkPipelineMultisampleStateCreateInfo::alphaToOneEnable
-
Assuming VkPhysicalDeviceFeatures::alphaToOne is enabled
-
- VK_DYNAMIC_STATE_LOGIC_OP_ENABLE_EXT
-
VkPipelineColorBlendStateCreateInfo::logicOpEnable
-
Assuming VkPhysicalDeviceFeatures::logicOp is enabled
-
- VK_DYNAMIC_STATE_COLOR_BLEND_ENABLE_EXT
-
Per-attachment:
-
VkPipelineColorBlendAttachmentState::blendEnable
-
- VK_DYNAMIC_STATE_COLOR_BLEND_EQUATION_EXT
-
Per-attachment:
-
VkPipelineColorBlendAttachmentState::srcColorBlendFactor
-
VkPipelineColorBlendAttachmentState::dstColorBlendFactor
-
VkPipelineColorBlendAttachmentState::colorBlendOp
-
VkPipelineColorBlendAttachmentState::srcAlphaBlendFactor
-
VkPipelineColorBlendAttachmentState::dstAlphaBlendFactor
-
VkPipelineColorBlendAttachmentState::alphaBlendOp
-
- VK_DYNAMIC_STATE_COLOR_WRITE_MASK_EXT
-
Per-attachment:
-
VkPipelineColorBlendAttachmentState::colorWriteMask
-
- VK_DYNAMIC_STATE_RASTERIZATION_STREAM_EXT
-
VkPipelineRasterizationStateStreamCreateInfoEXT::rasterizationStream
-
Assuming VkPhysicalDeviceTransformFeedbackFeaturesEXT::geometryStreams is enabled
-
Requires VK_EXT_transform_feedback
-
- VK_DYNAMIC_STATE_CONSERVATIVE_RASTERIZATION_MODE_EXT
-
VkPipelineRasterizationConservativeStateCreateInfoEXT::conservativeRasterizationMode
-
Assuming VK_EXT_conservative_rasterization is enabled
-
Also depends on VkPhysicalDeviceConservativeRasterizationPropertiesEXT::primitiveUnderestimation
-
-
Requires VK_EXT_conservative_rasterization
-
- VK_DYNAMIC_STATE_EXTRA_PRIMITIVE_OVERESTIMATION_SIZE_EXT
-
VkPipelineRasterizationConservativeStateCreateInfoEXT::extraPrimitiveOverestimationSize
-
Assuming VK_EXT_conservative_rasterization is enabled
-
Requires VK_EXT_conservative_rasterization
-
- VK_DYNAMIC_STATE_DEPTH_CLIP_ENABLE_EXT
-
VkPipelineRasterizationDepthClipStateCreateInfoEXT::depthClipEnable
-
Assuming VkPhysicalDeviceDepthClipEnableFeaturesEXT::depthClipEnable is enabled
-
Requires VK_EXT_depth_clip_enable
-
- VK_DYNAMIC_STATE_SAMPLE_LOCATIONS_ENABLE_EXT
-
VkPipelineSampleLocationsStateCreateInfoEXT::sampleLocationsEnable
-
Assuming VK_EXT_sample_locations is enabled
-
Requires VK_EXT_sample_locations
-
- VK_DYNAMIC_STATE_COLOR_BLEND_ADVANCED_EXT
-
Per-attachment:
-
VkPipelineColorBlendAttachmentState::colorBlendOp
-
VkPipelineColorBlendAdvancedStateCreateInfoEXT::srcPremultiplied
-
VkPipelineColorBlendAdvancedStateCreateInfoEXT::dstPremultiplied
-
VkPipelineColorBlendAdvancedStateCreateInfoEXT::blendOverlap
-
Requires VK_EXT_blend_operation_advanced
-
-
- VK_DYNAMIC_STATE_PROVOKING_VERTEX_MODE_EXT
-
VkPipelineRasterizationProvokingVertexStateCreateInfoEXT::provokingVertexMode
-
Assuming VkPhysicalDeviceProvokingVertexFeaturesEXT::provokingVertexLast is enabled
-
Requires VK_EXT_provoking_vertex
-
- VK_DYNAMIC_STATE_LINE_RASTERIZATION_MODE_EXT
-
VkPipelineRasterizationLineStateCreateInfoEXT::lineRasterizationMode
-
Assuming VK_EXT_line_rasterization is enabled
-
Requires VK_EXT_line_rasterization
-
- VK_DYNAMIC_STATE_LINE_STIPPLE_ENABLE_EXT
-
VkPipelineRasterizationLineStateCreateInfoEXT::stippledLineEnable
-
Assuming VK_EXT_line_rasterization is enabled
-
Requires VK_EXT_line_rasterization
-
- VK_DYNAMIC_STATE_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE_EXT
-
VkPipelineViewportDepthClipControlCreateInfoEXT::negativeOneToOne
-
Assuming VkPhysicalDeviceDepthClipControlFeaturesEXT::depthClipControl is enabled
-
Requires VK_EXT_depth_clip_control
-
- VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_ENABLE_NV
-
VkPipelineViewportWScalingStateCreateInfoNV::viewportWScalingEnable
-
Assuming VK_NV_clip_space_w_scaling is enabled
-
Requires VK_NV_clip_space_w_scaling
-
- VK_DYNAMIC_STATE_VIEWPORT_SWIZZLE_NV
-
VkPipelineViewportSwizzleStateCreateInfoNV::pViewportSwizzles
-
Assuming VK_NV_viewport_swizzle is enabled
-
Requires VK_NV_viewport_swizzle
-
- VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_ENABLE_NV
-
VkPipelineCoverageToColorStateCreateInfoNV::coverageToColorEnable
-
Assuming VK_NV_fragment_coverage_to_color is enabled
-
Requires VK_NV_fragment_coverage_to_color
-
- VK_DYNAMIC_STATE_COVERAGE_TO_COLOR_LOCATION_NV
-
VkPipelineCoverageToColorStateCreateInfoNV::coverageToColorLocation
-
Assuming VK_NV_fragment_coverage_to_color is enabled
-
Requires VK_NV_fragment_coverage_to_color
-
- VK_DYNAMIC_STATE_COVERAGE_MODULATION_MODE_NV
-
VkPipelineCoverageModulationStateCreateInfoNV::coverageModulationMode
-
Assuming VK_NV_framebuffer_mixed_samples is enabled
-
Requires VK_NV_framebuffer_mixed_samples
-
- VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_ENABLE_NV
-
VkPipelineCoverageModulationStateCreateInfoNV::coverageModulationTableEnable
-
Assuming VK_NV_framebuffer_mixed_samples is enabled
-
Requires VK_NV_framebuffer_mixed_samples
-
- VK_DYNAMIC_STATE_COVERAGE_MODULATION_TABLE_NV
-
VkPipelineCoverageModulationStateCreateInfoNV::pCoverageModulationTable
-
Assuming VK_NV_framebuffer_mixed_samples is enabled
-
Requires VK_NV_framebuffer_mixed_samples
-
- VK_DYNAMIC_STATE_COVERAGE_REDUCTION_MODE_NV
-
VkPipelineCoverageReductionStateCreateInfoNV::coverageReductionMode
-
Assuming VkPhysicalDeviceCoverageReductionModeFeaturesNV::coverageReductionMode is enabled
-
Requires VK_NV_coverage_reduction_mode
-
- VK_DYNAMIC_STATE_REPRESENTATIVE_FRAGMENT_TEST_ENABLE_NV
-
VkPipelineRepresentativeFragmentTestStateCreateInfoNV::representativeFragmentTestEnable
-
Assuming VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV::representativeFragmentTest is enabled
-
Requires VK_NV_representative_fragment_test
-
- VK_DYNAMIC_STATE_SHADING_RATE_IMAGE_ENABLE_NV
-
VkPipelineViewportShadingRateImageStateCreateInfoNV::shadingRateImageEnable
-
Assuming VkPhysicalDeviceShadingRateImageFeaturesNV::shadingRateImage is enabled
-
Requires VK_NV_shading_rate_image
-
3.2. New Properties
- VkPhysicalDeviceExtendedDynamicState3PropertiesEXT::dynamicPrimitiveTopologyUnrestricted
-
Indicates that VkPipelineInputAssemblyStateCreateInfo::topology is ignored when VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT is enabled, and the application can set any primitive topology in any primitive topology class with vkCmdSetPrimitiveTopology.