From ffb2d430596258aaeaf3b7ae7f295036ea4094d5 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 23 Jul 2012 14:11:38 -0700 Subject: [PATCH] glsl: Fix calculation of std140 offset alignment for mat2s. We were getting the base offset of a vec2, not of a vec2[2] like the quoted spec text says we should. v2: Fix swapped then/else cases. Reviewed-by: Kenneth Graunke --- src/glsl/glsl_types.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp index 3d786605824..2aa51f0b386 100644 --- a/src/glsl/glsl_types.cpp +++ b/src/glsl/glsl_types.cpp @@ -694,14 +694,19 @@ glsl_type::std140_base_alignment(bool row_major) const * row vectors with components each, according to rule (4). */ if (this->is_matrix()) { - const struct glsl_type *vec_type; + const struct glsl_type *vec_type, *array_type; + int c = this->matrix_columns; + int r = this->vector_elements; + if (row_major) { - vec_type = get_instance(GLSL_TYPE_FLOAT, this->vector_elements, 1); + vec_type = get_instance(GLSL_TYPE_FLOAT, c, 1); + array_type = glsl_type::get_array_instance(vec_type, r); } else { - vec_type = get_instance(GLSL_TYPE_FLOAT, this->matrix_columns, 1); + vec_type = get_instance(GLSL_TYPE_FLOAT, r, 1); + array_type = glsl_type::get_array_instance(vec_type, c); } - return vec_type->std140_base_alignment(false); + return array_type->std140_base_alignment(false); } /* (9) If the member is a structure, the base alignment of the -- 2.30.2