mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-28 18:20:23 +01:00
nir: Produce correct results for atan with NaN
Properly handling NaN adversely affects several hundred shaders in shader-db (lots of Skia and a few others from various synthetic benchmarks) and fossil-db (mostly Talos and some Doom 2016). Only apply the NaN handling work-around when the shader demands it. v2: Add comment explaining the 1.0*y_over_x. Suggested by Caio. Reviewed-by: Caio Oliveira <caio.oliveira@intel.com> Fixes:2098ae16c8("nir/builder: Move nir_atan and nir_atan2 from SPIR-V translator") Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13999> (cherry picked from commit1cb3d1a6ae)
This commit is contained in:
parent
1830da60e8
commit
21dfddc2f6
2 changed files with 23 additions and 2 deletions
|
|
@ -76,7 +76,7 @@
|
|||
"description": "nir: Produce correct results for atan with NaN",
|
||||
"nominated": true,
|
||||
"nomination_type": 1,
|
||||
"resolution": 0,
|
||||
"resolution": 1,
|
||||
"main_sha": null,
|
||||
"because_sha": "2098ae16c8b4e64d0694a28f74a461b69b98a336"
|
||||
},
|
||||
|
|
|
|||
|
|
@ -223,7 +223,28 @@ nir_atan(nir_builder *b, nir_ssa_def *y_over_x)
|
|||
tmp);
|
||||
|
||||
/* sign fixup */
|
||||
return nir_fmul(b, tmp, nir_fsign(b, y_over_x));
|
||||
nir_ssa_def *result = nir_fmul(b, tmp, nir_fsign(b, y_over_x));
|
||||
|
||||
/* The fmin and fmax above will filter out NaN values. This leads to
|
||||
* non-NaN results for NaN inputs. Work around this by doing
|
||||
*
|
||||
* !isnan(y_over_x) ? ... : y_over_x;
|
||||
*/
|
||||
if (b->exact ||
|
||||
nir_is_float_control_signed_zero_inf_nan_preserve(b->shader->info.float_controls_execution_mode, bit_size)) {
|
||||
const bool exact = b->exact;
|
||||
|
||||
b->exact = true;
|
||||
nir_ssa_def *is_not_nan = nir_feq(b, y_over_x, y_over_x);
|
||||
b->exact = exact;
|
||||
|
||||
/* The extra 1.0*y_over_x ensures that subnormal results are flushed to
|
||||
* zero.
|
||||
*/
|
||||
result = nir_bcsel(b, is_not_nan, result, nir_fmul_imm(b, y_over_x, 1.0));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
nir_ssa_def *
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue