#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"
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)
* 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;
}
}
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;