[Piglit] [PATCH] gen_builtin_functions: add test for assignment operators

Dylan Baker baker.dylan.c at gmail.com
Wed May 21 18:26:29 PDT 2014


Adds shader_tests for +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, and |=

This generates 816 new tests by extending gen_builtin_unform_tests.

Signed-off-by: Dylan Baker <baker.dylan.c at gmail.com>
---
 generated_tests/builtin_function.py              | 92 +++++++++++++++++++++++-
 generated_tests/gen_constant_array_size_tests.py |  9 ++-
 2 files changed, 97 insertions(+), 4 deletions(-)

diff --git a/generated_tests/builtin_function.py b/generated_tests/builtin_function.py
index fc25ce1..340cb8a 100644
--- a/generated_tests/builtin_function.py
+++ b/generated_tests/builtin_function.py
@@ -1043,6 +1043,55 @@ def _make_vector_or_matrix_test_vectors(test_suite_dict):
         assert not y_type.is_matrix
         return x_type.num_rows == y_type.num_rows
 
+    def match_assignment_operators(x, y):
+        """ Determine when scalar and matrix arithmetic works
+
+        A matrix and a scalar can be combined, but only when being assigned
+        into a large enough type.
+
+        """
+        x_type = glsl_type_of(x)
+        y_type = glsl_type_of(y)
+        if x_type.base_type != y_type.base_type:
+            return False
+        if y_type.is_scalar:
+            return True
+        return x_type == y_type
+
+    def match_assignment_multiply(x, y):
+        """Determine whether the type of the arguments is compatible
+        for multiply.
+
+        Arguments are compatible if they are scalars, vectors, or
+        matrices with the same base type, and the vector/matrix sizes
+        are properly matched, and that y is scalar
+        """
+        x_type = glsl_type_of(x)
+        y_type = glsl_type_of(y)
+        if x_type.base_type != y_type.base_type:
+            return False
+        if y_type.is_scalar:
+            return True
+        if x_type.is_scalar:
+            return False
+        if x_type.is_vector and y_type.is_matrix:
+            # When multiplying vector * matrix, the vector is
+            # transposed to a row vector.  So its row count must match
+            # the row count of the matrix.
+            return x_type.num_rows == y_type.num_rows == y_type.num_cols
+        elif x_type.is_vector:
+            assert y_type.is_vector
+            # When multiplying vector * vector, the multiplication is
+            # done componentwise, so the types must match exactly.
+            return x_type == y_type
+        else:
+            assert x_type.is_matrix
+            # When multiplying matrix * matrix or matrix * vector, a
+            # standard linear algebraic multiply is used, so x's
+            # column count must match y's row count.
+            return (x_type.num_cols == y_type.num_rows and
+                    x_type.num_cols == y_type.num_cols)
+
     bools = [False, True]
     bvecs = [np.array(bs) for bs in itertools.product(bools, bools)] + \
         [np.array(bs) for bs in itertools.product(bools, bools, bools)] + \
@@ -1206,6 +1255,48 @@ def _make_vector_or_matrix_test_vectors(test_suite_dict):
                 test_inputs, python_equivalent, tolerance_function),
             template=template)
 
+    f('op-assign-add', 2, 110, lambda x, y: x + y, match_assignment_operators,
+      [floats+vecs+mats+ints+ivecs+uints+uvecs,
+       floats+vecs+mats+ints+ivecs+uints+uvecs],
+      template='{0};\n  result += {1}')
+    f('op-assign-sub', 2, 110, lambda x, y: x - y, match_assignment_operators,
+      [floats+vecs+mats+ints+ivecs+uints+uvecs,
+       floats+vecs+mats+ints+ivecs+uints+uvecs],
+      template='{0};\n  result -= {1}')
+    f('op-assign-mult', 2, 110, _multiply, match_assignment_multiply,
+      [floats+vecs+mats+ints+ivecs+uints+uvecs,
+       floats+vecs+mats+ints+ivecs+uints+uvecs],
+      template='{0};\n  result *= {1}')
+    f('op-assign-div', 2, 110, _divide, match_assignment_operators,
+      [floats+vecs+mats+ints+ivecs+uints+uvecs,
+       floats+vecs+mats+ints+ivecs+uints+uvecs],
+      template='{0};\n  result /= {1}')
+    f('op-assign-div-large', 2, 130, _divide, match_assignment_operators,
+      [large_uints, large_uints+small_uints],
+      template='{0};\n  result /= {1}')
+    f('op-assign-mod', 2, 130, _modulus, match_assignment_operators,
+      [ints+ivecs+uints+uvecs, ints+ivecs+uints+uvecs],
+      template='{0};\n result %= {1}')
+    f('op-assign-bitand', 2, 130, lambda x, y: x & y,
+      match_assignment_operators,
+      [ints+ivecs+uints+uvecs, ints+ivecs+uints+uvecs],
+      template='{0};  result &= {1}')
+    f('op-assign-bitor', 2, 130, lambda x, y: x | y,
+      match_assignment_operators,
+      [ints+ivecs+uints+uvecs, ints+ivecs+uints+uvecs],
+      template='{0};\n  result |= {1}')
+    f('op-assign-bitxor', 2, 130, lambda x, y: x ^ y,
+      match_assignment_operators,
+      [ints+ivecs+uints+uvecs, ints+ivecs+uints+uvecs],
+      template='{0};\n  result ^= {1}')
+    f('op-assign-lshift', 2, 130, _lshift, match_shift,
+      [small_ints+small_ivecs+small_uints+small_uvecs,
+       small_ints+small_ivecs+small_uints+small_uvecs],
+      template='{0};  result <<= {1}')
+    f('op-assign-rshift', 2, 130, _rshift, match_shift,
+      [small_ints+small_ivecs+small_uints+small_uvecs,
+       small_ints+small_ivecs+small_uints+small_uvecs],
+      template='{0};  result >>= {1}')
     f('op-add', 2, 110, lambda x, y: x + y, match_simple_binop,
       [floats+vecs+mats+ints+ivecs+uints+uvecs,
        floats+vecs+mats+ints+ivecs+uints+uvecs],
@@ -1305,7 +1396,6 @@ def _make_vector_or_matrix_test_vectors(test_suite_dict):
     f('inverse', 1, 140, np.linalg.inv, None, [squaremats])
 
     f('determinant', 1, 150, np.linalg.det, None, [squaremats])
-
 _make_vector_or_matrix_test_vectors(test_suite)
 
 
diff --git a/generated_tests/gen_constant_array_size_tests.py b/generated_tests/gen_constant_array_size_tests.py
index 99b15d0..e1ce136 100644
--- a/generated_tests/gen_constant_array_size_tests.py
+++ b/generated_tests/gen_constant_array_size_tests.py
@@ -242,9 +242,12 @@ class FragmentParserTest(ParserTest):
 
 def all_tests():
     for signature, test_vectors in sorted(test_suite.items()):
-        yield VertexParserTest(signature, test_vectors)
-        yield GeometryParserTest(signature, test_vectors)
-        yield FragmentParserTest(signature, test_vectors)
+        # Assignment operators other than = cannot be used in the constant
+        # array size tests
+        if not signature.name.startswith('op-assign'):
+            yield VertexParserTest(signature, test_vectors)
+            yield GeometryParserTest(signature, test_vectors)
+            yield FragmentParserTest(signature, test_vectors)
 
 
 def main():
-- 
2.0.0.rc2



More information about the Piglit mailing list