[Mesa-dev] [PATCH 02/15] nir: allow builin arrays to be lowered

Timothy Arceri tarceri at itsqueeze.com
Wed Nov 22 10:29:49 UTC 2017


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);
 
    /* 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);
    }
 
-- 
2.14.3



More information about the mesa-dev mailing list