## 25.10. Depth Test

The depth test conditionally disables coverage of a sample based on the outcome of a comparison between the fragment’s depth value at the sample location and the sample’s depth value in the depth/stencil attachment at location $(x_f,y_f)$ . The comparison is enabled or disabled with the depthTestEnable member of the VkPipelineDepthStencilStateCreateInfo structure. When disabled, the depth comparison and subsequent possible updates to the value of the depth component of the depth/stencil attachment are bypassed and the fragment is passed to the next operation. The stencil value, however, can be modified as indicated above as if the depth test passed. If enabled, the comparison takes place and the depth/stencil attachment value can subsequently be modified.

The comparison is specified with the depthCompareOp member of VkPipelineDepthStencilStateCreateInfo. Let $z_f$ be the incoming fragment’s depth value for a sample, and let $z_a$ be the depth/stencil attachment value in memory for that sample. The depth test passes under the following conditions:

• VK_COMPARE_OP_NEVER: the test never passes.
• VK_COMPARE_OP_LESS: the test passes when $z_f \lt z_a$ .
• VK_COMPARE_OP_EQUAL: the test passes when $z_f = z_a$ .
• VK_COMPARE_OP_LESS_OR_EQUAL: the test passes when $z_f \leq z_a$ .
• VK_COMPARE_OP_GREATER: the test passes when $z_f \gt z_a$ .
• VK_COMPARE_OP_NOT_EQUAL: the test passes when $z_f \neq z_a$ .
• VK_COMPARE_OP_GREATER_OR_EQUAL: the test passes when $z_f \geq z_a$ .
• VK_COMPARE_OP_ALWAYS: the test always passes.

If depth clamping (see Primitive Clipping) is enabled, before the incoming fragment’s $z_f$ is compared to $z_a$ , $z_f$ is clamped to $[\min(n,f), \max(n,f)]$ , where $n$ and $f$ are the minDepth and maxDepth depth range values of the viewport used by this fragment, respectively.

If the depth test fails, the sample’s coverage bit is cleared in the fragment. The stencil value at the sample’s location is updated according to the function currently in effect for depth test failure.

If the depth test passes, the sample’s (possibly clamped) $z_f$ value is conditionally written to the depth framebuffer attachment based on the depthWriteEnable member of VkPipelineDepthStencilStateCreateInfo. If depthWriteEnable is VK_TRUE the value is written, and if it is VK_FALSE the value is not written. The stencil value at the sample’s location is updated according to the function currently in effect for depth test success.

If there is no depth framebuffer attachment, it is as if the depth test always passes.