summaryrefslogtreecommitdiff
path: root/generated_tests/gen_inout_64bit_tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'generated_tests/gen_inout_64bit_tests.py')
-rw-r--r--generated_tests/gen_inout_64bit_tests.py536
1 files changed, 536 insertions, 0 deletions
diff --git a/generated_tests/gen_inout_64bit_tests.py b/generated_tests/gen_inout_64bit_tests.py
new file mode 100644
index 000000000..5677eb27e
--- /dev/null
+++ b/generated_tests/gen_inout_64bit_tests.py
@@ -0,0 +1,536 @@
+#!/usr/bin/env python3
+# coding=utf-8
+
+# Copyright (c) 2019 Intel Corporation
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+""" Generate in/out tests for 64 bit types. """
+
+import os
+import errno
+import collections
+import copy
+import random_ubo
+
+from textwrap import dedent
+from mako.template import Template
+
+
+class VaryingType(object):
+ __slots__ = ['type', 'members', 'name']
+
+ def __init__(self, type, members=None):
+ self.type = type
+ self.members = members
+ self.name = None
+
+
+VaryingInstance = collections.namedtuple(
+ 'VaryingInstance', ['varying_type', 'setters', 'checkers', 'full_name'])
+
+
+def scalar_assignment(type, name, data):
+ """Return a GLSL code string to assign a scalar to its expected value."""
+ if type == "bool":
+ if int(data) == 0:
+ return "{} = {};".format(name,
+ 'false' if int(data) == 0 else 'true')
+ elif type == "uint":
+ return "{} = {}u;".format(name, data)
+ elif type == "int":
+ return "{} = {};".format(name, data)
+ elif type == "uint64_t":
+ return "{} = {}ul;".format(name, data)
+ elif type == "int64_t":
+ return "{} = {}l;".format(name, data)
+ elif type == "float":
+ # Not all implementations support the bit-cast operators that are used
+ # to do bit-exact comparisons. For this reason float_match needs the
+ # float data and the bit-exact data.
+
+ bits = random_ubo.bit_exact_data(data, "float")
+ return "{} = float_get({}, {}u);".format(name, data, bits)
+ elif type == "double":
+ bits = random_ubo.bit_exact_data(data, "double")
+
+ # 0xHHHHHHHHLLLLLLLL
+ # 012345678901234567
+
+ hi = "0x" + bits[2:10]
+ lo = "0x" + bits[10:18]
+
+ return "{} = double_get(uvec2({}, {}));".format(name, lo, hi)
+ else:
+ raise Exception("Unknown scalar type {}".format(type))
+
+
+def vector_assignment(type, name, data):
+ """Return a list of GLSL code strings that assign each field of a vector
+ to its expected value.
+ """
+ scalar = random_ubo.vector_base_type(type)
+ components = ["x", "y", "z", "w"]
+
+ return [scalar_assignment(scalar,
+ "{}.{}".format(name, "xyzw"[i]),
+ data[i])
+ for i in range(random_ubo.vector_size(type))]
+
+
+def matrix_assignment(type, name, data):
+ """Return a list of GLSL code strings that assign each field of a matrix
+ its expected value.
+ """
+ c, r = random_ubo.matrix_dimensions(type)
+
+ if type[0] == 'd':
+ column_type = "dvec{}".format(r)
+ else:
+ column_type = "vec{}".format(r)
+
+ data_pairs = []
+
+ for i in range(c):
+ data_pairs.extend(vector_assignment(
+ column_type,
+ "{}[{}]".format(name, i),
+ data[(i * r):(i * r) + r]))
+
+ return data_pairs
+
+
+def create_array(base_type, size):
+ return "{}[{}]".format(base_type, size)
+
+
+def array_base_type(varying_type):
+ t = copy.copy(varying_type)
+ t.type = random_ubo.array_base_type(t.type)
+ t.name = None
+ return t
+
+
+def create_getters_and_setters(varying_type, full_name, instances):
+ if not full_name:
+ full_name = varying_type.name
+ elif varying_type.name is not None:
+ full_name += '.' + varying_type.name
+
+ if random_ubo.isarray(varying_type.type):
+ base_type = array_base_type(varying_type)
+ for i in range(random_ubo.array_elements(varying_type.type)):
+ indexed_name = full_name + '[' + str(i) + ']'
+ create_getters_and_setters(base_type, indexed_name, instances)
+
+ elif random_ubo.isstructure(varying_type.type):
+ for m in varying_type.members:
+ create_getters_and_setters(m, full_name, instances)
+
+ else:
+ v = VaryingInstance(varying_type, [], [], full_name)
+
+ raw_data = random_ubo.random_data(varying_type.type, full_name, 0)
+ data = raw_data.split(" ")
+
+ if random_ubo.isscalar(varying_type.type):
+ v.checkers.append(random_ubo.scalar_derp(varying_type.type,
+ full_name,
+ data[0]))
+ v.setters.append(
+ scalar_assignment(varying_type.type, full_name, data[0]))
+ elif random_ubo.isvector(varying_type.type):
+ v.checkers.extend(random_ubo.vector_derp(varying_type.type,
+ full_name,
+ data))
+ v.setters.extend(
+ vector_assignment(varying_type.type, full_name, data))
+ elif random_ubo.ismatrix(varying_type.type):
+ v.checkers.extend(random_ubo.matrix_derp(varying_type.type,
+ full_name,
+ data))
+ v.setters.extend(
+ matrix_assignment(varying_type.type, full_name, data))
+
+ instances.append(v)
+
+
+def assign_names(varying_type, names):
+ if random_ubo.isarray(varying_type.type):
+ varying_type.name = names.get_name(
+ random_ubo.without_array(varying_type.type))
+ else:
+ varying_type.name = names.get_name(varying_type.type)
+
+ if varying_type.members:
+ for m in varying_type.members:
+ assign_names(m, names)
+
+
+def gather_structs(varying_type, structs):
+ if random_ubo.isarray(varying_type.type):
+ base_type = array_base_type(varying_type)
+ gather_structs(base_type, structs)
+ elif random_ubo.isstructure(varying_type.type):
+ for m in varying_type.members:
+ gather_structs(m, structs)
+
+ structs.append(varying_type)
+
+
+def stringify_array_dimensions(type):
+ s = ""
+ base_type = type
+ while random_ubo.isarray(base_type):
+ s += "@{}".format(random_ubo.array_elements(base_type))
+ base_type = random_ubo.array_base_type(base_type)
+ return s
+
+
+def stringify_varying_type(varying_type):
+ if random_ubo.isarray(varying_type.type):
+ name = "{}{}".format(random_ubo.without_array(varying_type.type),
+ stringify_array_dimensions(varying_type.type))
+ else:
+ name = varying_type.type
+
+ if varying_type.members:
+ for m in varying_type.members:
+ name += "-" + stringify_varying_type(m)
+
+ return name
+
+
+def generate_file_name(root_types, explicit_locations):
+ name = "vs-out-fs-in-"
+ name += "-and-".join(
+ [stringify_varying_type(t) for t in root_types])
+ if explicit_locations:
+ name += "-location-0"
+ return name + ".shader_test"
+
+
+def do_test(root_types, explicit_locations, glsl_version, extensions,
+ tests_path):
+ if explicit_locations and len(root_types) > 1:
+ return
+
+ basename = generate_file_name(root_types, explicit_locations)
+ fullname = os.path.join(tests_path, basename)
+
+ print(fullname)
+
+ shader_file = open(fullname, "w", buffering=1)
+
+ names = random_ubo.unique_name_dict()
+
+ instances = []
+ structs = []
+
+ for type in root_types:
+ assign_names(type, names)
+ create_getters_and_setters(type, None, instances)
+ gather_structs(type, structs)
+
+ t = Template(dedent("""\
+ [require]
+ GLSL >= ${glsl_version // 100}.${glsl_version % 100}
+ % for ext in extensions:
+ ${ext}
+ % endfor
+
+ % if explicit_locations:
+ GL_ARB_explicit_attrib_location
+ % endif
+
+ [vertex shader]
+ % for ext in extensions:
+ #extension ${ext}: require
+ % endfor
+ #extension GL_ARB_shader_bit_encoding: enable
+ #extension GL_ARB_gpu_shader5: enable
+
+ % if explicit_locations:
+ #extension GL_ARB_explicit_attrib_location : require
+ % endif
+
+ precision highp float;
+ % for s in structures:
+
+ struct ${s.type} {
+ % for m in s.members:
+ ${"{:<15}".format(m.type)} ${m.name};
+ % endfor
+ };
+ % endfor
+
+ % for r in root_types:
+ % if explicit_locations:
+ layout(location = 0)
+ % endif
+ flat out ${"{:<10}".format(r.type)} ${r.name};
+ % endfor
+
+ in vec4 piglit_vertex;
+
+ #if defined(GL_ARB_shader_bit_encoding) || defined(GL_ARB_gpu_shader5) || __VERSION__ >= 430
+ float float_get(float f, uint bits) { return uintBitsToFloat(bits); }
+ #else
+ float float_get(float f, uint bits) { return f; }
+ #endif
+ % if glsl_version >= 400 or "GL_ARB_gpu_shader_fp64" in extensions:
+ double double_get(uvec2 bits) { return packDouble2x32(bits); }
+ %endif
+
+ void main()
+ {
+ % for inst in instances:
+ % for s in inst.setters:
+ ${s}
+ % endfor
+ % endfor
+
+ gl_Position = piglit_vertex;
+ }
+
+ [fragment shader]
+ % for ext in extensions:
+ #extension ${ext}: require
+ % endfor
+ #extension GL_ARB_shader_bit_encoding: enable
+ #extension GL_ARB_gpu_shader5: enable
+
+ % if explicit_locations:
+ #extension GL_ARB_explicit_attrib_location : require
+ % endif
+
+ precision highp float;
+
+ % for s in structures:
+ struct ${s.type} {
+ % for m in s.members:
+ ${"{:<15}".format(m.type)} ${m.name};
+ % endfor
+ };
+ % endfor
+
+ % for r in root_types:
+ % if explicit_locations:
+ layout(location = 0)
+ % endif
+ flat in ${"{:<11}".format(r.type)} ${r.name};
+ % endfor
+
+ out vec4 piglit_fragcolor;
+
+ #if defined(GL_ARB_shader_bit_encoding) || defined(GL_ARB_gpu_shader5) || __VERSION__ >= 430
+ bool float_match(float u, float f, uint bits) { return floatBitsToUint(u) == bits; }
+ #else
+ bool float_match(float u, float f, uint bits) { return u == f; }
+ #endif
+ % if glsl_version >= 400 or "GL_ARB_gpu_shader_fp64" in extensions:
+ bool double_match(double u, uvec2 bits) { return unpackDouble2x32(u) == bits; }
+ %endif
+
+ void main()
+ {
+ bool pass = true;
+
+ % for inst in instances:
+ % for s in inst.checkers:
+ if (${s})
+ pass = false;
+ % endfor
+ % endfor
+
+ piglit_fragcolor = pass ? vec4(0, 1, 0, 1) : vec4(1, 0, 0, 1);
+ }
+
+ [test]
+ link success
+
+ draw rect -1 -1 2 2
+ probe all rgba 0.0 1.0 0.0 1.0"""))
+
+ shader = t.render(glsl_version=glsl_version,
+ root_types=root_types,
+ explicit_locations=explicit_locations,
+ structures=structs,
+ extensions=extensions,
+ instances=instances)
+
+ shader_file.write(shader)
+ shader_file.close()
+
+
+def do_test_permutations(root_types, glsl_version, extensions, tests_path):
+ without_outer_struct = []
+ for type in root_types:
+ if random_ubo.isstructure(type.type):
+ without_outer_struct.extend(m for m in type.members)
+ else:
+ without_outer_struct.append(type)
+
+ do_test(root_types, False, glsl_version, extensions, tests_path)
+ do_test(root_types, True, glsl_version,
+ extensions + ["GL_ARB_separate_shader_objects"], tests_path)
+ do_test(without_outer_struct, False, glsl_version, extensions, tests_path)
+
+
+fp64_ext_path = os.path.join("spec", "arb_gpu_shader_fp64", "execution",
+ "inout")
+fp64_core_path = os.path.join("spec", "glsl-4.00", "execution",
+ "inout")
+int64_path = os.path.join("spec", "arb_gpu_shader_int64", "execution",
+ "inout")
+
+for path in [fp64_ext_path, fp64_core_path, int64_path]:
+ try:
+ os.makedirs(path)
+ except OSError as exc:
+ if exc.errno != errno.EEXIST or not os.path.isdir(path):
+ raise
+
+INT64_VEC_TYPES = [None, "int64_t", "i64vec2", "i64vec3", "i64vec4"]
+UINT64_VEC_TYPES = [None, "uint64_t", "u64vec2", "u64vec3", "u64vec4"]
+FLOAT_VEC_TYPES = [None, "float", "vec2", "vec3", "vec4"]
+DOUBLE_VEC_TYPES = [None, "double", "dvec2", "dvec3", "dvec4"]
+
+DOUBLE_MAT_TYPES = ["dmat2x2", "dmat2x3", "dmat2x4", "dmat3x2", "dmat3x3",
+ "dmat3x4", "dmat4x2", "dmat4x3", "dmat4x4"]
+
+VT = VaryingType
+
+
+def do_common_64bit_tests(glsl_version, extensions, name_arr, tests_path):
+ tests = []
+ for i in range(1, 4):
+ tests.append([VT("S1", [VT(name_arr[i])])])
+
+ tests.append([VT("S1", [VT(name_arr[i] + "[4]")])])
+
+ for j in range(1, 4):
+ tests.append([VT("S1", [VT(FLOAT_VEC_TYPES[j]), VT(name_arr[i])])])
+
+ tests.append([VaryingType("S1",
+ [VT("float"), VT("float"), VT("float"),
+ VT(name_arr[i])])])
+
+ for j in range(2, 5):
+ tests.append([VT("S1",
+ [VT("float[{}]".format(j)),
+ VT(name_arr[i])])])
+
+ tests.append([VT("S1", [VT(name_arr[i] + "[3]")])])
+
+ tests.append([VT("S1",
+ [VT("S2[3]", [VT(name_arr[i]), VT("float")])])])
+
+ tests.append([VT("S1",
+ [VT("S2", [VT(name_arr[i])])])])
+
+ for i in range(1, 2):
+ tests.append([VT("S1",
+ [VT("S2[2]",
+ [VT("S3[2]", [
+ VT("float"),
+ VT(name_arr[i])])])])])
+
+ tests.append([VT("S1",
+ [VT("S2[2]",
+ [VT("S3[2]", [
+ VT("vec3"),
+ VT(name_arr[i])])])])])
+
+ tests.append([VT("S1[2]",
+ [VT("S2[2]",
+ [VT("S3[2]", [
+ VT(name_arr[i])])])])])
+
+ for t in tests:
+ do_test_permutations(t, glsl_version, extensions, tests_path)
+
+ tests = []
+
+ for i in range(1, 2):
+ tests.append([VT("S1",
+ [VT(name_arr[i] + "[3][2]")])])
+ for i in range(1, 2):
+ for j in range(1, 4):
+ tests.append([VT("S1",
+ [VT(FLOAT_VEC_TYPES[j]),
+ VT(name_arr[i] + "[3][2]")])])
+
+ for i in range(1, 2):
+ for j in range(1, 4):
+ tests.append([VT("S1", [VT("S2[2][2]",
+ [VT(FLOAT_VEC_TYPES[j]),
+ VT(name_arr[i])])])])
+
+ for i in range(3, 4):
+ tests.append([VT("S1", [VT(name_arr[i] + "[2][2]")])])
+
+ for t in tests:
+ do_test_permutations(t, glsl_version,
+ extensions + ["GL_ARB_arrays_of_arrays"],
+ tests_path)
+
+
+def do_fp64_specific_tests():
+ tests = []
+
+ for t in DOUBLE_MAT_TYPES:
+ tests.append([VT("S1", [VT(t)])])
+
+ for t in ["dmat2x2", "dmat2x3", "dmat2x4", "dmat3x2", "dmat3x3"]:
+ for j in range(1, 4):
+ tests.append([VT("S1", [VT(FLOAT_VEC_TYPES[j]), VT(t)])])
+
+ for j in range(1, 7):
+ tests.append([VT("S1",
+ [VT("float[{}]".format(j)), VT(t)])])
+
+ for j in range(1, 4):
+ tests.append([VT("S1", [VT("S2[2]",
+ [VT(FLOAT_VEC_TYPES[j]),
+ VT("dmat2x2")])])])
+
+ tests.append([VT("S1",
+ [VT("double"), VT("float"), VT("double[2]"),
+ VT("float[3]"), VT("dmat2x2")])])
+
+ tests.append([VT("S1",
+ [VT("S2", [VT("double")]),
+ VT("S3", [VT("float")]),
+ VT("S4", [VT("dmat3x3")])])])
+
+ for t in tests:
+ do_test_permutations(t, 150, ["GL_ARB_gpu_shader_fp64"], fp64_ext_path)
+ do_test_permutations(t, 400, [], fp64_core_path)
+
+
+do_common_64bit_tests(400, [], DOUBLE_VEC_TYPES, fp64_core_path)
+do_common_64bit_tests(150, ["GL_ARB_gpu_shader_fp64"], DOUBLE_VEC_TYPES,
+ fp64_ext_path)
+do_common_64bit_tests(150, ["GL_ARB_gpu_shader_int64"], INT64_VEC_TYPES,
+ int64_path)
+do_common_64bit_tests(150, ["GL_ARB_gpu_shader_int64"], UINT64_VEC_TYPES,
+ int64_path)
+
+do_fp64_specific_tests()