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

Author: Andrii Simiklit <[email protected]>
Date:   Tue Sep 10 17:00:32 2019 +0300

glsl: disallow incompatible matrices multiplication

glsl 4.4 spec section '5.9 expressions':
"The operator is multiply (*), where both operands are matrices or one operand 
is a vector and the
 other a matrix. A right vector operand is treated as a column vector and a 
left vector operand as a
 row vector. In all these cases, it is required that the number of columns of 
the left operand is equal
 to the number of rows of the right operand. Then, the multiply (*) operation 
does a linear
 algebraic multiply, yielding an object that has the same number of rows as the 
left operand and the
 same number of columns as the right operand. Section 5.10 “Vector and Matrix 
Operations”
 explains in more detail how vectors and matrices are operated on."

This fix disallows a multiplication of incompatible matrices like:
mat4x3(..) * mat4x3(..)
mat4x2(..) * mat4x2(..)
mat3x2(..) * mat3x2(..)
....

CC: <[email protected]>
Reviewed-by: Eric Anholt <[email protected]>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111664
Signed-off-by: Andrii Simiklit <[email protected]>

---

 src/compiler/glsl_types.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/compiler/glsl_types.cpp b/src/compiler/glsl_types.cpp
index 2213055021d..e412f16bcfa 100644
--- a/src/compiler/glsl_types.cpp
+++ b/src/compiler/glsl_types.cpp
@@ -1354,9 +1354,7 @@ glsl_type::get_function_instance(const glsl_type 
*return_type,
 const glsl_type *
 glsl_type::get_mul_type(const glsl_type *type_a, const glsl_type *type_b)
 {
-   if (type_a == type_b) {
-      return type_a;
-   } else if (type_a->is_matrix() && type_b->is_matrix()) {
+   if (type_a->is_matrix() && type_b->is_matrix()) {
       /* Matrix multiply.  The columns of A must match the rows of B.  Given
        * the other previously tested constraints, this means the vector type
        * of a row from A must be the same as the vector type of a column from
@@ -1376,6 +1374,8 @@ glsl_type::get_mul_type(const glsl_type *type_a, const 
glsl_type *type_b)
 
          return type;
       }
+   } else if (type_a == type_b) {
+      return type_a;
    } else if (type_a->is_matrix()) {
       /* A is a matrix and B is a column vector.  Columns of A must match
        * rows of B.  Given the other previously tested constraints, this

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to