st: add st_glsl_type_dword_size() helper
authorTimothy Arceri <tarceri@itsqueeze.com>
Tue, 13 Mar 2018 01:34:50 +0000 (12:34 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Tue, 20 Mar 2018 03:17:34 +0000 (14:17 +1100)
This will be used to support uniform packing.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/mesa/state_tracker/st_glsl_types.cpp
src/mesa/state_tracker/st_glsl_types.h

index d4d2139d9da2f493ec21cba4f097d686f2d7dfbd..ef7b7fa777ce3873639c99dd043823743375c247 100644 (file)
@@ -108,3 +108,46 @@ st_glsl_storage_type_size(const struct glsl_type *type, bool is_bindless)
    }
    return 0;
 }
+
+int
+st_glsl_type_dword_size(const struct glsl_type *type)
+{
+   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_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) * 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);
+      }
+      return size;
+   case GLSL_TYPE_IMAGE:
+   case GLSL_TYPE_SAMPLER:
+   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:
+      unreachable("not reached");
+   }
+
+   return 0;
+}
index 915816d1fa0c3ee5a662781f5d6811d920d5c5f9..16b31b684f38701752ed5cd0c952bbcb0ee1225c 100644 (file)
@@ -36,6 +36,7 @@ extern "C" {
 int st_glsl_storage_type_size(const struct glsl_type *type,
                               bool is_bindless);
 
+int st_glsl_type_dword_size(const struct glsl_type *type);
 
 #ifdef __cplusplus
 }