From 8a3044a3422c95b5f8450eef8ee39ea6ca89ab56 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 24 Apr 2019 22:39:51 +0200 Subject: [PATCH] [dxvk] Implement depth bounds test in backend --- src/dxvk/dxvk_cmdlist.h | 9 +++++++++ src/dxvk/dxvk_constant_state.h | 24 ++++++++++++++++++++++++ src/dxvk/dxvk_context.cpp | 33 ++++++++++++++++++++++++++++++++- src/dxvk/dxvk_context.h | 10 ++++++++++ src/dxvk/dxvk_context_state.h | 3 +++ src/dxvk/dxvk_graphics.cpp | 2 +- 6 files changed, 79 insertions(+), 2 deletions(-) diff --git a/src/dxvk/dxvk_cmdlist.h b/src/dxvk/dxvk_cmdlist.h index 318ac1af..0f5e738f 100644 --- a/src/dxvk/dxvk_cmdlist.h +++ b/src/dxvk/dxvk_cmdlist.h @@ -672,6 +672,15 @@ namespace dxvk { } + void cmdSetDepthBounds( + float minDepthBounds, + float maxDepthBounds) { + m_vkd->vkCmdSetDepthBounds(m_execBuffer, + minDepthBounds, + maxDepthBounds); + } + + void cmdSetEvent( VkEvent event, VkPipelineStageFlags stages) { diff --git a/src/dxvk/dxvk_constant_state.h b/src/dxvk/dxvk_constant_state.h index 715864f7..b2b87d67 100644 --- a/src/dxvk/dxvk_constant_state.h +++ b/src/dxvk/dxvk_constant_state.h @@ -51,6 +51,30 @@ namespace dxvk { || depthBiasClamp != other.depthBiasClamp; } }; + + + /** + * \brief Depth bounds + * + * Stores depth bounds values. + */ + struct DxvkDepthBounds { + VkBool32 enableDepthBounds; + float minDepthBounds; + float maxDepthBounds; + + bool operator == (const DxvkDepthBounds& other) const { + return enableDepthBounds == other.enableDepthBounds + && minDepthBounds == other.minDepthBounds + && maxDepthBounds == other.maxDepthBounds; + } + + bool operator != (const DxvkDepthBounds& other) const { + return enableDepthBounds != other.enableDepthBounds + || minDepthBounds != other.minDepthBounds + || maxDepthBounds != other.maxDepthBounds; + } + }; /** diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index aaee55af..2504bf5a 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -60,6 +60,7 @@ namespace dxvk { DxvkContextFlag::GpDirtyStencilRef, DxvkContextFlag::GpDirtyViewport, DxvkContextFlag::GpDirtyDepthBias, + DxvkContextFlag::GpDirtyDepthBounds, DxvkContextFlag::CpDirtyPipeline, DxvkContextFlag::CpDirtyPipelineState, DxvkContextFlag::CpDirtyResources, @@ -2018,6 +2019,20 @@ namespace dxvk { m_flags.set(DxvkContextFlag::GpDirtyDepthBias); } } + + + void DxvkContext::setDepthBounds( + DxvkDepthBounds depthBounds) { + if (m_state.dyn.depthBounds != depthBounds) { + m_state.dyn.depthBounds = depthBounds; + m_flags.set(DxvkContextFlag::GpDirtyDepthBounds); + } + + if (m_state.gp.state.dsEnableDepthBoundsTest != depthBounds.enableDepthBounds) { + m_state.gp.state.dsEnableDepthBoundsTest = depthBounds.enableDepthBounds; + m_flags.set(DxvkContextFlag::GpDirtyPipelineState); + } + } void DxvkContext::setStencilReference( @@ -3250,6 +3265,7 @@ namespace dxvk { DxvkContextFlag::GpDirtyStencilRef, DxvkContextFlag::GpDirtyViewport, DxvkContextFlag::GpDirtyDepthBias, + DxvkContextFlag::GpDirtyDepthBounds, DxvkContextFlag::GpDirtyPredicate); m_gpActivePipeline = VK_NULL_HANDLE; @@ -3298,6 +3314,7 @@ namespace dxvk { // are not dynamic will be invalidated in the command buffer. m_flags.clr(DxvkContextFlag::GpDynamicBlendConstants, DxvkContextFlag::GpDynamicDepthBias, + DxvkContextFlag::GpDynamicDepthBounds, DxvkContextFlag::GpDynamicStencilRef); m_flags.set(m_state.gp.state.useDynamicBlendConstants() @@ -3308,6 +3325,10 @@ namespace dxvk { ? DxvkContextFlag::GpDynamicDepthBias : DxvkContextFlag::GpDirtyDepthBias); + m_flags.set(m_state.gp.state.useDynamicDepthBounds() + ? DxvkContextFlag::GpDynamicDepthBounds + : DxvkContextFlag::GpDirtyDepthBounds); + m_flags.set(m_state.gp.state.useDynamicStencilRef() ? DxvkContextFlag::GpDynamicStencilRef : DxvkContextFlag::GpDirtyStencilRef); @@ -3780,6 +3801,15 @@ namespace dxvk { m_state.dyn.depthBias.depthBiasClamp, m_state.dyn.depthBias.depthBiasSlope); } + + if (m_flags.all(DxvkContextFlag::GpDirtyDepthBounds, + DxvkContextFlag::GpDynamicDepthBounds)) { + m_flags.clr(DxvkContextFlag::GpDirtyDepthBounds); + + m_cmd->cmdSetDepthBounds( + m_state.dyn.depthBounds.minDepthBounds, + m_state.dyn.depthBounds.maxDepthBounds); + } } @@ -3858,7 +3888,8 @@ namespace dxvk { DxvkContextFlag::GpDirtyViewport, DxvkContextFlag::GpDirtyBlendConstants, DxvkContextFlag::GpDirtyStencilRef, - DxvkContextFlag::GpDirtyDepthBias)) + DxvkContextFlag::GpDirtyDepthBias, + DxvkContextFlag::GpDirtyDepthBounds)) this->updateDynamicState(); } diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index c6a8b538..6bf05bac 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -778,6 +778,16 @@ namespace dxvk { void setDepthBias( DxvkDepthBias depthBias); + /** + * \brief Sets depth bounds + * + * Enables or disables the depth bounds test, + * and updates the values if necessary. + * \param [in] depthBounds Depth bounds + */ + void setDepthBounds( + DxvkDepthBounds depthBounds); + /** * \brief Sets stencil reference * diff --git a/src/dxvk/dxvk_context_state.h b/src/dxvk/dxvk_context_state.h index 5cae2d69..f7dca11b 100644 --- a/src/dxvk/dxvk_context_state.h +++ b/src/dxvk/dxvk_context_state.h @@ -37,11 +37,13 @@ namespace dxvk { GpDirtyXfbCounters, ///< Counter buffer values are dirty GpDirtyBlendConstants, ///< Blend constants have changed GpDirtyDepthBias, ///< Depth bias has changed + GpDirtyDepthBounds, ///< Depth bounds have changed GpDirtyStencilRef, ///< Stencil reference has changed GpDirtyViewport, ///< Viewport state has changed GpDirtyPredicate, ///< Predicate has changed GpDynamicBlendConstants, ///< Blend constants are dynamic GpDynamicDepthBias, ///< Depth bias is dynamic + GpDynamicDepthBounds, ///< Depth bounds are dynamic GpDynamicStencilRef, ///< Stencil reference is dynamic CpDirtyPipeline, ///< Compute pipeline binding are out of date @@ -135,6 +137,7 @@ namespace dxvk { struct DxvkDynamicState { DxvkBlendConstants blendConstants = { 0.0f, 0.0f, 0.0f, 0.0f }; DxvkDepthBias depthBias = { 0.0f, 0.0f, 0.0f }; + DxvkDepthBounds depthBounds = { false, 0.0f, 1.0f }; uint32_t stencilReference = 0; }; diff --git a/src/dxvk/dxvk_graphics.cpp b/src/dxvk/dxvk_graphics.cpp index e177737a..25454610 100644 --- a/src/dxvk/dxvk_graphics.cpp +++ b/src/dxvk/dxvk_graphics.cpp @@ -357,7 +357,7 @@ namespace dxvk { dsInfo.depthTestEnable = state.dsEnableDepthTest; dsInfo.depthWriteEnable = state.dsEnableDepthWrite && !util::isDepthReadOnlyLayout(passFormat.depth.layout); dsInfo.depthCompareOp = state.dsDepthCompareOp; - dsInfo.depthBoundsTestEnable = VK_FALSE; + dsInfo.depthBoundsTestEnable = state.dsEnableDepthBoundsTest; dsInfo.stencilTestEnable = state.dsEnableStencilTest; dsInfo.front = state.dsStencilOpFront; dsInfo.back = state.dsStencilOpBack;