diff options
author | Timothy Arceri <[email protected]> | 2018-03-13 12:34:50 +1100 |
---|---|---|
committer | Timothy Arceri <[email protected]> | 2018-03-20 14:17:34 +1100 |
commit | a80cf442d939212da40951a0a57a0978de6f39a6 (patch) | |
tree | b1175b98b74d50ee16de73893930d5efb9bc84ed /src/mesa | |
parent | 54881667308aea17f7f21720f5e8b41cf45f2020 (diff) |
st: add st_glsl_type_dword_size() helper
This will be used to support uniform packing.
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/state_tracker/st_glsl_types.cpp | 43 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_glsl_types.h | 1 |
2 files changed, 44 insertions, 0 deletions
diff --git a/src/mesa/state_tracker/st_glsl_types.cpp b/src/mesa/state_tracker/st_glsl_types.cpp index d4d2139d9da..ef7b7fa777c 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 915816d1fa0..16b31b684f3 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 } |