static void convert_impl(nir_function_impl *impl) { nir_builder b; nir_builder_init(&b, impl); nir_foreach_block(impl, convert_block, &b); nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance); }
static void nir_lower_tex_impl(nir_function_impl *impl, lower_tex_state *state) { nir_builder_init(&state->b, impl); nir_foreach_block(impl, nir_lower_tex_block, state); nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance); }
static bool vc4_nir_lower_txf_ms_impl(struct vc4_compile *c, nir_function_impl *impl) { nir_foreach_block(impl, vc4_nir_lower_txf_ms_block, c); nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance); return true; }
static void nir_lower_io_impl(nir_function_impl *impl) { struct lower_io_state state; state.mem_ctx = ralloc_parent(impl); nir_foreach_block(impl, nir_lower_io_block, &state); nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance); }
static void lower_impl(nir_function_impl *impl, const struct gl_shader_program *shader_program, gl_shader_stage stage) { lower_state state; nir_builder_init(&state.builder, impl); state.shader_program = shader_program; state.stage = stage; nir_foreach_block(impl, lower_block_cb, &state); }
static void lower_impl(nir_function_impl *impl, struct gl_shader_program *shader_program, struct gl_program *prog) { lower_state state; state.mem_ctx = ralloc_parent(impl); state.shader_program = shader_program; state.prog = prog; nir_foreach_block(impl, lower_block_cb, &state); }
static bool nir_lower_vec_to_movs_impl(nir_function_impl *impl) { struct vec_to_movs_state state = { impl, false }; nir_foreach_block(impl, lower_vec_to_movs_block, &state); if (state.progress) { nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance); } return state.progress; }
bool nir_opt_dce_impl(nir_function_impl *impl) { struct exec_list *worklist = ralloc(NULL, struct exec_list); exec_list_make_empty(worklist); nir_foreach_block(impl, init_block_cb, worklist); while (!exec_list_is_empty(worklist)) { nir_instr *instr = worklist_pop(worklist); nir_foreach_src(instr, mark_live_cb, worklist); } ralloc_free(worklist); bool progress = false; nir_foreach_block(impl, delete_block_cb, &progress); if (progress) nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance); return progress; }
bool nir_opt_undef(nir_shader *shader) { bool progress = false; nir_foreach_overload(shader, overload) { if (overload->impl) { nir_foreach_block(overload->impl, opt_undef_block, &progress); if (progress) nir_metadata_preserve(overload->impl, nir_metadata_block_index | nir_metadata_dominance); } } return progress; }
static bool nir_opt_constant_folding_impl(nir_function_impl *impl) { struct constant_fold_state state; state.mem_ctx = ralloc_parent(impl); state.impl = impl; state.progress = false; nir_foreach_block(impl, constant_fold_block, &state); if (state.progress) nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance); return state.progress; }
/* Identical to nir_assign_var_locations_packed except that it assigns * locations to the variables that are used 100% directly first and then * assigns locations to variables that are used indirectly. */ void nir_assign_var_locations_scalar_direct_first(nir_shader *shader, struct exec_list *var_list, unsigned *direct_size, unsigned *size) { struct set *indirect_set = _mesa_set_create(NULL, _mesa_hash_pointer, _mesa_key_pointer_equal); nir_foreach_overload(shader, overload) { if (overload->impl) nir_foreach_block(overload->impl, mark_indirect_uses_block, indirect_set); } unsigned location = 0; foreach_list_typed(nir_variable, var, node, var_list) { if (var->data.mode == nir_var_uniform && var->interface_type != NULL) continue; if (_mesa_set_search(indirect_set, var)) continue; var->data.driver_location = location; location += type_size(var->type); } *direct_size = location; foreach_list_typed(nir_variable, var, node, var_list) { if (var->data.mode == nir_var_uniform && var->interface_type != NULL) continue; if (!_mesa_set_search(indirect_set, var)) continue; var->data.driver_location = location; location += type_size(var->type); } *size = location; _mesa_set_destroy(indirect_set, NULL); }
static bool split_var_copies_impl(nir_function_impl *impl) { struct split_var_copies_state state; state.mem_ctx = ralloc_parent(impl); state.dead_ctx = ralloc_context(NULL); state.progress = false; nir_foreach_block(impl, split_var_copies_block, &state); ralloc_free(state.dead_ctx); if (state.progress) { nir_metadata_preserve(impl, nir_metadata_block_index | nir_metadata_dominance); } return state.progress; }