From 11e9ebbf15ecf49d7ef02c2ec6c2d9d3ff0f1b6e Mon Sep 17 00:00:00 2001 From: Francisco Jerez Date: Mon, 23 Jan 2017 23:36:46 -0800 Subject: [PATCH] =?utf8?q?nir/spirv/glsl450:=20Implement=20IEEE-compliant?= =?utf8?q?=20handling=20of=20atan2(=C2=B1=E2=88=9E,=20=C2=B1=E2=88=9E).?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: Ian Romanick Reviewed-by: Juan A. Suarez Romero --- src/compiler/spirv/vtn_glsl450.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/compiler/spirv/vtn_glsl450.c b/src/compiler/spirv/vtn_glsl450.c index 8509f641317..dd38cc95ccf 100644 --- a/src/compiler/spirv/vtn_glsl450.c +++ b/src/compiler/spirv/vtn_glsl450.c @@ -339,12 +339,32 @@ build_atan2(nir_builder *b, nir_ssa_def *y, nir_ssa_def *x) nir_ssa_def *rcp_scaled_t = nir_frcp(b, nir_fmul(b, t, scale)); nir_ssa_def *s_over_t = nir_fmul(b, nir_fmul(b, s, scale), rcp_scaled_t); + /* For |x| = |y| assume tan = 1 even if infinite (i.e. pretend momentarily + * that ∞/∞ = 1) in order to comply with the rather artificial rules + * inherited from IEEE 754-2008, namely: + * + * "atan2(±∞, −∞) is ±3π/4 + * atan2(±∞, +∞) is ±π/4" + * + * Note that this is inconsistent with the rules for the neighborhood of + * zero that are based on iterated limits: + * + * "atan2(±0, −0) is ±π + * atan2(±0, +0) is ±0" + * + * but GLSL specifically allows implementations to deviate from IEEE rules + * at (0,0), so we take that license (i.e. pretend that 0/0 = 1 here as + * well). + */ + nir_ssa_def *tan = nir_bcsel(b, nir_feq(b, nir_fabs(b, x), nir_fabs(b, y)), + one, nir_fabs(b, s_over_t)); + /* Calculate the arctangent and fix up the result if we had flipped the * coordinate system. */ nir_ssa_def *arc = nir_fadd(b, nir_fmul(b, nir_b2f(b, flip), nir_imm_float(b, M_PI_2f)), - build_atan(b, nir_fabs(b, s_over_t))); + build_atan(b, tan)); /* Rather convoluted calculation of the sign of the result. When x < 0 we * cannot use fsign because we need to be able to distinguish between -- 2.30.2