Mesa (master): st: add st_glsl_type_dword_size() helper

Timothy Arceri tarceri at kemper.freedesktop.org
Tue Mar 20 03:24:30 UTC 2018


Module: Mesa
Branch: master
Commit: a80cf442d939212da40951a0a57a0978de6f39a6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a80cf442d939212da40951a0a57a0978de6f39a6

Author: Timothy Arceri <tarceri at itsqueeze.com>
Date:   Tue Mar 13 12:34:50 2018 +1100

st: add st_glsl_type_dword_size() helper

This will be used to support uniform packing.

Reviewed-by: Marek Olšák <marek.olsak at amd.com>

---

 src/mesa/state_tracker/st_glsl_types.cpp | 43 ++++++++++++++++++++++++++++++++
 src/mesa/state_tracker/st_glsl_types.h   |  1 +
 2 files changed, 44 insertions(+)

diff --git a/src/mesa/state_tracker/st_glsl_types.cpp b/src/mesa/state_tracker/st_glsl_types.cpp
index d4d2139d9d..ef7b7fa777 100644
--- a/src/mesa/state_tracker/st_glsl_types.cpp
+++ b/src/mesa/state_tracker/st_glsl_types.cpp
@@ -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;
+}
diff --git a/src/mesa/state_tracker/st_glsl_types.h b/src/mesa/state_tracker/st_glsl_types.h
index 915816d1fa..16b31b684f 100644
--- a/src/mesa/state_tracker/st_glsl_types.h
+++ b/src/mesa/state_tracker/st_glsl_types.h
@@ -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
 }




More information about the mesa-commit mailing list