X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_glsl_types.cpp;h=42d4e9cef2d9fd1a21f59e45c429da7b7b8dfdfa;hb=4a29ee186195ab38a81280cefb6a476e3763da11;hp=37c3164254a8efa66842ecaf43c4de0445d2ba88;hpb=8ce53d4a2f3f44b8fa00a6a04ec0816f38d788db;p=mesa.git diff --git a/src/mesa/state_tracker/st_glsl_types.cpp b/src/mesa/state_tracker/st_glsl_types.cpp index 37c3164254a..42d4e9cef2d 100644 --- a/src/mesa/state_tracker/st_glsl_types.cpp +++ b/src/mesa/state_tracker/st_glsl_types.cpp @@ -27,10 +27,12 @@ #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,48 @@ 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) { - 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_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: + default: + unreachable("invalid type in st_glsl_type_dword_size()"); + } + + return 0; }