diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/nir/nir.h | 3 | ||||
-rw-r--r-- | src/compiler/nir/nir_lower_io_arrays_to_elements.c | 22 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_nir.cpp | 2 |
3 files changed, 16 insertions, 11 deletions
diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 4bb96c3c952..86d1c68fa72 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -2522,7 +2522,8 @@ bool nir_lower_load_const_to_scalar(nir_shader *shader); bool nir_lower_read_invocation_to_scalar(nir_shader *shader); bool nir_lower_phis_to_scalar(nir_shader *shader); void nir_lower_io_arrays_to_elements(nir_shader *producer, nir_shader *consumer); -void nir_lower_io_arrays_to_elements_no_indirects(nir_shader *shader); +void nir_lower_io_arrays_to_elements_no_indirects(nir_shader *shader, + bool outputs_only); void nir_lower_io_to_scalar(nir_shader *shader, nir_variable_mode mask); void nir_lower_io_to_scalar_early(nir_shader *shader, nir_variable_mode mask); diff --git a/src/compiler/nir/nir_lower_io_arrays_to_elements.c b/src/compiler/nir/nir_lower_io_arrays_to_elements.c index cdf9a76a881..9a5eec8f870 100644 --- a/src/compiler/nir/nir_lower_io_arrays_to_elements.c +++ b/src/compiler/nir/nir_lower_io_arrays_to_elements.c @@ -346,7 +346,8 @@ lower_io_arrays_to_elements(nir_shader *shader, nir_variable_mode mask, } void -nir_lower_io_arrays_to_elements_no_indirects(nir_shader *shader) +nir_lower_io_arrays_to_elements_no_indirects(nir_shader *shader, + bool outputs_only) { struct hash_table *split_inputs = _mesa_hash_table_create(NULL, _mesa_hash_pointer, @@ -360,19 +361,22 @@ nir_lower_io_arrays_to_elements_no_indirects(nir_shader *shader) lower_io_arrays_to_elements(shader, nir_var_shader_out, indirects, patch_indirects, split_outputs, true); - lower_io_arrays_to_elements(shader, nir_var_shader_in, indirects, - patch_indirects, split_inputs, true); + if (!outputs_only) { + lower_io_arrays_to_elements(shader, nir_var_shader_in, indirects, + patch_indirects, split_inputs, true); - /* Remove old input from the shaders inputs list */ - struct hash_entry *entry; - hash_table_foreach(split_inputs, entry) { - nir_variable *var = (nir_variable *) entry->key; - exec_node_remove(&var->node); + /* Remove old input from the shaders inputs list */ + struct hash_entry *entry; + hash_table_foreach(split_inputs, entry) { + nir_variable *var = (nir_variable *) entry->key; + exec_node_remove(&var->node); - free(entry->data); + free(entry->data); + } } /* Remove old output from the shaders outputs list */ + struct hash_entry *entry; hash_table_foreach(split_outputs, entry) { nir_variable *var = (nir_variable *) entry->key; exec_node_remove(&var->node); diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 6d3a7c78dcd..a3d447c5a41 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -660,7 +660,7 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, NIR_PASS_V(nir, nir_lower_var_copies); if (nir->info.stage != MESA_SHADER_TESS_CTRL && nir->info.stage != MESA_SHADER_TESS_EVAL) - NIR_PASS_V(nir, nir_lower_io_arrays_to_elements_no_indirects); + NIR_PASS_V(nir, nir_lower_io_arrays_to_elements_no_indirects, false); if (nir->info.stage == MESA_SHADER_VERTEX) { /* Needs special handling so drvloc matches the vbo state: */ |