Change a few frequented uses of DEBUG to !NDEBUG
[mesa.git] / src / mesa / state_tracker / st_glsl_types.cpp
index 37c3164254a8efa66842ecaf43c4de0445d2ba88..b0b422f41febcb757fb46add7da3f0e9080c3f4c 100644 (file)
 #include "st_glsl_types.h"
 
 /**
- * Returns type size in units of vec4 slots.
+ * Returns the number of places to offset the uniform index, given the type of
+ * a struct member. We use this because samplers and images have backing
+ * storeage only when they are bindless.
  */
 int
-st_glsl_attrib_type_size(const struct glsl_type *type, bool is_vs_input)
+st_glsl_storage_type_size(const struct glsl_type *type, bool is_bindless)
 {
    unsigned int i;
    int size;
@@ -53,7 +55,7 @@ st_glsl_attrib_type_size(const struct glsl_type *type, bool is_vs_input)
       break;
    case GLSL_TYPE_DOUBLE:
       if (type->is_matrix()) {
-         if (type->vector_elements <= 2 || is_vs_input)
+         if (type->vector_elements <= 2)
             return type->matrix_columns;
          else
             return type->matrix_columns * 2;
@@ -61,7 +63,7 @@ st_glsl_attrib_type_size(const struct glsl_type *type, bool is_vs_input)
          /* For doubles if we have a double or dvec2 they fit in one
           * vec4, else they need 2 vec4s.
           */
-         if (type->vector_elements <= 2 || is_vs_input)
+         if (type->vector_elements <= 2)
             return 1;
          else
             return 2;
@@ -69,31 +71,38 @@ st_glsl_attrib_type_size(const struct glsl_type *type, bool is_vs_input)
       break;
    case GLSL_TYPE_UINT64:
    case GLSL_TYPE_INT64:
-      if (type->vector_elements <= 2 || is_vs_input)
+      if (type->vector_elements <= 2)
          return 1;
       else
          return 2;
    case GLSL_TYPE_ARRAY:
       assert(type->length > 0);
-      return st_glsl_attrib_type_size(type->fields.array, is_vs_input) * type->length;
+      return st_glsl_storage_type_size(type->fields.array, is_bindless) *
+         type->length;
    case GLSL_TYPE_STRUCT:
       size = 0;
       for (i = 0; i < type->length; i++) {
-         size += st_glsl_attrib_type_size(type->fields.structure[i].type, is_vs_input);
+         size += st_glsl_storage_type_size(type->fields.structure[i].type,
+                                               is_bindless);
       }
       return size;
    case GLSL_TYPE_SAMPLER:
    case GLSL_TYPE_IMAGE:
+      if (!is_bindless)
+         return 0;
+      /* fall through */
    case GLSL_TYPE_SUBROUTINE:
-      /* Samplers take up one slot in UNIFORMS[], but they're baked in
-       * at link time.
-       */
       return 1;
    case GLSL_TYPE_ATOMIC_UINT:
    case GLSL_TYPE_INTERFACE:
    case GLSL_TYPE_VOID:
    case GLSL_TYPE_ERROR:
    case GLSL_TYPE_FUNCTION:
+   case GLSL_TYPE_FLOAT16:
+   case GLSL_TYPE_UINT16:
+   case GLSL_TYPE_INT16:
+   case GLSL_TYPE_UINT8:
+   case GLSL_TYPE_INT8:
       assert(!"Invalid type in type_size");
       break;
    }
@@ -101,7 +110,63 @@ st_glsl_attrib_type_size(const struct glsl_type *type, bool is_vs_input)
 }
 
 int
-st_glsl_type_size(const struct glsl_type *type)
+st_glsl_type_dword_size(const struct glsl_type *type, bool bindless)
 {
-   return st_glsl_attrib_type_size(type, false);
+   unsigned int size, i;
+
+   switch (type->base_type) {
+   case GLSL_TYPE_UINT:
+   case GLSL_TYPE_INT:
+   case GLSL_TYPE_FLOAT:
+   case GLSL_TYPE_BOOL:
+      return type->components();
+   case GLSL_TYPE_UINT16:
+   case GLSL_TYPE_INT16:
+   case GLSL_TYPE_FLOAT16:
+      return DIV_ROUND_UP(type->components(), 2);
+   case GLSL_TYPE_UINT8:
+   case GLSL_TYPE_INT8:
+      return DIV_ROUND_UP(type->components(), 4);
+   case GLSL_TYPE_IMAGE:
+   case GLSL_TYPE_SAMPLER:
+      if (!bindless)
+         return 0;
+   case GLSL_TYPE_DOUBLE:
+   case GLSL_TYPE_UINT64:
+   case GLSL_TYPE_INT64:
+      return type->components() * 2;
+   case GLSL_TYPE_ARRAY:
+      return st_glsl_type_dword_size(type->fields.array, bindless) *
+             type->length;
+   case GLSL_TYPE_STRUCT:
+      size = 0;
+      for (i = 0; i < type->length; i++) {
+         size += st_glsl_type_dword_size(type->fields.structure[i].type,
+                                         bindless);
+      }
+      return size;
+   case GLSL_TYPE_ATOMIC_UINT:
+      return 0;
+   case GLSL_TYPE_SUBROUTINE:
+      return 1;
+   case GLSL_TYPE_VOID:
+   case GLSL_TYPE_ERROR:
+   case GLSL_TYPE_INTERFACE:
+   case GLSL_TYPE_FUNCTION:
+   default:
+      unreachable("invalid type in st_glsl_type_dword_size()");
+   }
+
+   return 0;
+}
+
+/**
+ * Returns the type size of uniforms when !PIPE_CAP_PACKED_UNIFORMS -- each
+ * value or array element is aligned to a vec4 offset and expanded out to a
+ * vec4.
+ */
+int
+st_glsl_uniforms_type_size(const struct glsl_type *type, bool bindless)
+{
+   return st_glsl_storage_type_size(type, bindless);
 }