anv: Handle clamping of inverted depth ranges
authorJason Ekstrand <jason@jlekstrand.net>
Tue, 7 Jul 2020 16:08:31 +0000 (11:08 -0500)
committerMarge Bot <eric+marge@anholt.net>
Tue, 7 Jul 2020 21:38:03 +0000 (21:38 +0000)
Tested-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Reviewed-by: Ivan Briano <ivan.briano@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5792>

src/intel/vulkan/gen8_cmd_buffer.c

index fe136ecd928483ed1cd3745547085befc30c123c..f2497231fea86715e78162b6272bfe27860a8e8f 100644 (file)
@@ -104,9 +104,17 @@ gen8_cmd_buffer_emit_depth_viewport(struct anv_cmd_buffer *cmd_buffer,
    for (uint32_t i = 0; i < count; i++) {
       const VkViewport *vp = &viewports[i];
 
+      /* From the Vulkan spec:
+       *
+       *    "It is valid for minDepth to be greater than or equal to
+       *    maxDepth."
+       */
+      float min_depth = MIN2(vp->minDepth, vp->maxDepth);
+      float max_depth = MAX2(vp->minDepth, vp->maxDepth);
+
       struct GENX(CC_VIEWPORT) cc_viewport = {
-         .MinimumDepth = depth_clamp_enable ? vp->minDepth : 0.0f,
-         .MaximumDepth = depth_clamp_enable ? vp->maxDepth : 1.0f,
+         .MinimumDepth = depth_clamp_enable ? min_depth : 0.0f,
+         .MaximumDepth = depth_clamp_enable ? max_depth : 1.0f,
       };
 
       GENX(CC_VIEWPORT_pack)(NULL, cc_state.map + i * 8, &cc_viewport);