if (!state->global_clone && global)
return (void *)ptr;
+ if (unlikely(!state->remap_table)) {
+ assert(state->allow_remap_fallback);
+ return (void *)ptr;
+ }
+
entry = _mesa_hash_table_search(state->remap_table, ptr);
if (!entry) {
assert(state->allow_remap_fallback);
if (dst->is_ssa) {
nir_ssa_dest_init(ninstr, ndst, dst->ssa.num_components,
dst->ssa.bit_size, dst->ssa.name);
- add_remap(state, &ndst->ssa, &dst->ssa);
+ if (likely(state->remap_table))
+ add_remap(state, &ndst->ssa, &dst->ssa);
} else {
ndst->reg.reg = remap_reg(state, dst->reg.reg);
if (dst->reg.indirect) {
}
}
-nir_alu_instr *
-nir_alu_instr_clone(nir_shader *shader, const nir_alu_instr *orig)
-{
- nir_alu_instr *clone = nir_alu_instr_create(shader, orig->op);
-
- clone->exact = orig->exact;
-
- for (unsigned i = 0; i < nir_op_infos[orig->op].num_inputs; i++)
- nir_alu_src_copy(&clone->src[i], &orig->src[i], clone);
-
- nir_ssa_dest_init(&clone->instr,
- &clone->dest.dest,
- orig->dest.dest.ssa.num_components,
- orig->dest.dest.ssa.bit_size,
- orig->dest.dest.ssa.name);
- clone->dest.write_mask = orig->dest.write_mask;
-
- return clone;
-}
-
static nir_alu_instr *
clone_alu(clone_state *state, const nir_alu_instr *alu)
{
return nalu;
}
+nir_alu_instr *
+nir_alu_instr_clone(nir_shader *shader, const nir_alu_instr *orig)
+{
+ clone_state state = {
+ .allow_remap_fallback = true,
+ .ns = shader,
+ };
+ return clone_alu(&state, orig);
+}
+
static nir_deref_instr *
clone_deref_instr(clone_state *state, const nir_deref_instr *deref)
{
clone_cf_list(&state, &dst->list, &src->list);
fixup_phi_srcs(&state);
+
+ if (!remap_table)
+ free_clone_state(&state);
}
static nir_function_impl *
nir_shader *ns = nir_shader_create(mem_ctx, s->info.stage, s->options, NULL);
state.ns = ns;
- clone_var_list(&state, &ns->uniforms, &s->uniforms);
- clone_var_list(&state, &ns->inputs, &s->inputs);
- clone_var_list(&state, &ns->outputs, &s->outputs);
- clone_var_list(&state, &ns->shared, &s->shared);
- clone_var_list(&state, &ns->globals, &s->globals);
- clone_var_list(&state, &ns->system_values, &s->system_values);
+ clone_var_list(&state, &ns->variables, &s->variables);
/* Go through and clone functions */
foreach_list_typed(nir_function, fxn, node, &s->functions)
/* We have to move all the linked lists over separately because we need the
* pointers in the list elements to point to the lists in dst and not src.
*/
- exec_list_move_nodes_to(&src->uniforms, &dst->uniforms);
- exec_list_move_nodes_to(&src->inputs, &dst->inputs);
- exec_list_move_nodes_to(&src->outputs, &dst->outputs);
- exec_list_move_nodes_to(&src->shared, &dst->shared);
- exec_list_move_nodes_to(&src->globals, &dst->globals);
- exec_list_move_nodes_to(&src->system_values, &dst->system_values);
+ exec_list_move_nodes_to(&src->variables, &dst->variables);
/* Now move the functions over. This takes a tiny bit more work */
exec_list_move_nodes_to(&src->functions, &dst->functions);