i965/link: Make better use of temporary variables
authorJason Ekstrand <jason.ekstrand@intel.com>
Thu, 28 Sep 2017 16:55:15 +0000 (09:55 -0700)
committerJordan Justen <jordan.l.justen@intel.com>
Thu, 28 Sep 2017 23:19:54 +0000 (16:19 -0700)
The way NIR_PASS works (and, by extension, nir_optimize) is that they
may clone the shader and throw the old one away.  (We use this for
testing nir_clone.)  It's better if we just make a temporary variable,
use it for everything, and re-assign to the gl_program at the end.

[jordan.l.justen@intel.com: Tested NIR_TEST_CLONE=1 with valgrind]
Tested-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/mesa/drivers/dri/i965/brw_link.cpp

index 9ddf023018370aeed130062a60f8233f04a8b56e..80868569ed7ab73e1076055799075300f91b14bc 100644 (file)
@@ -297,14 +297,15 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
                nir_lower_indirect_derefs(consumer, indirect_mask);
 
                const bool p_is_scalar = compiler->scalar_stage[producer->stage];
-               shProg->_LinkedShaders[i]->Program->nir =
-                 brw_nir_optimize(producer, compiler, p_is_scalar);
+               producer = brw_nir_optimize(producer, compiler, p_is_scalar);
 
                const bool c_is_scalar = compiler->scalar_stage[producer->stage];
-               shProg->_LinkedShaders[next]->Program->nir =
-                 brw_nir_optimize(consumer, compiler, c_is_scalar);
+               consumer = brw_nir_optimize(consumer, compiler, c_is_scalar);
             }
 
+            shProg->_LinkedShaders[i]->Program->nir = producer;
+            shProg->_LinkedShaders[next]->Program->nir = consumer;
+
             next = i;
        }
     }