diff --git a/src/rendering/vulkan/renderer/vk_renderpass.cpp b/src/rendering/vulkan/renderer/vk_renderpass.cpp index 4e6b3b118..e7d38588d 100644 --- a/src/rendering/vulkan/renderer/vk_renderpass.cpp +++ b/src/rendering/vulkan/renderer/vk_renderpass.cpp @@ -245,7 +245,7 @@ void VkRenderPassSetup::CreatePipeline(const VkRenderPassKey &key) builder.addDynamicState(VK_DYNAMIC_STATE_VIEWPORT); builder.addDynamicState(VK_DYNAMIC_STATE_SCISSOR); // builder.addDynamicState(VK_DYNAMIC_STATE_LINE_WIDTH); - // builder.addDynamicState(VK_DYNAMIC_STATE_DEPTH_BIAS); + builder.addDynamicState(VK_DYNAMIC_STATE_DEPTH_BIAS); // builder.addDynamicState(VK_DYNAMIC_STATE_BLEND_CONSTANTS); // builder.addDynamicState(VK_DYNAMIC_STATE_DEPTH_BOUNDS); // builder.addDynamicState(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK); @@ -296,6 +296,7 @@ void VkRenderPassSetup::CreatePipeline(const VkRenderPassKey &key) builder.setDepthStencilEnable(key.DepthTest, key.DepthWrite, key.StencilTest); builder.setDepthFunc(depthfunc2vk[key.DepthFunc]); builder.setDepthClampEnable(key.DepthClamp); + builder.setDepthBias(key.DepthBias, 0.0f, 0.0f, 0.0f); builder.setCull(key.CullMode == Cull_None ? VK_CULL_MODE_NONE : VK_CULL_MODE_FRONT_AND_BACK, key.CullMode == Cull_CW ? VK_FRONT_FACE_CLOCKWISE : VK_FRONT_FACE_COUNTER_CLOCKWISE); builder.setColorWriteMask((VkColorComponentFlagBits)key.ColorMask); builder.setStencil(VK_STENCIL_OP_KEEP, op2vk[key.StencilPassOp], VK_STENCIL_OP_KEEP, VK_COMPARE_OP_EQUAL, 0xffffffff, 0xffffffff, 0); diff --git a/src/rendering/vulkan/renderer/vk_renderpass.h b/src/rendering/vulkan/renderer/vk_renderpass.h index 108f36bbb..6d9a993ce 100644 --- a/src/rendering/vulkan/renderer/vk_renderpass.h +++ b/src/rendering/vulkan/renderer/vk_renderpass.h @@ -19,6 +19,7 @@ public: int DepthTest; int DepthFunc; int DepthClamp; + int DepthBias; int StencilTest; int StencilPassOp; int ColorMask; diff --git a/src/rendering/vulkan/renderer/vk_renderstate.cpp b/src/rendering/vulkan/renderer/vk_renderstate.cpp index dd19ff7b0..886263118 100644 --- a/src/rendering/vulkan/renderer/vk_renderstate.cpp +++ b/src/rendering/vulkan/renderer/vk_renderstate.cpp @@ -222,6 +222,7 @@ void VkRenderState::Apply(int dt) ApplyScissor(); ApplyViewport(); ApplyStencilRef(); + ApplyDepthBias(); ApplyStreamData(); ApplyMatrices(); ApplyPushConstants(); @@ -231,6 +232,15 @@ void VkRenderState::Apply(int dt) mNeedApply = false; } +void VkRenderState::ApplyDepthBias() +{ + if (mBias.mChanged) + { + mCommandBuffer->setDepthBias(mBias.mUnits, 0.0f, mBias.mFactor); + mBias.mChanged = false; + } +} + void VkRenderState::ApplyRenderPass(int dt) { auto fb = GetVulkanFrameBuffer(); @@ -245,6 +255,7 @@ void VkRenderState::ApplyRenderPass(int dt) passKey.DepthWrite = mDepthTest && mDepthWrite; passKey.DepthFunc = mDepthFunc; passKey.DepthClamp = mDepthClamp; + passKey.DepthBias = !(mBias.mFactor == 0 && mBias.mUnits == 0); passKey.StencilTest = mStencilTest; passKey.StencilPassOp = mStencilOp; passKey.ColorMask = mColorMask; @@ -273,6 +284,7 @@ void VkRenderState::ApplyRenderPass(int dt) mScissorChanged = true; mViewportChanged = true; mStencilRefChanged = true; + mBias.mChanged = true; } else if (changingRenderPass) { diff --git a/src/rendering/vulkan/renderer/vk_renderstate.h b/src/rendering/vulkan/renderer/vk_renderstate.h index bfc0edd30..3ad555543 100644 --- a/src/rendering/vulkan/renderer/vk_renderstate.h +++ b/src/rendering/vulkan/renderer/vk_renderstate.h @@ -48,6 +48,7 @@ private: void Apply(int dt); void ApplyRenderPass(int dt); void ApplyStencilRef(); + void ApplyDepthBias(); void ApplyScissor(); void ApplyViewport(); void ApplyStreamData(); diff --git a/src/rendering/vulkan/system/vk_builders.h b/src/rendering/vulkan/system/vk_builders.h index a6645edd9..00648ab36 100644 --- a/src/rendering/vulkan/system/vk_builders.h +++ b/src/rendering/vulkan/system/vk_builders.h @@ -189,6 +189,7 @@ public: void setDepthStencilEnable(bool test, bool write, bool stencil); void setDepthFunc(VkCompareOp func); void setDepthClampEnable(bool value); + void setDepthBias(bool enable, float biasConstantFactor, float biasClamp, float biasSlopeFactor); void setColorWriteMask(VkColorComponentFlags mask); void setStencil(VkStencilOp failOp, VkStencilOp passOp, VkStencilOp depthFailOp, VkCompareOp compareOp, uint32_t compareMask, uint32_t writeMask, uint32_t reference); @@ -806,6 +807,14 @@ inline void GraphicsPipelineBuilder::setDepthClampEnable(bool value) rasterizer.depthClampEnable = value ? VK_TRUE : VK_FALSE; } +inline void GraphicsPipelineBuilder::setDepthBias(bool enable, float biasConstantFactor, float biasClamp, float biasSlopeFactor) +{ + rasterizer.depthBiasEnable = enable ? VK_TRUE : VK_FALSE; + rasterizer.depthBiasConstantFactor = biasConstantFactor; + rasterizer.depthBiasClamp = biasClamp; + rasterizer.depthBiasSlopeFactor = biasSlopeFactor; +} + inline void GraphicsPipelineBuilder::setColorWriteMask(VkColorComponentFlags mask) { colorBlendAttachment.colorWriteMask = mask;