diff --git a/src/dxvk/dxvk_cmdlist.h b/src/dxvk/dxvk_cmdlist.h index 43267db11..a0b3be0ed 100644 --- a/src/dxvk/dxvk_cmdlist.h +++ b/src/dxvk/dxvk_cmdlist.h @@ -669,6 +669,12 @@ namespace dxvk { } + void cmdSetDepthBiasState( + VkBool32 depthBiasEnable) { + m_vkd->vkCmdSetDepthBiasEnable(m_execBuffer, depthBiasEnable); + } + + void cmdSetDepthBias( float depthBiasConstantFactor, float depthBiasClamp, diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 3bbee0777..9650f0de1 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -4547,8 +4547,8 @@ namespace dxvk { m_state.gp.state.ds.enableDepthBoundsTest()); } - if (!m_flags.test(DxvkContextFlag::GpDynamicDepthBias)) - m_cmd->cmdSetDepthBias(0.0f, 0.0f, 0.0f); + m_cmd->cmdSetDepthBiasState( + m_state.gp.state.rs.depthBiasEnable()); if (!m_flags.test(DxvkContextFlag::GpDynamicRasterizerState)) m_cmd->cmdSetRasterizerState(VK_CULL_MODE_FRONT_AND_BACK, VK_FRONT_FACE_CLOCKWISE); diff --git a/src/dxvk/dxvk_shader.cpp b/src/dxvk/dxvk_shader.cpp index ece845a43..b65931892 100644 --- a/src/dxvk/dxvk_shader.cpp +++ b/src/dxvk/dxvk_shader.cpp @@ -547,10 +547,11 @@ namespace dxvk { // Set up dynamic state. We do not know any pipeline state // at this time, so make as much state dynamic as we can. - std::array dynamicStates = {{ + std::array dynamicStates = {{ VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT, VK_DYNAMIC_STATE_SCISSOR_WITH_COUNT, VK_DYNAMIC_STATE_DEPTH_BIAS, + VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE, VK_DYNAMIC_STATE_CULL_MODE, VK_DYNAMIC_STATE_FRONT_FACE, }}; @@ -562,17 +563,14 @@ namespace dxvk { // All viewport state is dynamic, so we do not need to initialize this. VkPipelineViewportStateCreateInfo vpInfo = { VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO }; - // Set up rasterizer state. Depth bias, cull mode and front face are all - // dynamic, but we do not have dynamic state for depth bias enablement - // with the original version of VK_EXT_extended_dynamic_state, so always - // enable that. Do not support any polygon modes other than FILL. + // Set up rasterizer state. Depth bias, cull mode and front face are + // all dynamic. Do not support any polygon modes other than FILL. VkPipelineRasterizationDepthClipStateCreateInfoEXT rsDepthClipInfo = { VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT }; VkPipelineRasterizationStateCreateInfo rsInfo = { VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO }; rsInfo.depthClampEnable = VK_TRUE; rsInfo.rasterizerDiscardEnable = VK_FALSE; rsInfo.polygonMode = VK_POLYGON_MODE_FILL; - rsInfo.depthBiasEnable = VK_TRUE; rsInfo.lineWidth = 1.0f; if (m_device->features().extDepthClipEnable.depthClipEnable) {