From e26fd607cab20715bf03d5ec221165171e0d0d1e Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Wed, 18 Aug 2021 11:40:51 +0200 Subject: [PATCH] draw/llvmpipe: correct exponent calculation for negative z If the z components here contain negative values, we'll end up with the wrong maximum value. This updated equation is taken from the D3D11 functional spec (section 15.10 Depth Bias), which is a bit more clear than the OpenGL spec. Reviewed-by: Roland Scheidegger Part-of: --- src/gallium/auxiliary/draw/draw_pipe_offset.c | 2 +- src/gallium/drivers/llvmpipe/lp_state_setup.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/gallium/auxiliary/draw/draw_pipe_offset.c b/src/gallium/auxiliary/draw/draw_pipe_offset.c index 769e7ca372d..87db9cddac4 100644 --- a/src/gallium/auxiliary/draw/draw_pipe_offset.c +++ b/src/gallium/auxiliary/draw/draw_pipe_offset.c @@ -97,7 +97,7 @@ static void do_offset_tri( struct draw_stage *stage, if (stage->draw->floating_point_depth) { float bias; union fi maxz; - maxz.f = MAX3(v0[2], v1[2], v2[2]); + maxz.f = MAX3(fabs(v0[2]), fabs(v1[2]), fabs(v2[2])); /* just do the math directly on shifted number */ maxz.ui &= 0xff << 23; maxz.i -= 23 << 23; diff --git a/src/gallium/drivers/llvmpipe/lp_state_setup.c b/src/gallium/drivers/llvmpipe/lp_state_setup.c index 87216c04d9e..53ec2c1c38b 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_setup.c +++ b/src/gallium/drivers/llvmpipe/lp_state_setup.c @@ -266,8 +266,8 @@ lp_do_offset_tri(struct gallivm_state *gallivm, if (key->floating_point_depth) { /* - * bias = pgon_offset_units * 2^(exponent(max(z0, z1, z2)) - mantissa_bits) + - * MAX2(dzdx, dzdy) * pgon_offset_scale + * bias = pgon_offset_units * 2^(exponent(max(abs(z0), abs(z1), abs(z2))) - + * mantissa_bits) + MAX2(dzdx, dzdy) * pgon_offset_scale * * NOTE: Assumes IEEE float32. */ @@ -280,11 +280,14 @@ lp_do_offset_tri(struct gallivm_state *gallivm, exp_mask = lp_build_const_int32(gallivm, 0xff << 23); maxz0z1_value = lp_build_max(&flt_scalar_bld, - LLVMBuildExtractElement(b, attribv[0], twoi, ""), - LLVMBuildExtractElement(b, attribv[1], twoi, "")); + lp_build_abs(&flt_scalar_bld, + LLVMBuildExtractElement(b, attribv[0], twoi, "")), + lp_build_abs(&flt_scalar_bld, + LLVMBuildExtractElement(b, attribv[1], twoi, ""))); maxz_value = lp_build_max(&flt_scalar_bld, - LLVMBuildExtractElement(b, attribv[2], twoi, ""), + lp_build_abs(&flt_scalar_bld, + LLVMBuildExtractElement(b, attribv[2], twoi, "")), maxz0z1_value); exp = LLVMBuildBitCast(b, maxz_value, int_scalar_bld.vec_type, ""); -- 2.34.1