示例#1
0
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);
}
示例#3
0
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;
}
示例#4
0
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);
}
示例#5
0
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);
}
示例#6
0
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);
}
示例#7
0
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;
}
示例#8
0
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;
}
示例#9
0
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;
}
示例#11
0
/* 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);
}
示例#12
0
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;
}