glsl/types: Add a real is_integer helper
[mesa.git] / src / compiler / nir_types.cpp
index 9101d49ffbb07b019b689efa89b65ec5319441bb..e2dfc40ff0b0c37ab6c4ac7c26a5c6e42691f973 100644 (file)
@@ -510,9 +510,10 @@ glsl_array_type(const glsl_type *base, unsigned elements,
 
 const glsl_type *
 glsl_struct_type(const glsl_struct_field *fields,
-                 unsigned num_fields, const char *name)
+                 unsigned num_fields, const char *name,
+                 bool packed)
 {
-   return glsl_type::get_struct_instance(fields, num_fields, name);
+   return glsl_type::get_struct_instance(fields, num_fields, name, packed);
 }
 
 const glsl_type *
@@ -629,7 +630,7 @@ glsl_get_natural_size_align_bytes(const struct glsl_type *type,
       *size = 0;
       *align = 0;
       for (unsigned i = 0; i < type->length; i++) {
-         unsigned elem_size, elem_align;
+         unsigned elem_size = 0, elem_align = 0;
          glsl_get_natural_size_align_bytes(type->fields.structure[i].type,
                                            &elem_size, &elem_align);
          *align = MAX2(*align, elem_align);
@@ -666,3 +667,57 @@ glsl_contains_atomic(const struct glsl_type *type)
 {
    return type->contains_atomic();
 }
+
+int
+glsl_get_cl_size(const struct glsl_type *type)
+{
+   return type->cl_size();
+}
+
+int
+glsl_get_cl_alignment(const struct glsl_type *type)
+{
+   return type->cl_alignment();
+}
+
+unsigned
+glsl_type_get_sampler_count(const struct glsl_type *type)
+{
+   if (glsl_type_is_array(type)) {
+      return (glsl_get_aoa_size(type) *
+              glsl_type_get_sampler_count(glsl_without_array(type)));
+   }
+
+   if (glsl_type_is_struct_or_ifc(type)) {
+      unsigned count = 0;
+      for (unsigned i = 0; i < glsl_get_length(type); i++)
+         count += glsl_type_get_sampler_count(glsl_get_struct_field(type, i));
+      return count;
+   }
+
+   if (glsl_type_is_sampler(type))
+      return 1;
+
+   return 0;
+}
+
+unsigned
+glsl_type_get_image_count(const struct glsl_type *type)
+{
+   if (glsl_type_is_array(type)) {
+      return (glsl_get_aoa_size(type) *
+              glsl_type_get_image_count(glsl_without_array(type)));
+   }
+
+   if (glsl_type_is_struct_or_ifc(type)) {
+      unsigned count = 0;
+      for (unsigned i = 0; i < glsl_get_length(type); i++)
+         count += glsl_type_get_image_count(glsl_get_struct_field(type, i));
+      return count;
+   }
+
+   if (glsl_type_is_image(type))
+      return 1;
+
+   return 0;
+}