panfrost: Implement depth range clipping
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Fri, 16 Aug 2019 17:25:34 +0000 (10:25 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 21 Aug 2019 17:44:45 +0000 (10:44 -0700)
This should fix glDepthRangef issues. Eventually, something similar
should allow implementing the depth bounds test.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/gallium/drivers/panfrost/pan_context.c

index f9e03ab4fbdfcca20ce9fdf539b9e5ba63ef107e..e8ca6a66377c33575e666d2d2f2d48685044aee0 100644 (file)
@@ -1209,9 +1209,6 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
                 .clip_miny = -INFINITY,
                 .clip_maxx = INFINITY,
                 .clip_maxy = INFINITY,
-
-                .clip_minz = 0.0,
-                .clip_maxz = 1.0,
         };
 
         /* Always scissor to the viewport by default. */
@@ -1221,6 +1218,9 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
         float vp_miny = (int) (vp->translate[1] - fabsf(vp->scale[1]));
         float vp_maxy = (int) (vp->translate[1] + fabsf(vp->scale[1]));
 
+        float minz = (vp->translate[2] - fabsf(vp->scale[2]));
+        float maxz = (vp->translate[2] + fabsf(vp->scale[2]));
+
         /* Apply the scissor test */
 
         unsigned minx, miny, maxx, maxy;
@@ -1253,6 +1253,12 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
                 maxx = temp;
         }
 
+        if (minz > maxz) {
+                float temp = minz;
+                minz = maxz;
+                maxz = temp;
+        }
+
         /* Clamp to the framebuffer size as a last check */
 
         minx = MIN2(ctx->pipe_framebuffer.width, minx);
@@ -1276,6 +1282,9 @@ panfrost_emit_for_draw(struct panfrost_context *ctx, bool with_vertex_data)
         view.viewport0[1] = miny;
         view.viewport1[1] = MALI_POSITIVE(maxy);
 
+        view.clip_minz = minz;
+        view.clip_maxz = maxz;
+
         ctx->payloads[PIPE_SHADER_FRAGMENT].postfix.viewport =
                 panfrost_upload_transient(ctx,
                                           &view,