X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fnir%2Fnir_split_vars.c;h=777c4ac72251378453477ee60b46b92b95f6e211;hb=3b3653c4cfbedf55a00cbddd0f341ebd1de81665;hp=0cf3e517f85d8ed1909f2802f5ce5c24d8d18d4e;hpb=9fdded0cc34b4bdb87923707c05b8ceffb2f174c;p=mesa.git diff --git a/src/compiler/nir/nir_split_vars.c b/src/compiler/nir/nir_split_vars.c index 0cf3e517f85..777c4ac7225 100644 --- a/src/compiler/nir/nir_split_vars.c +++ b/src/compiler/nir/nir_split_vars.c @@ -91,7 +91,7 @@ init_field_for_type(struct field *field, struct field *parent, }; const struct glsl_type *struct_type = glsl_without_array(type); - if (glsl_type_is_struct(struct_type)) { + if (glsl_type_is_struct_or_ifc(struct_type)) { field->num_fields = glsl_get_length(struct_type), field->fields = ralloc_array(state->mem_ctx, struct field, field->num_fields); @@ -115,7 +115,7 @@ init_field_for_type(struct field *field, struct field *parent, var_type = wrap_type_in_array(var_type, f->type); nir_variable_mode mode = state->base_var->data.mode; - if (mode == nir_var_function) { + if (mode == nir_var_function_temp) { field->var = nir_local_variable_create(state->impl, var_type, name); } else { field->var = nir_variable_create(state->shader, mode, var_type, name); @@ -143,7 +143,7 @@ split_var_list_structs(nir_shader *shader, * pull all of the variables we plan to split off of the list */ nir_foreach_variable_safe(var, vars) { - if (!glsl_type_is_struct(glsl_without_array(var->type))) + if (!glsl_type_is_struct_or_ifc(glsl_without_array(var->type))) continue; exec_node_remove(&var->node); @@ -205,7 +205,7 @@ split_struct_derefs_impl(nir_function_impl *impl, continue; assert(i > 0); - assert(glsl_type_is_struct(path.path[i - 1]->type)); + assert(glsl_type_is_struct_or_ifc(path.path[i - 1]->type)); assert(path.path[i - 1]->type == glsl_without_array(tail_field->type)); @@ -259,10 +259,10 @@ nir_split_struct_vars(nir_shader *shader, nir_variable_mode modes) struct hash_table *var_field_map = _mesa_pointer_hash_table_create(mem_ctx); - assert((modes & (nir_var_private | nir_var_function)) == modes); + assert((modes & (nir_var_shader_temp | nir_var_function_temp)) == modes); bool has_global_splits = false; - if (modes & nir_var_private) { + if (modes & nir_var_shader_temp) { has_global_splits = split_var_list_structs(shader, NULL, &shader->globals, var_field_map, mem_ctx); @@ -274,7 +274,7 @@ nir_split_struct_vars(nir_shader *shader, nir_variable_mode modes) continue; bool has_local_splits = false; - if (modes & nir_var_function) { + if (modes & nir_var_function_temp) { has_local_splits = split_var_list_structs(shader, function->impl, &function->impl->locals, var_field_map, mem_ctx); @@ -341,7 +341,6 @@ init_var_list_array_infos(struct exec_list *vars, const struct glsl_type *type = var->type; for (int i = 0; i < num_levels; i++) { - assert(glsl_get_explicit_stride(type) == 0); info->levels[i].array_len = glsl_get_length(type); type = glsl_get_array_element(type); @@ -454,7 +453,7 @@ create_split_array_vars(struct array_var_info *var_info, name = ralloc_asprintf(mem_ctx, "(%s)", name); nir_variable_mode mode = var_info->base_var->data.mode; - if (mode == nir_var_function) { + if (mode == nir_var_function_temp) { split->var = nir_local_variable_create(impl, var_info->split_var_type, name); } else { @@ -616,11 +615,10 @@ emit_split_copies(nir_builder *b, glsl_get_length(src_path->path[src_level]->type)); unsigned len = glsl_get_length(dst_path->path[dst_level]->type); for (unsigned i = 0; i < len; i++) { - nir_ssa_def *idx = nir_imm_int(b, i); emit_split_copies(b, dst_info, dst_path, dst_level + 1, - nir_build_deref_array(b, dst, idx), + nir_build_deref_array_imm(b, dst, i), src_info, src_path, src_level + 1, - nir_build_deref_array(b, src, idx)); + nir_build_deref_array_imm(b, src, i)); } } else { /* Neither side is being split so we just keep going */ @@ -794,10 +792,10 @@ nir_split_array_vars(nir_shader *shader, nir_variable_mode modes) void *mem_ctx = ralloc_context(NULL); struct hash_table *var_info_map = _mesa_pointer_hash_table_create(mem_ctx); - assert((modes & (nir_var_private | nir_var_function)) == modes); + assert((modes & (nir_var_shader_temp | nir_var_function_temp)) == modes); bool has_global_array = false; - if (modes & nir_var_private) { + if (modes & nir_var_shader_temp) { has_global_array = init_var_list_array_infos(&shader->globals, var_info_map, mem_ctx); } @@ -808,7 +806,7 @@ nir_split_array_vars(nir_shader *shader, nir_variable_mode modes) continue; bool has_local_array = false; - if (modes & nir_var_function) { + if (modes & nir_var_function_temp) { has_local_array = init_var_list_array_infos(&function->impl->locals, var_info_map, mem_ctx); } @@ -826,7 +824,7 @@ nir_split_array_vars(nir_shader *shader, nir_variable_mode modes) } bool has_global_splits = false; - if (modes & nir_var_private) { + if (modes & nir_var_shader_temp) { has_global_splits = split_var_list_arrays(shader, NULL, &shader->globals, var_info_map, mem_ctx); @@ -838,7 +836,7 @@ nir_split_array_vars(nir_shader *shader, nir_variable_mode modes) continue; bool has_local_splits = false; - if (modes & nir_var_function) { + if (modes & nir_var_function_temp) { has_local_splits = split_var_list_arrays(shader, function->impl, &function->impl->locals, var_info_map, mem_ctx); @@ -1423,6 +1421,12 @@ shrink_vec_var_access_impl(nir_function_impl *impl, continue; } + /* If we're not dropping any components, there's no need to + * compact vectors. + */ + if (usage->comps_kept == usage->all_comps) + continue; + if (intrin->intrinsic == nir_intrinsic_load_deref) { b.cursor = nir_after_instr(&intrin->instr); @@ -1491,10 +1495,10 @@ function_impl_has_vars_with_modes(nir_function_impl *impl, { nir_shader *shader = impl->function->shader; - if ((modes & nir_var_private) && !exec_list_is_empty(&shader->globals)) + if ((modes & nir_var_shader_temp) && !exec_list_is_empty(&shader->globals)) return true; - if ((modes & nir_var_function) && !exec_list_is_empty(&impl->locals)) + if ((modes & nir_var_function_temp) && !exec_list_is_empty(&impl->locals)) return true; return false; @@ -1512,7 +1516,7 @@ function_impl_has_vars_with_modes(nir_function_impl *impl, bool nir_shrink_vec_array_vars(nir_shader *shader, nir_variable_mode modes) { - assert((modes & (nir_var_private | nir_var_function)) == modes); + assert((modes & (nir_var_shader_temp | nir_var_function_temp)) == modes); void *mem_ctx = ralloc_context(NULL); @@ -1540,7 +1544,7 @@ nir_shrink_vec_array_vars(nir_shader *shader, nir_variable_mode modes) } bool globals_shrunk = false; - if (modes & nir_var_private) + if (modes & nir_var_shader_temp) globals_shrunk = shrink_vec_var_list(&shader->globals, var_usage_map); bool progress = false; @@ -1549,7 +1553,7 @@ nir_shrink_vec_array_vars(nir_shader *shader, nir_variable_mode modes) continue; bool locals_shrunk = false; - if (modes & nir_var_function) { + if (modes & nir_var_function_temp) { locals_shrunk = shrink_vec_var_list(&function->impl->locals, var_usage_map); }