diff options
author | Jason Ekstrand <jason.ekstrand@intel.com> | 2018-03-26 14:50:38 -0700 |
---|---|---|
committer | Jason Ekstrand <jason.ekstrand@intel.com> | 2018-06-22 21:23:06 -0700 |
commit | a331d7d1cdfdc971f707fb6b1f71edbad622c804 (patch) | |
tree | f06ed49b17aa136f332e6a6cdf9461c3b958edf6 /src/compiler/nir/nir_deref.c | |
parent | 9800b81ffb64a863e8a6b29366f32281eb844a53 (diff) | |
download | mesa-a331d7d1cdfdc971f707fb6b1f71edbad622c804.tar.gz |
nir: Remove old-school deref chain support
Acked-by: Rob Clark <robdclark@gmail.com>
Acked-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Acked-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src/compiler/nir/nir_deref.c')
-rw-r--r-- | src/compiler/nir/nir_deref.c | 278 |
1 files changed, 0 insertions, 278 deletions
diff --git a/src/compiler/nir/nir_deref.c b/src/compiler/nir/nir_deref.c index 4e48f2b2da8..1a00157c2fc 100644 --- a/src/compiler/nir/nir_deref.c +++ b/src/compiler/nir/nir_deref.c @@ -134,284 +134,6 @@ nir_remove_dead_derefs(nir_shader *shader) return progress; } -nir_deref_var * -nir_deref_instr_to_deref(nir_deref_instr *instr, void *mem_ctx) -{ - nir_deref *deref = NULL; - - while (instr->deref_type != nir_deref_type_var) { - nir_deref *nderef; - switch (instr->deref_type) { - case nir_deref_type_array: - case nir_deref_type_array_wildcard: { - nir_deref_array *deref_arr = nir_deref_array_create(mem_ctx); - if (instr->deref_type == nir_deref_type_array) { - nir_const_value *const_index = - nir_src_as_const_value(instr->arr.index); - if (const_index) { - deref_arr->deref_array_type = nir_deref_array_type_direct; - deref_arr->base_offset = const_index->u32[0]; - } else { - deref_arr->deref_array_type = nir_deref_array_type_indirect; - deref_arr->base_offset = 0; - nir_src_copy(&deref_arr->indirect, &instr->arr.index, mem_ctx); - } - } else { - deref_arr->deref_array_type = nir_deref_array_type_wildcard; - } - nderef = &deref_arr->deref; - break; - } - - case nir_deref_type_struct: - nderef = &nir_deref_struct_create(mem_ctx, instr->strct.index)->deref; - break; - - default: - unreachable("Invalid deref instruction type"); - } - - nderef->child = deref; - ralloc_steal(nderef, deref); - nderef->type = instr->type; - - deref = nderef; - assert(instr->parent.is_ssa); - instr = nir_src_as_deref(instr->parent); - } - - assert(instr->deref_type == nir_deref_type_var); - nir_deref_var *deref_var = nir_deref_var_create(mem_ctx, instr->var); - deref_var->deref.child = deref; - ralloc_steal(deref_var, deref); - - return deref_var; -} - -static nir_deref_var * -nir_deref_src_to_deref(nir_src src, void *mem_ctx) -{ - return nir_deref_instr_to_deref(nir_src_as_deref(src), mem_ctx); -} - -static bool -nir_lower_deref_instrs_tex(nir_tex_instr *tex) -{ - bool progress = false; - - /* Remove the instruction before we modify it. This way we won't mess up - * use-def chains when we move sources around. - */ - nir_cursor cursor = nir_instr_remove(&tex->instr); - - unsigned new_num_srcs = 0; - for (unsigned i = 0; i < tex->num_srcs; i++) { - if (tex->src[i].src_type == nir_tex_src_texture_deref) { - tex->texture = nir_deref_src_to_deref(tex->src[i].src, tex); - progress = true; - continue; - } else if (tex->src[i].src_type == nir_tex_src_sampler_deref) { - tex->sampler = nir_deref_src_to_deref(tex->src[i].src, tex); - progress = true; - continue; - } - - /* Compact the sources down to remove the deref sources */ - assert(new_num_srcs <= i); - tex->src[new_num_srcs++] = tex->src[i]; - } - tex->num_srcs = new_num_srcs; - - nir_instr_insert(cursor, &tex->instr); - - return progress; -} - -static bool -nir_lower_deref_instrs_intrin(nir_intrinsic_instr *intrin, - enum nir_lower_deref_flags flags) -{ - nir_intrinsic_op deref_op = intrin->intrinsic; - nir_intrinsic_op var_op; - - switch (deref_op) { -#define CASE(a) \ - case nir_intrinsic_##a##_deref: \ - if (!(flags & nir_lower_load_store_derefs)) \ - return false; \ - var_op = nir_intrinsic_##a##_var; \ - break; - CASE(load) - CASE(store) - CASE(copy) -#undef CASE - -#define CASE(a) \ - case nir_intrinsic_interp_deref_##a: \ - if (!(flags & nir_lower_interp_derefs)) \ - return false; \ - var_op = nir_intrinsic_interp_var_##a; \ - break; - CASE(at_centroid) - CASE(at_sample) - CASE(at_offset) -#undef CASE - -#define CASE(a) \ - case nir_intrinsic_atomic_counter_##a##_deref: \ - if (!(flags & nir_lower_atomic_counter_derefs)) \ - return false; \ - var_op = nir_intrinsic_atomic_counter_##a##_var; \ - break; - CASE(inc) - CASE(dec) - CASE(read) - CASE(add) - CASE(min) - CASE(max) - CASE(and) - CASE(or) - CASE(xor) - CASE(exchange) - CASE(comp_swap) -#undef CASE - -#define CASE(a) \ - case nir_intrinsic_deref_atomic_##a: \ - if (!(flags & nir_lower_atomic_derefs)) \ - return false; \ - var_op = nir_intrinsic_var_atomic_##a; \ - break; - CASE(add) - CASE(imin) - CASE(umin) - CASE(imax) - CASE(umax) - CASE(and) - CASE(or) - CASE(xor) - CASE(exchange) - CASE(comp_swap) -#undef CASE - -#define CASE(a) \ - case nir_intrinsic_image_deref_##a: \ - if (!(flags & nir_lower_image_derefs)) \ - return false; \ - var_op = nir_intrinsic_image_var_##a; \ - break; - CASE(load) - CASE(store) - CASE(atomic_add) - CASE(atomic_min) - CASE(atomic_max) - CASE(atomic_and) - CASE(atomic_or) - CASE(atomic_xor) - CASE(atomic_exchange) - CASE(atomic_comp_swap) - CASE(size) - CASE(samples) -#undef CASE - - default: - return false; - } - - /* Remove the instruction before we modify it. This way we won't mess up - * use-def chains when we move sources around. - */ - nir_cursor cursor = nir_instr_remove(&intrin->instr); - - unsigned num_derefs = nir_intrinsic_infos[var_op].num_variables; - assert(nir_intrinsic_infos[var_op].num_srcs + num_derefs == - nir_intrinsic_infos[deref_op].num_srcs); - - /* Move deref sources to variables */ - for (unsigned i = 0; i < num_derefs; i++) - intrin->variables[i] = nir_deref_src_to_deref(intrin->src[i], intrin); - - /* Shift all the other sources down */ - for (unsigned i = 0; i < nir_intrinsic_infos[var_op].num_srcs; i++) - nir_src_copy(&intrin->src[i], &intrin->src[i + num_derefs], intrin); - - /* Rewrite the extra sources to NIR_SRC_INIT just in case */ - for (unsigned i = 0; i < num_derefs; i++) - intrin->src[nir_intrinsic_infos[var_op].num_srcs + i] = NIR_SRC_INIT; - - /* It's safe to just stomp the intrinsic to var intrinsic since every - * intrinsic has room for some variables and the number of sources only - * shrinks. - */ - intrin->intrinsic = var_op; - - nir_instr_insert(cursor, &intrin->instr); - - return true; -} - -static bool -nir_lower_deref_instrs_impl(nir_function_impl *impl, - enum nir_lower_deref_flags flags) -{ - bool progress = false; - - /* Walk the instructions in reverse order so that we can safely clean up - * the deref instructions after we clean up their uses. - */ - nir_foreach_block_reverse(block, impl) { - nir_foreach_instr_reverse_safe(instr, block) { - switch (instr->type) { - case nir_instr_type_deref: - if (list_empty(&nir_instr_as_deref(instr)->dest.ssa.uses)) { - nir_instr_remove(instr); - progress = true; - } - break; - - case nir_instr_type_tex: - if (flags & nir_lower_texture_derefs) - progress |= nir_lower_deref_instrs_tex(nir_instr_as_tex(instr)); - break; - - case nir_instr_type_intrinsic: - progress |= - nir_lower_deref_instrs_intrin(nir_instr_as_intrinsic(instr), - flags); - break; - - default: - break; /* Nothing to do */ - } - } - } - - if (progress) { - nir_metadata_preserve(impl, nir_metadata_block_index | - nir_metadata_dominance); - } - - return progress; -} - -bool -nir_lower_deref_instrs(nir_shader *shader, - enum nir_lower_deref_flags flags) -{ - bool progress = false; - - nir_foreach_function(function, shader) { - if (!function->impl) - continue; - - progress |= nir_lower_deref_instrs_impl(function->impl, flags); - } - - shader->lowered_derefs |= flags; - - return progress; -} - void nir_fixup_deref_modes(nir_shader *shader) { |