On 22.11.2017 11:29, Timothy Arceri wrote:
Galliums nir drivers expect this to be done.
---
  src/compiler/nir/nir_lower_io_arrays_to_elements.c | 17 ++++++++++-------
  1 file changed, 10 insertions(+), 7 deletions(-)

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 29076bf79b..dfd8e85d96 100644
--- a/src/compiler/nir/nir_lower_io_arrays_to_elements.c
+++ b/src/compiler/nir/nir_lower_io_arrays_to_elements.c
@@ -249,21 +249,22 @@ create_indirects_mask(nir_shader *shader, uint64_t 
*indirects,
                 }
              }
           }
        }
     }
  }
static void
  lower_io_arrays_to_elements(nir_shader *shader, nir_variable_mode mask,
                              uint64_t *indirects, uint64_t *patch_indirects,
-                            struct hash_table *varyings)
+                            struct hash_table *varyings,
+                            bool after_cross_stage_opts)
  {
     nir_foreach_function(function, shader) {
        if (function->impl) {
           nir_builder b;
           nir_builder_init(&b, function->impl);
nir_foreach_block(block, function->impl) {
              nir_foreach_instr_safe(instr, block) {
                 if (instr->type != nir_instr_type_intrinsic)
                    continue;
@@ -298,28 +299,30 @@ lower_io_arrays_to_elements(nir_shader *shader, 
nir_variable_mode mask,
                 }
/* Skip types we cannot split.
                  *
                  * TODO: Add support for struct splitting.
                  */
                 if ((!glsl_type_is_array(type) && !glsl_type_is_matrix(type))||
                     glsl_type_is_struct(glsl_without_array(type)))
                    continue;
- if (var->data.location < VARYING_SLOT_VAR0 &&
+               /* Skip builtins */
+               if (!after_cross_stage_opts &&
+                   var->data.location < VARYING_SLOT_VAR0 &&
                     var->data.location >= 0)
                    continue;
/* Don't bother splitting if we can't opt away any unused
                  * elements.
                  */
-               if (var->data.always_active_io)
+               if (!after_cross_stage_opts && var->data.always_active_io)
                    continue;
switch (intr->intrinsic) {
                 case nir_intrinsic_interp_var_at_centroid:
                 case nir_intrinsic_interp_var_at_sample:
                 case nir_intrinsic_interp_var_at_offset:
                 case nir_intrinsic_load_var:
                 case nir_intrinsic_store_var:
                    if ((mask & nir_var_shader_in && mode == nir_var_shader_in) 
||
                        (mask & nir_var_shader_out && mode == 
nir_var_shader_out))
@@ -340,24 +343,24 @@ nir_lower_io_arrays_to_elements_no_indirects(nir_shader 
*shader)
     struct hash_table *split_inputs =
        _mesa_hash_table_create(NULL, _mesa_hash_pointer,
                                _mesa_key_pointer_equal);
     struct hash_table *split_outputs =
        _mesa_hash_table_create(NULL, _mesa_hash_pointer,
                                _mesa_key_pointer_equal);
uint64_t indirects[4] = {0}, patch_indirects[4] = {0}; lower_io_arrays_to_elements(shader, nir_var_shader_out, indirects,
-                               patch_indirects, split_outputs);
+                               patch_indirects, split_outputs, true);
lower_io_arrays_to_elements(shader, nir_var_shader_in, indirects,
-                               patch_indirects, split_inputs);
+                               patch_indirects, split_inputs, true);

The name of the function ("no indirects") doesn't really reflect the semantic difference between the two top-level functions anymore. I don't have a good alternative suggestion right now, though.

Cheers,
Nicolai


/* 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);
     }
@@ -381,24 +384,24 @@ nir_lower_io_arrays_to_elements(nir_shader *producer, nir_shader *consumer)
                                _mesa_key_pointer_equal);
     struct hash_table *split_outputs =
        _mesa_hash_table_create(NULL, _mesa_hash_pointer,
                                _mesa_key_pointer_equal);
uint64_t indirects[4] = {0}, patch_indirects[4] = {0};
     create_indirects_mask(producer, indirects, patch_indirects);
     create_indirects_mask(consumer, indirects, patch_indirects);
lower_io_arrays_to_elements(producer, nir_var_shader_out, indirects,
-                               patch_indirects, split_outputs);
+                               patch_indirects, split_outputs, false);
lower_io_arrays_to_elements(consumer, nir_var_shader_in, indirects,
-                               patch_indirects, split_inputs);
+                               patch_indirects, split_inputs, false);
/* 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);
     }


--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to