lima: fix handling of reverse depth range
authorVasily Khoruzhick <anarsoul@gmail.com>
Wed, 15 Jan 2020 03:53:29 +0000 (19:53 -0800)
committerMarge Bot <eric+marge@anholt.net>
Thu, 16 Jan 2020 01:57:05 +0000 (01:57 +0000)
Looks like we need to handle cases when near > far and near == far.
In first case we just need to swap near and far, and in second we
need subtract epsilon from near if it's not zero.

Fixes 10 tests in dEQP-GLES2.functional.depth_range.*

Reviewed-by: Qiang Yu <yuq825@gmail.com>
Signed-off-by: Vasily Khoruzhick <anarsoul@gmail.com>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3400>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3400>

src/gallium/drivers/lima/lima_draw.c
src/gallium/drivers/lima/lima_state.c

index af50996fa33b74ed828120f2d446cbd2df6c1e02..088f33ef760e03607c5b6c525bbbc2091ccbe734 100644 (file)
@@ -1090,9 +1090,17 @@ lima_pack_render_state(struct lima_context *ctx, const struct pipe_draw_info *in
    struct pipe_depth_state *depth = &ctx->zsa->base.depth;
    render->depth_test = lima_calculate_depth_test(depth, rst);
 
+   ushort far, near;
+
+   near = float_to_ushort(ctx->viewport.near);
+   far = float_to_ushort(ctx->viewport.far);
+
+   /* Subtract epsilon from 'near' if far == near. Make sure we don't get overflow */
+   if ((far == near) && (near != 0))
+         near--;
+
    /* overlap with plbu? any place can remove one? */
-   render->depth_range = float_to_ushort(ctx->viewport.near) |
-      (float_to_ushort(ctx->viewport.far) << 16);
+   render->depth_range = near | (far << 16);
 
    struct pipe_stencil_state *stencil = ctx->zsa->base.stencil;
    struct pipe_stencil_ref *ref = &ctx->stencil_ref;
index 286529e9db0795b312f871ffa7484d0b984a14f7..cd910fbf3dea093ea1c13630ef865e968eac2ffe 100644 (file)
@@ -248,8 +248,12 @@ lima_set_viewport_states(struct pipe_context *pctx,
    ctx->viewport.top = viewport->translate[1] + fabsf(viewport->scale[1]);
 
    /* reverse calculate the parameter of glDepthRange */
-   ctx->viewport.near = viewport->translate[2] - viewport->scale[2];
-   ctx->viewport.far = viewport->translate[2] + viewport->scale[2];
+   float near, far;
+   near = viewport->translate[2] - viewport->scale[2];
+   far = viewport->translate[2] + viewport->scale[2];
+
+   ctx->viewport.near = MIN2(near, far);
+   ctx->viewport.far = MAX2(near, far);
 
    ctx->viewport.transform = *viewport;
    ctx->dirty |= LIMA_CONTEXT_DIRTY_VIEWPORT;