@@ -1104,6 +1104,18 @@ void Graphics::setDepthMode(CompareMode compare, bool write)
11041104 states.back ().depthWrite = write;
11051105}
11061106
1107+ void Graphics::setDepthClamp (bool enable)
1108+ {
1109+ flushBatchedDraws ();
1110+
1111+ if (optionalDeviceExtensions.extendedDynamicState )
1112+ {
1113+ vkCmdSetDepthClampEnableEXT (commandBuffers.at (currentFrame), Vulkan::getBool (enable));
1114+ }
1115+
1116+ states.back ().depthClampEnable = enable;
1117+ }
1118+
11071119void Graphics::setWireframe (bool enable)
11081120{
11091121 flushBatchedDraws ();
@@ -1357,6 +1369,11 @@ void Graphics::initDynamicState()
13571369 vkCmdSetFrontFaceEXT (
13581370 commandBuffers.at (currentFrame), Vulkan::getFrontFace (states.back ().winding ));
13591371 }
1372+
1373+ if (optionalDeviceExtensions.extendedDynamicState3 )
1374+ {
1375+ vkCmdSetDepthClampEnableEXT (commandBuffers.at (currentFrame), Vulkan::getBool (states.back ().depthClampEnable ));
1376+ }
13601377}
13611378
13621379void Graphics::beginSwapChainFrame ()
@@ -1782,6 +1799,8 @@ static void findOptionalDeviceExtensions(VkPhysicalDevice physicalDevice, Option
17821799 {
17831800 if (strcmp (extension.extensionName , VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME) == 0 )
17841801 optionalDeviceExtensions.extendedDynamicState = true ;
1802+ if (strcmp (extension.extensionName , VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME) == 0 )
1803+ optionalDeviceExtensions.extendedDynamicState3 = true ;
17851804 if (strcmp (extension.extensionName , VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME) == 0 )
17861805 optionalDeviceExtensions.memoryRequirements2 = true ;
17871806 if (strcmp (extension.extensionName , VK_KHR_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0 )
@@ -1844,6 +1863,8 @@ void Graphics::createLogicalDevice()
18441863 std::vector<const char *> enabledExtensions (deviceExtensions.begin (), deviceExtensions.end ());
18451864 if (optionalDeviceExtensions.extendedDynamicState )
18461865 enabledExtensions.push_back (VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
1866+ if (optionalDeviceExtensions.extendedDynamicState3 )
1867+ enabledExtensions.push_back (VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME);
18471868 if (optionalDeviceExtensions.memoryRequirements2 )
18481869 enabledExtensions.push_back (VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
18491870 if (optionalDeviceExtensions.dedicatedAllocation )
@@ -2609,13 +2630,22 @@ void Graphics::prepareDraw(VertexAttributesID attributesID, const BufferBindings
26092630 if (optionalDeviceExtensions.extendedDynamicState )
26102631 {
26112632 vkCmdSetCullModeEXT (commandBuffers.at (currentFrame), Vulkan::getCullMode (cullmode));
2633+ if (!optionalDeviceExtensions.extendedDynamicState3 )
2634+ {
2635+ // If extended dynamic state 3 is not supported, we need to set the depth clamp enable manually via no dynamic state.
2636+ // But the depth clamp enable is not part of the core dynamic state, so we need to use noDynamicState only for depth clamp enable.
2637+ // Rest of the dynamic state is still set via extended dynamic state.
2638+ configuration.noDynamicState .depthClampEnable = states.back ().depthClampEnable ;
2639+ pipeline = s->getCachedGraphicsPipeline (this , configuration);
2640+ }
26122641 pipeline = s->getCachedGraphicsPipeline (this , configuration.core );
26132642 }
26142643 else
26152644 {
26162645 configuration.noDynamicState .winding = states.back ().winding ;
26172646 configuration.noDynamicState .depthState .compare = states.back ().depthTest ;
26182647 configuration.noDynamicState .depthState .write = states.back ().depthWrite ;
2648+ configuration.noDynamicState .depthClampEnable = states.back ().depthClampEnable ;
26192649 configuration.noDynamicState .stencilAction = states.back ().stencil .action ;
26202650 configuration.noDynamicState .stencilCompare = states.back ().stencil .compare ;
26212651 configuration.noDynamicState .cullmode = cullmode;
@@ -3012,7 +3042,6 @@ VkPipeline Graphics::createGraphicsPipeline(Shader *shader, const GraphicsPipeli
30123042
30133043 VkPipelineRasterizationStateCreateInfo rasterizer{};
30143044 rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
3015- rasterizer.depthClampEnable = VK_FALSE;
30163045 rasterizer.rasterizerDiscardEnable = VK_FALSE;
30173046 rasterizer.polygonMode = Vulkan::getPolygonMode (configuration.wireFrame );
30183047 rasterizer.lineWidth = 1 .0f ;
@@ -3022,6 +3051,9 @@ VkPipeline Graphics::createGraphicsPipeline(Shader *shader, const GraphicsPipeli
30223051 rasterizer.frontFace = Vulkan::getFrontFace (noDynamicStateConfiguration->winding );
30233052 }
30243053
3054+ if (!optionalDeviceExtensions.extendedDynamicState3 )
3055+ rasterizer.depthClampEnable = Vulkan::getBool (noDynamicStateConfiguration->depthClampEnable );
3056+
30253057 rasterizer.depthBiasEnable = VK_FALSE;
30263058 rasterizer.depthBiasConstantFactor = 0 .0f ;
30273059 rasterizer.depthBiasClamp = 0 .0f ;
@@ -3098,7 +3130,7 @@ VkPipeline Graphics::createGraphicsPipeline(Shader *shader, const GraphicsPipeli
30983130
30993131 std::vector<VkDynamicState> dynamicStates;
31003132
3101- if (optionalDeviceExtensions.extendedDynamicState )
3133+ if (optionalDeviceExtensions.extendedDynamicState3 )
31023134 dynamicStates = {
31033135 VK_DYNAMIC_STATE_SCISSOR,
31043136 VK_DYNAMIC_STATE_VIEWPORT,
@@ -3111,15 +3143,30 @@ VkPipeline Graphics::createGraphicsPipeline(Shader *shader, const GraphicsPipeli
31113143 VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT,
31123144 VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT,
31133145 VK_DYNAMIC_STATE_STENCIL_OP_EXT,
3114- };
3146+ VK_DYNAMIC_STATE_DEPTH_CLAMP_ENABLE_EXT,
3147+ };
3148+ else if (optionalDeviceExtensions.extendedDynamicState )
3149+ dynamicStates = {
3150+ VK_DYNAMIC_STATE_SCISSOR,
3151+ VK_DYNAMIC_STATE_VIEWPORT,
3152+ VK_DYNAMIC_STATE_STENCIL_WRITE_MASK,
3153+ VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK,
3154+ VK_DYNAMIC_STATE_STENCIL_REFERENCE,
3155+
3156+ VK_DYNAMIC_STATE_CULL_MODE_EXT,
3157+ VK_DYNAMIC_STATE_FRONT_FACE_EXT,
3158+ VK_DYNAMIC_STATE_DEPTH_WRITE_ENABLE_EXT,
3159+ VK_DYNAMIC_STATE_DEPTH_COMPARE_OP_EXT,
3160+ VK_DYNAMIC_STATE_STENCIL_OP_EXT,
3161+ };
31153162 else
31163163 dynamicStates = {
31173164 VK_DYNAMIC_STATE_SCISSOR,
31183165 VK_DYNAMIC_STATE_VIEWPORT,
31193166 VK_DYNAMIC_STATE_STENCIL_WRITE_MASK,
31203167 VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK,
31213168 VK_DYNAMIC_STATE_STENCIL_REFERENCE,
3122- };
3169+ };
31233170
31243171 VkPipelineDynamicStateCreateInfo dynamicState{};
31253172 dynamicState.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
0 commit comments