glsl_count_attribute_slots takes a parameter to specify whether the type is being used as a vertex input because on GL double attributes only take up one slot. Vulkan doesn’t make this distinction so this patch renames the argument to is_gl_vertex_input in order to make it more clear that it should always be false on Vulkan. --- src/compiler/glsl_types.cpp | 16 ++++++++++------ src/compiler/glsl_types.h | 5 ++++- src/compiler/nir_types.cpp | 4 ++-- src/compiler/nir_types.h | 2 +- 4 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/src/compiler/glsl_types.cpp b/src/compiler/glsl_types.cpp index 9d853caf721..50aac611981 100644 --- a/src/compiler/glsl_types.cpp +++ b/src/compiler/glsl_types.cpp @@ -1942,7 +1942,7 @@ glsl_type::std430_size(bool row_major) const } unsigned -glsl_type::count_attribute_slots(bool is_vertex_input) const +glsl_type::count_attribute_slots(bool is_gl_vertex_input) const { /* From page 31 (page 37 of the PDF) of the GLSL 1.50 spec: * @@ -1985,7 +1985,7 @@ glsl_type::count_attribute_slots(bool is_vertex_input) const case GLSL_TYPE_DOUBLE: case GLSL_TYPE_UINT64: case GLSL_TYPE_INT64: - if (this->vector_elements > 2 && !is_vertex_input) + if (this->vector_elements > 2 && !is_gl_vertex_input) return this->matrix_columns * 2; else return this->matrix_columns; @@ -1993,14 +1993,18 @@ glsl_type::count_attribute_slots(bool is_vertex_input) const case GLSL_TYPE_INTERFACE: { unsigned size = 0; - for (unsigned i = 0; i < this->length; i++) - size += this->fields.structure[i].type->count_attribute_slots(is_vertex_input); + for (unsigned i = 0; i < this->length; i++) { + const glsl_type *member = this->fields.structure[i].type; + size += member->count_attribute_slots(is_gl_vertex_input); + } return size; } - case GLSL_TYPE_ARRAY: - return this->length * this->fields.array->count_attribute_slots(is_vertex_input); + case GLSL_TYPE_ARRAY: { + const glsl_type *element = this->fields.array; + return this->length * element->count_attribute_slots(is_gl_vertex_input); + } case GLSL_TYPE_SUBROUTINE: return 1; diff --git a/src/compiler/glsl_types.h b/src/compiler/glsl_types.h index 88f987fabee..61eb36ca5c3 100644 --- a/src/compiler/glsl_types.h +++ b/src/compiler/glsl_types.h @@ -366,8 +366,11 @@ public: * * For vertex shader attributes - doubles only take one slot. * For inter-shader varyings - dvec3/dvec4 take two slots. + * + * Vulkan doesn’t make this distinction so the argument should always be + * false. */ - unsigned count_attribute_slots(bool is_vertex_input) const; + unsigned count_attribute_slots(bool is_gl_vertex_input) const; /** * Alignment in bytes of the start of this type in a std140 uniform diff --git a/src/compiler/nir_types.cpp b/src/compiler/nir_types.cpp index 78b66803f08..3969d51c85b 100644 --- a/src/compiler/nir_types.cpp +++ b/src/compiler/nir_types.cpp @@ -119,9 +119,9 @@ glsl_get_aoa_size(const struct glsl_type *type) unsigned glsl_count_attribute_slots(const struct glsl_type *type, - bool is_vertex_input) + bool is_gl_vertex_input) { - return type->count_attribute_slots(is_vertex_input); + return type->count_attribute_slots(is_gl_vertex_input); } const char * diff --git a/src/compiler/nir_types.h b/src/compiler/nir_types.h index 5b441af1486..3b890f88a55 100644 --- a/src/compiler/nir_types.h +++ b/src/compiler/nir_types.h @@ -72,7 +72,7 @@ unsigned glsl_get_length(const struct glsl_type *type); unsigned glsl_get_aoa_size(const struct glsl_type *type); unsigned glsl_count_attribute_slots(const struct glsl_type *type, - bool is_vertex_input); + bool is_gl_vertex_input); const char *glsl_get_struct_elem_name(const struct glsl_type *type, unsigned index); -- 2.14.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev