nir_types: add glsl_type_is_leaf helper
authorAlejandro Piñeiro <apinheiro@igalia.com>
Thu, 17 Jan 2019 12:20:54 +0000 (13:20 +0100)
committerArcady Goldmints-Orlov <agoldmints@igalia.com>
Sun, 30 Jun 2019 21:58:26 +0000 (16:58 -0500)
Helper used to know when a glsl_type is a leaf when iteraring through
a complex type. Note that GLSL IR linking also uses the concept of
leaf while doing the same iteration, although in that case it uses a
visitor. See link_uniform_blocks, process_array_leaf and others as
reference.

Signed-off-by: Alejandro Piñeiro <apinheiro@igalia.com>
Signed-off-by: Antia Puentes <apuentes@igalia.com>
v2:
   * Moved from gl_nir_linker to nir_types, so it could be used on nir
     xfb gathering (Timothy Arceri)
   * Minor update after Timothy's series about record to struct
     renaming landed master.

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
src/compiler/nir_types.cpp
src/compiler/nir_types.h

index 69f89a7fd74ffa28afc714ef3dce7c626d13146e..3b6362e66fa50e999b9c6f5d202c63d7cecc8178 100644 (file)
@@ -727,3 +727,16 @@ glsl_get_explicit_size(const struct glsl_type *type, bool align_to_stride)
 {
    return type->explicit_size(align_to_stride);
 }
+
+bool
+glsl_type_is_leaf(const struct glsl_type *type)
+{
+   if (glsl_type_is_struct_or_ifc(type) ||
+       (glsl_type_is_array(type) &&
+        (glsl_type_is_array(glsl_get_array_element(type)) ||
+         glsl_type_is_struct_or_ifc(glsl_get_array_element(type))))) {
+      return false;
+   } else {
+      return true;
+   }
+}
index 806ba824084e752e98c8a501dec80a2dca379c3b..9efe4b4770c521e2cc4a12b0f98b4e32678ccebd 100644 (file)
@@ -202,6 +202,8 @@ const struct glsl_type *glsl_atomic_uint_type(void);
 unsigned glsl_type_get_sampler_count(const struct glsl_type *type);
 unsigned glsl_type_get_image_count(const struct glsl_type *type);
 
+bool glsl_type_is_leaf(const struct glsl_type *type);
+
 #ifdef __cplusplus
 }
 #endif