summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Berry <stereotype441@gmail.com>2011-08-12 12:58:48 -0700
committerPaul Berry <stereotype441@gmail.com>2011-08-18 13:56:27 -0700
commit1cf65147f9d5f348e10c5e4fa2f3cd206d82abe8 (patch)
tree47de66987ab6922a7cac86953e07beb5873e0294
parent5619ab332718b2d4320b56e73d0d00644a8ea219 (diff)
generated tests: Test operators that were introduced in GLSL 1.30
GLSL 1.30 adds support for the following operators: %, ~, <<, >>, &, ^, and |. This patch adds autogenerated tests for testing the functionality of all these operators. Reviewed-by: Chad Versace <chad@chad-versace.us>
-rw-r--r--generated_tests/builtin_function.py114
1 files changed, 114 insertions, 0 deletions
diff --git a/generated_tests/builtin_function.py b/generated_tests/builtin_function.py
index 52740e871..3175a2fb5 100644
--- a/generated_tests/builtin_function.py
+++ b/generated_tests/builtin_function.py
@@ -348,6 +348,55 @@ def _divide(x, y):
else:
return x / y
+def _modulus(x, y):
+ if any(x_element < 0 for x_element in column_major_values(x)):
+ # Modulus operation with a negative first operand is
+ # undefined.
+ return None
+ if any(y_element <= 0 for y_element in column_major_values(y)):
+ # Modulus operation with a negative or zero second operand is
+ # undefined.
+ return None
+ return x % y
+
+def _lshift(x, y):
+ if not all(0 <= y_element < 32 for y_element in column_major_values(y)):
+ # Shifts by less than 0 or more than the number of bits in the
+ # type being shifted are undefined.
+ return None
+ # When the arguments to << don't have the same signedness, numpy
+ # likes to promote them to int64. To avoid this, convert y to be
+ # the same type as x.
+ y_orig = y
+ if glsl_type_of(x).base_type != glsl_type_of(y).base_type:
+ y = _change_signedness(y)
+ result = x << y
+
+ # Shifting should always produce a result with the same base type
+ # as the left argument.
+ assert glsl_type_of(result).base_type == glsl_type_of(x).base_type
+
+ return result
+
+def _rshift(x, y):
+ if not all(0 <= y_element < 32 for y_element in column_major_values(y)):
+ # Shifts by less than 0 or more than the number of bits in the
+ # type being shifted are undefined.
+ return None
+ # When the arguments to >> don't have the same signedness, numpy
+ # likes to promote them to int64. To avoid this, convert y to be
+ # the same type as x.
+ y_orig = y
+ if glsl_type_of(x).base_type != glsl_type_of(y).base_type:
+ y = _change_signedness(y)
+ result = x >> y
+
+ # Shifting should always produce a result with the same base type
+ # as the left argument.
+ assert glsl_type_of(result).base_type == glsl_type_of(x).base_type
+
+ return result
+
def _equal(x, y):
return all(column_major_values(x == y))
@@ -395,6 +444,22 @@ def _refract(I, N, eta):
+def _change_signedness(x):
+ """Change signed integer types to unsigned integer types and vice
+ versa."""
+ if isinstance(x, np.int32):
+ return np.uint32(x)
+ elif isinstance(x, np.uint32):
+ return np.int32(x)
+ elif isinstance(x, np.ndarray):
+ if (x.dtype == np.int32):
+ return np.array(x, dtype=np.uint32)
+ elif (x.dtype == np.uint32):
+ return np.array(x, dtype=np.int32)
+ raise Exception('Unexpected type passed to _change_signedness')
+
+
+
def _argument_types_match(arguments, argument_indices_to_match):
"""Return True if all of the arguments indexed by
argument_indices_to_match have the same GLSL type.
@@ -853,12 +918,32 @@ def _make_vector_or_matrix_test_vectors(test_suite_dict):
# 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
+ def match_shift(x, y):
+ """Determine whether the type of the arguments is compatible
+ for shift operations.
+
+ Arguments are compatible if they are the same length or the
+ first one is a vector and the second is a scalar. Their base
+ types need not be the same, but they both must be integral.
+ """
+ x_type = glsl_type_of(x)
+ y_type = glsl_type_of(y)
+ if x_type.base_type not in (glsl_int, glsl_uint):
+ return False
+ if y_type.base_type not in (glsl_int, glsl_uint):
+ return False
+ if y_type.is_scalar:
+ return True
+ assert not x_type.is_matrix
+ assert not y_type.is_matrix
+ return x_type.num_rows == y_type.num_rows
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)] + \
[np.array(bs) for bs in itertools.product(bools, bools, bools, bools)]
ints = [np.int32(x) for x in [12, -6, 74, -32, 0]]
+ small_ints = [np.int32(x) for x in [-31, -25, -5, -2, -1, 0, 1, 2, 5, 25, 31]]
ivecs = [
np.array([38, 35], dtype=np.int32),
np.array([64, -9], dtype=np.int32),
@@ -871,7 +956,21 @@ def _make_vector_or_matrix_test_vectors(test_suite_dict):
np.array([-24, 40, -23, 74], dtype=np.int32),
np.array([24, 40, 23, 74], dtype=np.int32),
]
+ small_ivecs = [
+ np.array([13, 26], dtype=np.int32),
+ np.array([-2, 26], dtype=np.int32),
+ np.array([2, 26], dtype=np.int32),
+ np.array([22, -23, 4], dtype=np.int32),
+ np.array([22, 23, 4], dtype=np.int32),
+ np.array([-19, 1, -13], dtype=np.int32),
+ np.array([19, 1, 13], dtype=np.int32),
+ np.array([16, 24, -23, -25], dtype=np.int32),
+ np.array([16, 24, 23, 25], dtype=np.int32),
+ np.array([-23, -12, 14, 19], dtype=np.int32),
+ np.array([23, 12, 14, 19], dtype=np.int32),
+ ]
uints = [np.uint32(x) for x in [0, 6, 12, 32, 74]]
+ small_uints = [np.uint32(x) for x in [0, 1, 2, 5, 25, 31]]
uvecs = [
np.array([38, 35], dtype=np.uint32),
np.array([64, 9], dtype=np.uint32),
@@ -880,6 +979,14 @@ def _make_vector_or_matrix_test_vectors(test_suite_dict):
np.array([66, 72, 87, 75], dtype=np.uint32),
np.array([24, 40, 23, 74], dtype=np.uint32)
]
+ small_uvecs = [
+ np.array([13, 26], dtype=np.uint32),
+ np.array([2, 26], dtype=np.uint32),
+ np.array([22, 23, 4], dtype=np.uint32),
+ np.array([19, 1, 13], dtype=np.uint32),
+ np.array([16, 24, 23, 25], dtype=np.uint32),
+ np.array([23, 12, 14, 19], dtype=np.uint32),
+ ]
nz_floats = [-1.33, 0.85]
floats = [0.0] + nz_floats
vecs = [
@@ -993,6 +1100,7 @@ def _make_vector_or_matrix_test_vectors(test_suite_dict):
f('op-sub', 2, '1.10', lambda x, y: x - y, match_simple_binop, [floats+vecs+mats+ints+ivecs+uints+uvecs, floats+vecs+mats+ints+ivecs+uints+uvecs], template = '({0} - {1})')
f('op-mult', 2, '1.10', _multiply, match_multiply, [floats+vecs+mats+ints+ivecs+uints+uvecs, floats+vecs+mats+ints+ivecs+uints+uvecs], template = '({0} * {1})')
f('op-div', 2, '1.10', _divide, match_simple_binop, [floats+vecs+mats+ints+ivecs+uints+uvecs, floats+vecs+mats+ints+ivecs+uints+uvecs], template = '({0} / {1})')
+ f('op-mod', 2, '1.30', _divide, match_simple_binop, [ints+ivecs+uints+uvecs, ints+ivecs+uints+uvecs], template = '({0} / {1})')
f('op-uplus', 1, '1.10', lambda x: +x, None, [floats+vecs+mats+ints+ivecs+uints+uvecs], template = '(+ {0})')
f('op-neg', 1, '1.10', lambda x: -x, None, [floats+vecs+mats+ints+ivecs+uints+uvecs], template = '(- {0})')
f('op-gt', 2, '1.10', lambda x, y: x > y, match_args(0, 1), [ints+uints+floats, ints+uints+floats], template = '({0} > {1})')
@@ -1006,6 +1114,12 @@ def _make_vector_or_matrix_test_vectors(test_suite_dict):
f('op-xor', 2, '1.10', lambda x, y: x != y, None, [bools, bools], template = '({0} ^^ {1})')
f('op-not', 1, '1.10', lambda x: not x, None, [bools], template = '(! {0})')
f('op-selection', 3, '1.10', lambda x, y, z: y if x else z, match_args(1, 2), [bools, floats+vecs+mats+ints+ivecs+uints+uvecs+bools+bvecs, floats+vecs+mats+ints+ivecs+uints+uvecs+bools+bvecs], template = '({0} ? {1} : {2})')
+ f('op-complement', 1, '1.30', lambda x: ~x, None, [ints+ivecs+uints+uvecs], template = '(~ {0})')
+ f('op-lshift', 2, '1.30', _lshift, match_shift, [small_ints+small_ivecs+small_uints+small_uvecs, small_ints+small_ivecs+small_uints+small_uvecs], template = '({0} << {1})')
+ f('op-rshift', 2, '1.30', _rshift, match_shift, [small_ints+small_ivecs+small_uints+small_uvecs, small_ints+small_ivecs+small_uints+small_uvecs], template = '({0} >> {1})')
+ f('op-bitand', 2, '1.30', lambda x, y: x & y, match_simple_binop, [ints+ivecs+uints+uvecs, ints+ivecs+uints+uvecs], template = '({0} & {1})')
+ f('op-bitor', 2, '1.30', lambda x, y: x | y, match_simple_binop, [ints+ivecs+uints+uvecs, ints+ivecs+uints+uvecs], template = '({0} | {1})')
+ f('op-bitxor', 2, '1.30', lambda x, y: x ^ y, match_simple_binop, [ints+ivecs+uints+uvecs, ints+ivecs+uints+uvecs], template = '({0} ^ {1})')
f('length', 1, '1.10', np.linalg.norm, None, [floats+vecs])
f('distance', 2, '1.10', lambda x, y: np.linalg.norm(x-y), match_args(0, 1), [floats+vecs, floats+vecs])
f('dot', 2, '1.10', np.dot, match_args(0, 1), [floats+vecs, floats+vecs])