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.