iris: Fix ALT mode regressions from shader cache
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 21 May 2019 23:10:21 +0000 (16:10 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Tue, 21 May 2019 23:58:54 +0000 (16:58 -0700)
We were checking this based on nir->info.name, but with the shader
cache enabled, nir_strip throws out the name, causing us to use IEEE
mode for ARB programs.

gl-1.0-spot-light regressed because it wants ALT mode for 0^0 behavior.

Fixes: dc5dc727d59 iris: Serialize the NIR to a blob we can use for shader cache purposes.
src/gallium/drivers/iris/iris_context.h
src/gallium/drivers/iris/iris_program.c

index add6a9a9e34060b9feb2b6115659fd0d7cc8bdb1..75e13778631bc9a21b5e0b43614ccfaadcda53a6 100644 (file)
@@ -271,6 +271,9 @@ struct iris_uncompiled_shader {
 
    /** Have any shader variants been compiled yet? */
    bool compiled_once;
+
+   /** Should we use ALT mode for math?  Useful for ARB programs. */
+   bool use_alt_mode;
 };
 
 /**
index 21651bfd2c9857a56339f96f963ae59f1b7d1c5a..a5cd987664fb68177b74525f253d5a2cc8fe5b59 100644 (file)
@@ -543,8 +543,7 @@ iris_compile_vs(struct iris_context *ice,
       nir_shader_gather_info(nir, impl);
    }
 
-   if (nir->info.name && strncmp(nir->info.name, "ARB", 3) == 0)
-      prog_data->use_alt_mode = true;
+   prog_data->use_alt_mode = ish->use_alt_mode;
 
    iris_setup_uniforms(compiler, mem_ctx, nir, prog_data, &system_values,
                        &num_system_values, &num_cbufs);
@@ -1061,8 +1060,7 @@ iris_compile_fs(struct iris_context *ice,
 
    nir_shader *nir = nir_shader_clone(mem_ctx, ish->nir);
 
-   if (nir->info.name && strncmp(nir->info.name, "ARB", 3) == 0)
-      prog_data->use_alt_mode = true;
+   prog_data->use_alt_mode = ish->use_alt_mode;
 
    iris_setup_uniforms(compiler, mem_ctx, nir, prog_data, &system_values,
                        &num_system_values, &num_cbufs);
@@ -1490,6 +1488,10 @@ iris_create_uncompiled_shader(struct pipe_context *ctx,
       update_so_info(&ish->stream_output, nir->info.outputs_written);
    }
 
+   /* Save this now before potentially dropping nir->info.name */
+   if (nir->info.name && strncmp(nir->info.name, "ARB", 3) == 0)
+      ish->use_alt_mode = true;
+
    if (screen->disk_cache) {
       /* Serialize the NIR to a binary blob that we can hash for the disk
        * cache.  First, drop unnecessary information (like variable names)