nir/lower_io_to_vector: don't create arrays when not needed
authorRhys Perry <pendingchaos02@gmail.com>
Thu, 14 Nov 2019 15:31:52 +0000 (15:31 +0000)
committerRhys Perry <pendingchaos02@gmail.com>
Mon, 2 Dec 2019 17:45:01 +0000 (17:45 +0000)
Some backends require that there are no array varyings.

If there were no arrays in the input shader, the pass shouldn't have to
create new ones.

Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/2103
Fixes: bcd14756eec ('nir/lower_io_to_vector: add flat mode')
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Connor Abbott <cwabbott0@gmail.com>
src/compiler/nir/nir_lower_io_to_vector.c

index 0ef40216da6817916d7fc8116390b3018869d739..82c4bdf87496ae9ba6c25d0cda314dd8aedb6899 100644 (file)
@@ -184,7 +184,10 @@ get_flat_type(const nir_shader *shader, nir_variable *old_vars[MAX_SLOTS][4],
    if (num_vars <= 1)
       return NULL;
 
-   return glsl_array_type(glsl_vector_type(base, 4), slots, 0);
+   if (slots == 1)
+      return glsl_vector_type(base, 4);
+   else
+      return glsl_array_type(glsl_vector_type(base, 4), slots, 0);
 }
 
 static bool
@@ -340,6 +343,9 @@ build_array_deref_of_new_var_flat(nir_shader *shader,
       deref = nir_build_deref_array(b, deref, index);
    }
 
+   if (!glsl_type_is_array(deref->type))
+      return deref;
+
    bool vs_in = shader->info.stage == MESA_SHADER_VERTEX &&
                 new_var->data.mode == nir_var_shader_in;
    return nir_build_deref_array(