lima: fix handling of reverse depth range

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>
This commit is contained in:
Vasily Khoruzhick 2020-01-14 19:53:29 -08:00 committed by Marge Bot
parent 784b84d308
commit e5226cff75
2 changed files with 16 additions and 4 deletions

View 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;

View 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;