nir: add is_packing_supported_for_type() helper
authorTimothy Arceri <tarceri@itsqueeze.com>
Sun, 9 Dec 2018 22:42:42 +0000 (09:42 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Fri, 8 Feb 2019 02:54:56 +0000 (02:54 +0000)
This will be used in the following patches to determine if we
support packing the components of a varying.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/nir/nir_linking_helpers.c

index 3128ede2f15ba551aacc719f34f4bbd1afe5582f..d74cc6c87885ed6b558bdc6662831d445e63db5e 100644 (file)
@@ -226,6 +226,18 @@ get_interp_loc(nir_variable *var)
       return INTERPOLATE_LOC_CENTER;
 }
 
+static bool
+is_packing_supported_for_type(const struct glsl_type *type)
+{
+   /* We ignore complex types such as arrays, matrices, structs and bitsizes
+    * other then 32bit. All other vector types should have been split into
+    * scalar variables by the lower_io_to_scalar pass. The only exception
+    * should be OpenGL xfb varyings.
+    * TODO: add support for more complex types?
+    */
+   return glsl_type_is_scalar(type) && glsl_type_is_32bit(type);
+}
+
 static void
 get_slot_component_masks_and_interp_types(struct exec_list *var_list,
                                           uint8_t *comps,
@@ -428,21 +440,7 @@ compact_components(nir_shader *producer, nir_shader *consumer, uint8_t *comps,
             type = glsl_get_array_element(type);
          }
 
-         /* Skip types that require more complex packing handling.
-          * TODO: add support for these types.
-          */
-         if (glsl_type_is_array(type) ||
-             glsl_type_is_dual_slot(type) ||
-             glsl_type_is_matrix(type) ||
-             glsl_type_is_struct(type) ||
-             glsl_type_is_64bit(type))
-            continue;
-
-         /* We ignore complex types above and all other vector types should
-          * have been split into scalar variables by the lower_io_to_scalar
-          * pass. The only exception should by OpenGL xfb varyings.
-          */
-         if (glsl_get_vector_elements(type) != 1)
+         if (!is_packing_supported_for_type(type))
             continue;
 
          unsigned location = var->data.location - VARYING_SLOT_VAR0;