i965/compiler: Disable trig workarounds on KBL+
authorJason Ekstrand <jason@jlekstrand.net>
Tue, 8 Nov 2016 21:21:39 +0000 (13:21 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 22 Nov 2016 16:06:33 +0000 (08:06 -0800)
The precision of our trig instructions appears to have been fixed on Kaby
Lake.  Neither Ben nor I can find any documentation for this.  However, the
dEQP precision tests now pass with INTEL_PRECISE_TRIG=0 where they fail on
Sky Lake.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/drivers/dri/i965/brw_nir.c
src/mesa/drivers/dri/i965/brw_nir_trig_workarounds.py

index e454180..763e3ec 100644 (file)
@@ -449,6 +449,7 @@ nir_optimize(nir_shader *nir, bool is_scalar)
 nir_shader *
 brw_preprocess_nir(const struct brw_compiler *compiler, nir_shader *nir)
 {
+   const struct gen_device_info *devinfo = compiler->devinfo;
    bool progress; /* Written by OPT and OPT_V */
    (void)progress;
 
@@ -457,7 +458,9 @@ brw_preprocess_nir(const struct brw_compiler *compiler, nir_shader *nir)
    if (nir->stage == MESA_SHADER_GEOMETRY)
       OPT(nir_lower_gs_intrinsics);
 
-   if (compiler->precise_trig)
+   /* See also brw_nir_trig_workarounds.py */
+   if (compiler->precise_trig &&
+       !(devinfo->gen >= 10 || devinfo->is_kabylake))
       OPT(brw_nir_apply_trig_workarounds);
 
    static const nir_lower_tex_options tex_options = {
index 67dab9a..3b8d0ce 100755 (executable)
 
 import nir_algebraic
 
-# The SIN and COS instructions on Intel hardware can produce values
-# slightly outside of the [-1.0, 1.0] range for a small set of values.
-# Obviously, this can break everyone's expectations about trig functions.
+# Prior to Kaby Lake, The SIN and COS instructions on Intel hardware can
+# produce values slightly outside of the [-1.0, 1.0] range for a small set of
+# values.  Obviously, this can break everyone's expectations about trig
+# functions.  This appears to be fixed in Kaby Lake.
 #
 # According to an internal presentation, the COS instruction can produce
 # a value up to 1.000027 for inputs in the range (0.08296, 0.09888).  One