i965: Calculate thread_count in brw_alloc_stage_scratch
[mesa.git] / src / mesa / drivers / dri / i965 / brw_link.cpp
index 9ddf023018370aeed130062a60f8233f04a8b56e..988dd3a73d7af9a2530ddbd3d4840846c069f77c 100644 (file)
@@ -27,6 +27,7 @@
 #include "compiler/glsl/ir.h"
 #include "compiler/glsl/ir_optimization.h"
 #include "compiler/glsl/program.h"
+#include "compiler/nir/nir_serialize.h"
 #include "program/program.h"
 #include "main/mtypes.h"
 #include "main/shaderapi.h"
@@ -278,12 +279,12 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
             nir_shader *producer = shProg->_LinkedShaders[i]->Program->nir;
             nir_shader *consumer = shProg->_LinkedShaders[next]->Program->nir;
 
-            nir_remove_dead_variables(producer, nir_var_shader_out);
-            nir_remove_dead_variables(consumer, nir_var_shader_in);
+            NIR_PASS_V(producer, nir_remove_dead_variables, nir_var_shader_out);
+            NIR_PASS_V(consumer, nir_remove_dead_variables, nir_var_shader_in);
 
             if (nir_remove_unused_varyings(producer, consumer)) {
-               nir_lower_global_vars_to_local(producer);
-               nir_lower_global_vars_to_local(consumer);
+               NIR_PASS_V(producer, nir_lower_global_vars_to_local);
+               NIR_PASS_V(consumer, nir_lower_global_vars_to_local);
 
                nir_variable_mode indirect_mask = (nir_variable_mode) 0;
                if (compiler->glsl_compiler_options[i].EmitNoIndirectTemp)
@@ -293,18 +294,21 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
                 * temporaries so we need to lower indirects on any of the
                 * varyings we have demoted here.
                 */
-               nir_lower_indirect_derefs(producer, indirect_mask);
-               nir_lower_indirect_derefs(consumer, indirect_mask);
+               NIR_PASS_V(producer, nir_lower_indirect_derefs, indirect_mask);
+               NIR_PASS_V(consumer, nir_lower_indirect_derefs, 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);
+               const bool p_is_scalar =
+                  compiler->scalar_stage[producer->info.stage];
+               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);
+               const bool c_is_scalar =
+                  compiler->scalar_stage[producer->info.stage];
+               consumer = brw_nir_optimize(consumer, compiler, c_is_scalar);
             }
 
+            shProg->_LinkedShaders[i]->Program->nir = producer;
+            shProg->_LinkedShaders[next]->Program->nir = consumer;
+
             next = i;
        }
     }
@@ -315,11 +319,19 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *shProg)
          continue;
 
       struct gl_program *prog = shader->Program;
-      nir_shader *nir = shader->Program->nir;
-      brw_shader_gather_info(nir, prog);
-
-      NIR_PASS_V(nir, nir_lower_samplers, shProg);
-      NIR_PASS_V(nir, nir_lower_atomics, shProg);
+      brw_shader_gather_info(prog->nir, prog);
+
+      NIR_PASS_V(prog->nir, nir_lower_samplers, shProg);
+      NIR_PASS_V(prog->nir, nir_lower_atomics, shProg);
+
+      if (brw->ctx.Cache) {
+         struct blob writer;
+         blob_init(&writer);
+         nir_serialize(&writer, prog->nir);
+         prog->driver_cache_blob = ralloc_size(NULL, writer.size);
+         memcpy(prog->driver_cache_blob, writer.data, writer.size);
+         prog->driver_cache_blob_size = writer.size;
+      }
 
       infos[stage] = &prog->nir->info;