diff options
author | Andres Gomez <agomez@igalia.com> | 2016-04-04 19:19:32 +0300 |
---|---|---|
committer | Antia Puentes <apuentes@igalia.com> | 2016-05-11 10:41:12 +0200 |
commit | 28457fcbeec33e62e9e8356811d92141abff1629 (patch) | |
tree | 9322abf09ff3f087ac1edc8dcfe8ab8ef6af1f4b | |
parent | 7c1ebda85b8f50b7d967038c8b81c189e4389d47 (diff) |
arb_gpu_shader_fp64: Adds conversion tests generator
Also, removed 5 redundant tests replaced by
the generator.
Reviewed-by: Antia Puentes <apuentes@igalia.com>
Acked-by: Dylan Baker <baker.dylan.c@gmail.com>
Signed-off-by: Andres Gomez <agomez@igalia.com>
26 files changed, 942 insertions, 195 deletions
diff --git a/generated_tests/CMakeLists.txt b/generated_tests/CMakeLists.txt index fbd835ea5..1e69486f0 100644 --- a/generated_tests/CMakeLists.txt +++ b/generated_tests/CMakeLists.txt @@ -130,6 +130,29 @@ piglit_make_generated_tests( templates/gen_flat_interpolation_qualifier/template.frag.mako ) piglit_make_generated_tests( + conversion_fp64.list + gen_conversion_fp64.py + templates/gen_conversion_fp64/base.mako + templates/gen_conversion_fp64/compiler.frag.mako + templates/gen_conversion_fp64/compiler.geom.mako + templates/gen_conversion_fp64/compiler.vert.mako + templates/gen_conversion_fp64/compiler_base.mako + templates/gen_conversion_fp64/execution-zero-sign.frag.shader_test.mako + templates/gen_conversion_fp64/execution-zero-sign.geom.shader_test.mako + templates/gen_conversion_fp64/execution-zero-sign.vert.shader_test.mako + templates/gen_conversion_fp64/execution.frag.shader_test.mako + templates/gen_conversion_fp64/execution.geom.shader_test.mako + templates/gen_conversion_fp64/execution.vert.shader_test.mako + templates/gen_conversion_fp64/execution_base.mako + templates/gen_conversion_fp64/shader-zero-sign.frag.mako + templates/gen_conversion_fp64/shader-zero-sign.geom.mako + templates/gen_conversion_fp64/shader-zero-sign.vert.mako + templates/gen_conversion_fp64/shader.frag.mako + templates/gen_conversion_fp64/shader.geom.mako + templates/gen_conversion_fp64/shader.vert.mako + templates/gen_conversion_fp64/shader_base.mako + ) +piglit_make_generated_tests( shader_precision_tests.list gen_shader_precision_tests.py builtin_function.py @@ -208,6 +231,7 @@ add_custom_target(gen-gl-tests constant_array_size_tests_fp64.list inout_fp64.list flat_interpolation_qualifier.list + conversion_fp64.list shader_precision_tests.list shader_image_load_store_tests.list variable_index_read_tests.list diff --git a/generated_tests/gen_conversion_fp64.py b/generated_tests/gen_conversion_fp64.py new file mode 100644 index 000000000..fca3b178e --- /dev/null +++ b/generated_tests/gen_conversion_fp64.py @@ -0,0 +1,605 @@ +# coding=utf-8 +# +# Copyright © 2016 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 (including the next +# paragraph) 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 fp64 types conversion tests.""" + +from __future__ import print_function, division, absolute_import +import abc +import argparse +import itertools +import os +import struct + +import numpy as np + +from templates import template_dir +from modules import utils + +TEMPLATES = template_dir(os.path.basename(os.path.splitext(__file__)[0])) + +# pylint: disable=bad-whitespace,line-too-long,bad-continuation +DOUBLE_INFS = ['0xfff0000000000000', # -inf + '0x7ff0000000000000'] # +inf + +DOUBLE_NEG_ZERO = ['0x8000000000000000'] # Negative underflow (-0.0) + +DOUBLE_POS_ZERO = ['0x0000000000000000'] # Positive underflow (+0.0) + +# Double values causing an underflow to zero in any other type +DOUBLE_DENORMAL_VALUES = ['0x800fffffffffffff', # Negative maximum denormalized -- Denormalized may be flushed to 0 + '0x8000000000000001', # Negative minimum denormalized -- Denormalized may be flushed to 0 + '0x0000000000000001', # Positive minimum denormalized -- Denormalized may be flushed to 0 + '0x000fffffffffffff'] # Positive maximum denormalized -- Denormalized may be flushed to 0 + +DOUBLE_NORMAL_VALUES = ['0x8010000000000000', # Negative minimum normalized + '0x0010000000000000'] # Positive minimum normalized + +# Double +/-inf +DOUBLE_FLOAT_INFS = ['0xc7effffff0000000', # Negative overflow (-inf) + '0x47effffff0000000'] # Positive overflow (+inf) + +DOUBLE_FLOAT_VALUES = ['0xc7efffffefffffff', # Negative maximum normalized + '0xc170000000000000', # -16777216.0 + '0xc014000000000000', # -5.0 + '0xbfff25ce60000000', # -1.9467300176620483 + '0xb80fffffe0000000', # Negative minimum normalized + '0xb69fffffffffffff', # Negative underflow + '0x369fffffffffffff', # Positive underflow + '0x380fffffe0000000', # Positive minimum normalized + '0x3fff25ce60000000', # +1.9467300176620483 + '0x4014000000000000', # +5.0 + '0x4170000000000000', # +16777216.0 + '0x47efffffefffffff'] # Positive maximum normalized + +DOUBLE_UINT_VALUES = ['0xbfeccccccccccccd', # -0.9 + #'0x8010000000000000', # Negative minimum normalized -- Already checked + #'0x800fffffffffffff', # Negative maximum denormalized -- Already checked + #'0x8000000000000001', # Negative minimum denormalized -- Already checked + #'0x8000000000000000', # Negative minimum (-0) -- Already checked + #'0x0000000000000000', # Positive minimum (+0) -- Already checked + '0x3fff25ce60000000', # +1.9467300176620483 + '0x4014000000000000', # +5.0 + '0x4170000000000000', # +16777216.0 + '0x41dfffffffc00000', # Signed int low frontier (+2147483647) + '0x41e0000000000000', # Signed int up frontier (+2147483648) + '0x41efffffffe00000'] # Maximum (+4294967295) + +DOUBLE_INT_VALUES = ['0xc1e0000000000000', # Minimum (-2147483648) + '0xc170000000000000', # -16777216.0 + '0xc014000000000000', # -5.0 + '0xbfff25ce60000000', # -1.9467300176620483 + #'0x8000000000000000', # Negative minimum (-0) -- Already checked + #'0x0000000000000000', # Minimum (+0) -- Already checked + '0x3fff25ce60000000', # +1.9467300176620483 + '0x4014000000000000', # +5.0 + '0x4170000000000000', # +16777216.0 + '0x41dfffffffc00000'] # Maximum (+2147483647) + +DOUBLE_BOOL_VALUES = [#'0x8010000000000000', # Minimum negative True value -- Already checked + #'0x0000000000000000', # False -- Already checked + #'0x0010000000000000', # Minimum positive True value -- Already checked + ] + +FLOAT_INFS = ['0xff800000', # -inf + '0x7f800000'] # +inf + +FLOAT_NEG_ZERO = ['0x80000000'] # Negative underflow (-0.0) + +FLOAT_POS_ZERO = ['0x00000000'] # Positive underflow (+0.0) + +FLOAT_VALUES = ['0xff7fffff', # Negative maximum normalized + '0xcb800000', # -16777216.0 + '0xc0a00000', # -5.0 + '0xbff92e73', # -1.9467300176620483 + '0x80800000', # Negative minimum normalized + #'0x807fffff', # Negative maximum denormalized -- Denormalized may be flushed to 0 + #'0x80000001', # Negative minimum denormalized -- Denormalized may be flushed to 0 + #'0x00000001', # Positive minimum denormalized -- Denormalized may be flushed to 0 + #'0x007fffff', # Positive maximum denormalized -- Denormalized may be flushed to 0 + '0x00800000', # Positive minimum normalized + '0x3ff92e73', # +1.9467300176620483 + '0x40a00000', # +5.0 + '0x4b800000', # +16777216.0 + '0x7f7fffff'] # Positive maximum normalized + +UINT_VALUES = ['0', # Minimum + '5', + '2147483647', # Signed int low frontier + '2147483648', # Signed int up frontier + '4294967295'] # Maximum + +INT_VALUES = ['-2147483648', # Minimum + '-5', + '-1', + '0', + '1', + '5', + '2147483647'] # Maximum + +BOOL_VALUES = ['0', # False + '1'] # True +# pylint: enable=bad-whitespace,line-too-long,bad-continuation + +def get_dir_name(ver, test_type): + """Returns the directory name to save tests given a GLSL version and a + test type. + """ + + assert isinstance(ver, str) + assert isinstance(test_type, str) + if ver.startswith('GL_'): + feature_dir = ver[3:].lower() + else: + feature_dir = 'glsl-{}.{}'.format(ver[0], ver[1:]) + + return os.path.join('spec', feature_dir, test_type, + 'conversion') + + +class TestTuple(object): + """A float64 derived and other type derived tuple to generate the + needed conversion tests. + """ + + @staticmethod + def float_to_hex(fvalue): + """Returns the hexadecimal representation from a float32 value.""" + assert isinstance(fvalue, np.float32) + return hex(struct.unpack('<I', struct.pack('<f', fvalue))[0]) + + @staticmethod + def double_to_hex(fvalue): + """Returns the hexadecimal representation from a float64 value.""" + assert isinstance(fvalue, float) + return hex(struct.unpack('<Q', struct.pack('<d', fvalue))[0]).rstrip("L") + + @staticmethod + def hex_to_float(hstr): + """Returns a float32 value from its hexadecimal representation.""" + assert isinstance(hstr, str) + return struct.unpack('<f', struct.pack('<I', int(hstr, 16)))[0] + + @staticmethod + def hex_to_double(hstr): + """Returns a float64 value from its hexadecimal representation.""" + + assert isinstance(hstr, str) + return struct.unpack('<d', struct.pack('<Q', int(hstr, 16)))[0] + + @staticmethod + def float_hex_to_double_hex(hstr): + """Returns the float64 hexadecimal representation from a float32 + hexadecimal representation. + """ + assert isinstance(hstr, str) + double_value = TestTuple.hex_to_float(hstr) + return TestTuple.double_to_hex(double_value) + + @staticmethod + def float_hex_to_inv_double_hex(hstr): + """Returns the inverted float64 hexadecimal representation from a + float32 hexadecimal representation. + """ + assert isinstance(hstr, str) + temp = TestTuple.hex_to_float(hstr) + double_value = np.divide(1.0, temp) + return TestTuple.double_to_hex(double_value) + + @staticmethod + def int_str_to_double_str(istr): + """Returns a float64 string from an int32 string.""" + assert isinstance(istr, str) + return str(float(istr)) + + @staticmethod + def double_hex_to_bool_str(hstr): + """Returns a bool string from a float64 hexadecimal representation.""" + assert isinstance(hstr, str) + bool_double = TestTuple.hex_to_double(hstr) + return '1' if bool_double != 0.0 else '0' + + @staticmethod + def double_hex_to_int_str(hstr): + """Returns an int32 string from a float64 hexadecimal + representation. + """ + assert isinstance(hstr, str) + int_double = TestTuple.hex_to_double(hstr) + if int_double > np.iinfo(np.dtype('int32')).max: + return str(np.iinfo(np.dtype('int32')).max) + if int_double < np.iinfo(np.dtype('int32')).min: + return str(np.iinfo(np.dtype('int32')).min) + return str(int(int_double)) + + @staticmethod + def double_hex_to_uint_str(hstr): + """Returns an uint32 string from a float64 hexadecimal + representation. + """ + assert isinstance(hstr, str) + uint_double = TestTuple.hex_to_double(hstr) + if uint_double > np.iinfo(np.dtype('uint32')).max: + return str(np.iinfo(np.dtype('uint32')).max) + if uint_double < np.iinfo(np.dtype('uint32')).min: + return str(np.iinfo(np.dtype('uint32')).min) + return str(int(uint_double)) + + @staticmethod + def double_hex_to_float_hex(hstr): + """Returns the float32 hexadecimal representation from a float64 + hexadecimal representation. + """ + assert isinstance(hstr, str) + float_double = np.float32(TestTuple.hex_to_double(hstr)) + return TestTuple.float_to_hex(float_double) + + @staticmethod + def double_hex_to_inv_float_hex(hstr): + """Returns the inverted float32 hexadecimal representation from a + float64 hexadecimal representation. + """ + assert isinstance(hstr, str) + temp = np.divide(1.0, TestTuple.hex_to_double(hstr)) + float_double = np.float32(temp) + return TestTuple.float_to_hex(float_double) + + def __init__(self, ver, stage, + first_dimension, second_dimension, + basic_type, names_only): + assert stage in ('vert', 'geom', 'frag') + assert first_dimension in ('1', '2', '3', '4') + assert second_dimension in ('1', '2', '3', '4') + assert isinstance(names_only, bool) + + self._ver = ver + self._stage = stage + self._basic_type = basic_type + self._names_only = names_only + self._double_type = '' + self._conversion_type = '' + self._uniform_type = '' + self._amount = int(first_dimension) * int(second_dimension) + self._filenames = [] + + if first_dimension != '1': + dimensional_type = 'mat' + first_dimension + if first_dimension != second_dimension: + dimensional_type += 'x' + second_dimension + elif second_dimension != '1': + dimensional_type = 'vec' + second_dimension + else: + dimensional_type = '' + + if dimensional_type == '': + if basic_type == 'b': + self._conversion_type = 'bool' + self._uniform_type = 'int' + elif basic_type == 'i': + self._conversion_type = 'int' + elif basic_type == 'u': + self._conversion_type = 'uint' + elif basic_type == 'f': + self._conversion_type = 'float' + self._double_type = 'double' + if self._uniform_type == '': + self._uniform_type = self._conversion_type + else: + self._conversion_type = (basic_type if basic_type != 'f' else '') + dimensional_type + if basic_type == 'b': + self._uniform_type = 'i' + dimensional_type + else: + self._uniform_type = self._conversion_type + self._double_type = 'd' + dimensional_type + + @abc.abstractmethod + def _gen_to_double(self): + """Generates the test files for conversions to float64.""" + + @abc.abstractmethod + def _gen_from_double(self): + """Generates the test files for conversions from float64.""" + + @property + def filenames(self): + """Returns the test file names this tuple will generate.""" + if self._filenames == []: + tmp = self._names_only + self._names_only = True + self.generate_test_files() + self._names_only = tmp + return self._filenames + + def generate_test_files(self): + """Generate the GLSL parser tests.""" + self._filenames = [] + + self._gen_to_double() + self._gen_from_double() + + +class RegularTestTuple(TestTuple): + """Derived class for conversion tests using regular values within the + edges of the used types. + """ + + @staticmethod + def all_tests(names_only): + """Returns all the possible contained conversion test instances.""" + + assert isinstance(names_only, bool) + stages = ['vert', 'geom', 'frag'] + dimensions = ['1', '2', '3', '4'] + basic_types = ['b', 'u', 'i', 'f'] + glsl_ver = ['GL_ARB_gpu_shader_fp64', '400'] + + if not names_only: + test_types = ['compiler', 'execution'] + for ver, test_type in itertools.product(glsl_ver, test_types): + utils.safe_makedirs(get_dir_name(ver, test_type)) + + for ver, stage, first_dimension, second_dimension, basic_type in itertools.product( + glsl_ver, + stages, + dimensions, + dimensions, + basic_types): + if not (first_dimension != '1' and (second_dimension == '1' or basic_type != 'f')): + yield RegularTestTuple(ver, stage, + first_dimension, second_dimension, + basic_type, names_only) + + def __init__(self, ver, stage, + first_dimension, second_dimension, + basic_type, names_only): + assert ver in ('GL_ARB_gpu_shader_fp64', '400') + assert basic_type in ('b', 'u', 'i', 'f') + assert not (first_dimension != '1' and (second_dimension == '1' or basic_type != 'f')) + super(RegularTestTuple, self).__init__(ver, stage, + first_dimension, second_dimension, + basic_type, names_only) + + def _gen_comp_test(self, from_type, to_type, converted_from): + filename = os.path.join( + get_dir_name(self._ver, 'compiler'), + '{}-conversion-implicit-{}-{}-bad.{}'.format(self._stage, from_type, to_type, + self._stage)) + + self._filenames.append(filename) + + if not self._names_only: + with open(filename, 'w') as test_file: + test_file.write(TEMPLATES.get_template( + 'compiler.{}.mako'.format(self._stage)).render_unicode( + ver=self._ver, + from_type=from_type, + to_type=to_type, + converted_from=converted_from)) + + def _gen_exec_test(self, from_type, to_type, + uniform_from_type, uniform_to_type, + explicit, converted_from, conversions): + filename = os.path.join( + get_dir_name(self._ver, 'execution'), + '{}-conversion-{}-{}-{}.shader_test'.format(self._stage, explicit, + from_type, to_type)) + + self._filenames.append(filename) + + if not self._names_only: + with open(filename, 'w') as test_file: + test_file.write(TEMPLATES.get_template( + 'execution.{}.shader_test.mako'.format(self._stage)).render_unicode( + ver=self._ver, + amount=self._amount, + from_type=from_type, + to_type=to_type, + converted_from=converted_from, + uniform_from_type=uniform_from_type, + uniform_to_type=uniform_to_type, + conversions=conversions)) + + def _gen_to_double(self): + converted_from = 'from' + explicit = 'implicit' + + if self._basic_type == 'b': + explicit = 'explicit' + self._gen_comp_test(self._conversion_type, self._double_type, + converted_from) + converted_from = self._double_type + '(from)' + conversion_values = BOOL_VALUES + conversion_function = TestTuple.int_str_to_double_str + elif self._basic_type == 'i': + conversion_values = INT_VALUES + conversion_function = TestTuple.int_str_to_double_str + elif self._basic_type == 'u': + conversion_values = UINT_VALUES + conversion_function = TestTuple.int_str_to_double_str + elif self._basic_type == 'f': + conversion_values = FLOAT_INFS + FLOAT_NEG_ZERO + FLOAT_POS_ZERO + FLOAT_VALUES + conversion_function = TestTuple.float_hex_to_double_hex + + conversions = [] + for value in conversion_values: + to_value = conversion_function(value) + item = {'from': value, 'to': to_value} + conversions.append(item) + + self._gen_exec_test(self._conversion_type, self._double_type, + self._uniform_type, self._double_type, + explicit, converted_from, conversions) + + def _gen_from_double(self): + converted_from = 'from' + self._gen_comp_test(self._double_type, self._conversion_type, + converted_from) + + converted_from = self._conversion_type + '(from)' + explicit = 'explicit' + + if self._basic_type == 'b': + conversion_values = DOUBLE_INFS + DOUBLE_NORMAL_VALUES + DOUBLE_BOOL_VALUES + conversion_function = TestTuple.double_hex_to_bool_str + elif self._basic_type == 'i': + conversion_values = DOUBLE_DENORMAL_VALUES + DOUBLE_NORMAL_VALUES + DOUBLE_INT_VALUES + conversion_function = TestTuple.double_hex_to_int_str + elif self._basic_type == 'u': + conversion_values = DOUBLE_DENORMAL_VALUES + DOUBLE_NORMAL_VALUES + DOUBLE_UINT_VALUES + conversion_function = TestTuple.double_hex_to_uint_str + elif self._basic_type == 'f': + conversion_values = DOUBLE_INFS + DOUBLE_FLOAT_INFS + DOUBLE_FLOAT_VALUES + conversion_function = TestTuple.double_hex_to_float_hex + + conversions = [] + for value in DOUBLE_NEG_ZERO + DOUBLE_POS_ZERO + conversion_values: + to_value = conversion_function(value) + item = {'from': value, 'to': to_value} + conversions.append(item) + + self._gen_exec_test(self._double_type, self._conversion_type, + self._double_type, self._uniform_type, + explicit, converted_from, conversions) + + +class ZeroSignTestTuple(TestTuple): + """Derived class for conversion tests using the float32 and float64 + +/-0.0 values. + """ + + @staticmethod + def all_tests(names_only): + """Returns all the possible zero sign conversion test instances.""" + + assert isinstance(names_only, bool) + stages = ['vert', 'geom', 'frag'] + dimensions = ['1', '2', '3', '4'] + basic_types = ['f'] + glsl_ver = ['410', '420'] + + if not names_only: + for ver in glsl_ver: + utils.safe_makedirs(get_dir_name(ver, 'execution')) + + for ver, stage, first_dimension, second_dimension, basic_type in itertools.product( + glsl_ver, + stages, + dimensions, + dimensions, + basic_types): + if not (first_dimension != '1' and second_dimension == '1'): + yield ZeroSignTestTuple(ver, stage, + first_dimension, second_dimension, + basic_type, names_only) + + def __init__(self, ver, stage, + first_dimension, second_dimension, + basic_type, names_only): + assert ver in ('410', '420') + assert basic_type == 'f' + assert not (first_dimension != '1' and second_dimension == '1') + super(ZeroSignTestTuple, self).__init__(ver, stage, + first_dimension, second_dimension, + basic_type, names_only) + + def __gen_zero_sign_exec_test(self, from_type, to_type, + uniform_from_type, uniform_to_type, + explicit, converted_from, conversions): + filename = os.path.join( + get_dir_name(self._ver, 'execution'), + '{}-conversion-{}-{}-{}-zero-sign.shader_test'.format(self._stage, explicit, + from_type, to_type)) + + self._filenames.append(filename) + + if not self._names_only: + with open(filename, 'w') as test_file: + test_file.write(TEMPLATES.get_template( + 'execution-zero-sign.{}.shader_test.mako'.format( + self._stage)).render_unicode( + ver=self._ver, + amount=self._amount, + from_type=from_type, + to_type=to_type, + converted_from=converted_from, + uniform_from_type=uniform_from_type, + uniform_to_type=uniform_to_type, + conversions=conversions)) + + def _gen_to_double(self): + if self._ver == '410': + conversion_values = FLOAT_POS_ZERO + elif self._ver == '420': + conversion_values = FLOAT_NEG_ZERO + + conversions = [] + for value in conversion_values: + to_value = TestTuple.float_hex_to_inv_double_hex(value) + item = {'from': value, 'to': to_value} + conversions.append(item) + + self.__gen_zero_sign_exec_test(self._conversion_type, self._double_type, + self._uniform_type, self._double_type, + 'implicit', 'from', conversions) + + def _gen_from_double(self): + if self._ver == '410': + conversion_values = DOUBLE_POS_ZERO + elif self._ver == '420': + conversion_values = DOUBLE_NEG_ZERO + + conversions = [] + for value in conversion_values: + to_value = TestTuple.double_hex_to_inv_float_hex(value) + item = {'from': value, 'to': to_value} + conversions.append(item) + + self.__gen_zero_sign_exec_test(self._double_type, self._conversion_type, + self._double_type, self._uniform_type, + 'explicit', self._conversion_type + '(from)', conversions) + + +def main(): + """Main function.""" + + parser = argparse.ArgumentParser( + description="Generate shader tests that check the conversions from and " + "to fp64") + parser.add_argument( + '--names-only', + dest='names_only', + action='store_true', + default=False, + help="Don't output files, just generate a list of filenames to stdout") + args = parser.parse_args() + + np.seterr(divide='ignore') + + for test in (list(RegularTestTuple.all_tests(args.names_only)) + + list(ZeroSignTestTuple.all_tests(args.names_only))): + test.generate_test_files() + for filename in test.filenames: + print(filename) + + +if __name__ == '__main__': + main() diff --git a/generated_tests/templates/gen_conversion_fp64/base.mako b/generated_tests/templates/gen_conversion_fp64/base.mako new file mode 100644 index 000000000..bcb479f8f --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/base.mako @@ -0,0 +1,12 @@ +## coding=utf-8 +<%def name="versioning()"><% + if ver == 'GL_ARB_gpu_shader_fp64': + glsl_version_int = '150' + else: + glsl_version_int = ver + + glsl_version = '{}.{}'.format(glsl_version_int[0], glsl_version_int[1:3]) + + return (glsl_version, glsl_version_int) +%></%def>\ +${next.body()}\ diff --git a/generated_tests/templates/gen_conversion_fp64/compiler.frag.mako b/generated_tests/templates/gen_conversion_fp64/compiler.frag.mako new file mode 100644 index 000000000..2ae22df92 --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/compiler.frag.mako @@ -0,0 +1,3 @@ +## coding=utf-8 +<%inherit file="compiler_base.mako"/>\ +<%include file="shader.frag.mako"/>\ diff --git a/generated_tests/templates/gen_conversion_fp64/compiler.geom.mako b/generated_tests/templates/gen_conversion_fp64/compiler.geom.mako new file mode 100644 index 000000000..1e2e340fb --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/compiler.geom.mako @@ -0,0 +1,3 @@ +## coding=utf-8 +<%inherit file="compiler_base.mako"/>\ +<%include file="shader.geom.mako"/>\ diff --git a/generated_tests/templates/gen_conversion_fp64/compiler.vert.mako b/generated_tests/templates/gen_conversion_fp64/compiler.vert.mako new file mode 100644 index 000000000..d9148f14c --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/compiler.vert.mako @@ -0,0 +1,3 @@ +## coding=utf-8 +<%inherit file="compiler_base.mako"/>\ +<%include file="shader.vert.mako"/>\ diff --git a/generated_tests/templates/gen_conversion_fp64/compiler_base.mako b/generated_tests/templates/gen_conversion_fp64/compiler_base.mako new file mode 100644 index 000000000..96ecc3643 --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/compiler_base.mako @@ -0,0 +1,25 @@ +## coding=utf-8 +<%inherit file="base.mako"/>\ +<% + (glsl_version, glsl_version_int) = self.versioning() +%>\ +/* [config] + * expect_result: fail + * glsl_version: ${glsl_version} +% if ver == 'GL_ARB_gpu_shader_fp64': + * require_extensions: ${ver} + * [end config] + * + * ${ver} spec states: + * + * "No implicit conversions are + * provided to convert from unsigned to signed integer types, from + * floating-point to integer types, or from higher-precision to + * lower-precision types. There are no implicit array or structure + * conversions." +% else: + * [end config] +% endif + */ + +${next.body()}\ diff --git a/generated_tests/templates/gen_conversion_fp64/execution-zero-sign.frag.shader_test.mako b/generated_tests/templates/gen_conversion_fp64/execution-zero-sign.frag.shader_test.mako new file mode 100644 index 000000000..2d0123b21 --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/execution-zero-sign.frag.shader_test.mako @@ -0,0 +1,8 @@ +## coding=utf-8 +<%inherit file="execution_base.mako"/>\ + +[vertex shader passthrough] + +[fragment shader] +<%include file="shader-zero-sign.frag.mako"/> + diff --git a/generated_tests/templates/gen_conversion_fp64/execution-zero-sign.geom.shader_test.mako b/generated_tests/templates/gen_conversion_fp64/execution-zero-sign.geom.shader_test.mako new file mode 100644 index 000000000..4ea998088 --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/execution-zero-sign.geom.shader_test.mako @@ -0,0 +1,27 @@ +## coding=utf-8 +<%inherit file="execution_base.mako"/>\ + +[vertex shader] +#version 150 + +in vec4 piglit_vertex; +out vec4 vertex_to_gs; + +void main() +{ + vertex_to_gs = piglit_vertex; +} + +[geometry shader] +<%include file="shader-zero-sign.geom.mako"/> +[fragment shader] +#version 150 + +in vec4 fs_color; +out vec4 color; + +void main() +{ + color = fs_color; +} + diff --git a/generated_tests/templates/gen_conversion_fp64/execution-zero-sign.vert.shader_test.mako b/generated_tests/templates/gen_conversion_fp64/execution-zero-sign.vert.shader_test.mako new file mode 100644 index 000000000..bb0fbffeb --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/execution-zero-sign.vert.shader_test.mako @@ -0,0 +1,16 @@ +## coding=utf-8 +<%inherit file="execution_base.mako"/>\ + +[vertex shader] +<%include file="shader-zero-sign.vert.mako"/> +[fragment shader] +#version 150 + +in vec4 fs_color; +out vec4 color; + +void main() +{ + color = fs_color; +} + diff --git a/generated_tests/templates/gen_conversion_fp64/execution.frag.shader_test.mako b/generated_tests/templates/gen_conversion_fp64/execution.frag.shader_test.mako new file mode 100644 index 000000000..60507eed3 --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/execution.frag.shader_test.mako @@ -0,0 +1,7 @@ +## coding=utf-8 +<%inherit file="execution_base.mako"/>\ + +[vertex shader passthrough] + +[fragment shader] +<%include file="shader.frag.mako"/> diff --git a/generated_tests/templates/gen_conversion_fp64/execution.geom.shader_test.mako b/generated_tests/templates/gen_conversion_fp64/execution.geom.shader_test.mako new file mode 100644 index 000000000..0b53ed3e2 --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/execution.geom.shader_test.mako @@ -0,0 +1,27 @@ +## coding=utf-8 +<%inherit file="execution_base.mako"/>\ + +[vertex shader] +#version 150 + +in vec4 piglit_vertex; +out vec4 vertex_to_gs; + +void main() +{ + vertex_to_gs = piglit_vertex; +} + +[geometry shader] +<%include file="shader.geom.mako"/> +[fragment shader] +#version 150 + +in vec4 fs_color; +out vec4 color; + +void main() +{ + color = fs_color; +} + diff --git a/generated_tests/templates/gen_conversion_fp64/execution.vert.shader_test.mako b/generated_tests/templates/gen_conversion_fp64/execution.vert.shader_test.mako new file mode 100644 index 000000000..96a80374e --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/execution.vert.shader_test.mako @@ -0,0 +1,16 @@ +## coding=utf-8 +<%inherit file="execution_base.mako"/>\ + +[vertex shader] +<%include file="shader.vert.mako"/> +[fragment shader] +#version 150 + +in vec4 fs_color; +out vec4 color; + +void main() +{ + color = fs_color; +} + diff --git a/generated_tests/templates/gen_conversion_fp64/execution_base.mako b/generated_tests/templates/gen_conversion_fp64/execution_base.mako new file mode 100644 index 000000000..2a3e06560 --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/execution_base.mako @@ -0,0 +1,31 @@ +## coding=utf-8 +<%inherit file="base.mako"/>\ +<% + (glsl_version, glsl_version_int) = self.versioning() +%>\ +<%! from six.moves import range %>\ +[require] +GLSL >= ${glsl_version} +% if ver == 'GL_ARB_gpu_shader_fp64': +${ver} +% endif +${next.body()}\ +[test] +clear color 0.0 0.0 0.0 0.0 + +% for conversion in conversions: +clear +uniform ${uniform_from_type} from \ +% for i in range(amount): +${conversion['from']} \ +% endfor + +uniform ${uniform_to_type} to \ +% for i in range(amount): +${conversion['to']} \ +% endfor + +draw rect -1 -1 2 2 +probe all rgba 0.0 1.0 0.0 1.0 + +% endfor diff --git a/generated_tests/templates/gen_conversion_fp64/shader-zero-sign.frag.mako b/generated_tests/templates/gen_conversion_fp64/shader-zero-sign.frag.mako new file mode 100644 index 000000000..f6c61df7d --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/shader-zero-sign.frag.mako @@ -0,0 +1,18 @@ +## coding=utf-8 +<%inherit file="shader_base.mako"/>\ +uniform ${from_type} from; +uniform ${to_type} to; + +out vec4 color; + +#define ONE 1.0 +#define RED vec4(1.0, 0.0, 0.0, 1.0) +#define GREEN vec4(0.0, 1.0, 0.0, 1.0) + +void main() +{ + ${to_type} pre_converted = ${converted_from}; + ${to_type} converted = ONE / pre_converted; + bool match = converted == to; + color = match ? GREEN : RED; +} diff --git a/generated_tests/templates/gen_conversion_fp64/shader-zero-sign.geom.mako b/generated_tests/templates/gen_conversion_fp64/shader-zero-sign.geom.mako new file mode 100644 index 000000000..a4f82bade --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/shader-zero-sign.geom.mako @@ -0,0 +1,27 @@ +## coding=utf-8 +<%inherit file="shader_base.mako"/>\ +layout(triangles) in; +layout(triangle_strip, max_vertices = 3) out; + +uniform ${from_type} from; +uniform ${to_type} to; + +in vec4 vertex_to_gs[3]; +out vec4 fs_color; + +#define ONE 1.0 +#define RED vec4(1.0, 0.0, 0.0, 1.0) +#define GREEN vec4(0.0, 1.0, 0.0, 1.0) + +void main() +{ + ${to_type} pre_converted = ${converted_from}; + ${to_type} converted = ONE / pre_converted; + bool match = converted == to; + fs_color = match ? GREEN : RED; + + for (int i = 0; i < 3; i++) { + gl_Position = vertex_to_gs[i]; + EmitVertex(); + } +} diff --git a/generated_tests/templates/gen_conversion_fp64/shader-zero-sign.vert.mako b/generated_tests/templates/gen_conversion_fp64/shader-zero-sign.vert.mako new file mode 100644 index 000000000..a0c6a13a9 --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/shader-zero-sign.vert.mako @@ -0,0 +1,20 @@ +## coding=utf-8 +<%inherit file="shader_base.mako"/>\ +uniform ${from_type} from; +uniform ${to_type} to; + +in vec4 piglit_vertex; +out vec4 fs_color; + +#define ONE 1.0 +#define RED vec4(1.0, 0.0, 0.0, 1.0) +#define GREEN vec4(0.0, 1.0, 0.0, 1.0) + +void main() +{ + gl_Position = piglit_vertex; + ${to_type} pre_converted = ${converted_from}; + ${to_type} converted = ONE / pre_converted; + bool match = converted == to; + fs_color = match ? GREEN : RED; +} diff --git a/generated_tests/templates/gen_conversion_fp64/shader.frag.mako b/generated_tests/templates/gen_conversion_fp64/shader.frag.mako new file mode 100644 index 000000000..7a8b07c4e --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/shader.frag.mako @@ -0,0 +1,16 @@ +## coding=utf-8 +<%inherit file="shader_base.mako"/>\ +uniform ${from_type} from; +uniform ${to_type} to; + +out vec4 color; + +#define RED vec4(1.0, 0.0, 0.0, 1.0) +#define GREEN vec4(0.0, 1.0, 0.0, 1.0) + +void main() +{ + ${to_type} converted = ${converted_from}; + bool match = converted == to; + color = match ? GREEN : RED; +} diff --git a/generated_tests/templates/gen_conversion_fp64/shader.geom.mako b/generated_tests/templates/gen_conversion_fp64/shader.geom.mako new file mode 100644 index 000000000..bf6406587 --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/shader.geom.mako @@ -0,0 +1,25 @@ +## coding=utf-8 +<%inherit file="shader_base.mako"/>\ +layout(triangles) in; +layout(triangle_strip, max_vertices = 3) out; + +uniform ${from_type} from; +uniform ${to_type} to; + +in vec4 vertex_to_gs[3]; +out vec4 fs_color; + +#define RED vec4(1.0, 0.0, 0.0, 1.0) +#define GREEN vec4(0.0, 1.0, 0.0, 1.0) + +void main() +{ + ${to_type} converted = ${converted_from}; + bool match = converted == to; + fs_color = match ? GREEN : RED; + + for (int i = 0; i < 3; i++) { + gl_Position = vertex_to_gs[i]; + EmitVertex(); + } +} diff --git a/generated_tests/templates/gen_conversion_fp64/shader.vert.mako b/generated_tests/templates/gen_conversion_fp64/shader.vert.mako new file mode 100644 index 000000000..2f3553d87 --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/shader.vert.mako @@ -0,0 +1,18 @@ +## coding=utf-8 +<%inherit file="shader_base.mako"/>\ +uniform ${from_type} from; +uniform ${to_type} to; + +in vec4 piglit_vertex; +out vec4 fs_color; + +#define RED vec4(1.0, 0.0, 0.0, 1.0) +#define GREEN vec4(0.0, 1.0, 0.0, 1.0) + +void main() +{ + gl_Position = piglit_vertex; + ${to_type} converted = ${converted_from}; + bool match = converted == to; + fs_color = match ? GREEN : RED; +} diff --git a/generated_tests/templates/gen_conversion_fp64/shader_base.mako b/generated_tests/templates/gen_conversion_fp64/shader_base.mako new file mode 100644 index 000000000..33d88b813 --- /dev/null +++ b/generated_tests/templates/gen_conversion_fp64/shader_base.mako @@ -0,0 +1,11 @@ +## coding=utf-8 +<%inherit file="base.mako"/>\ +<% + (glsl_version, glsl_version_int) = self.versioning() +%>\ +#version ${glsl_version_int} +% if ver == 'GL_ARB_gpu_shader_fp64': +#extension GL_ARB_gpu_shader_fp64 : require +% endif + +${next.body()}\ diff --git a/tests/spec/arb_gpu_shader_fp64/compiler/implicit-conversion-double-float-bad.vert b/tests/spec/arb_gpu_shader_fp64/compiler/implicit-conversion-double-float-bad.vert deleted file mode 100644 index 3e2b15a59..000000000 --- a/tests/spec/arb_gpu_shader_fp64/compiler/implicit-conversion-double-float-bad.vert +++ /dev/null @@ -1,20 +0,0 @@ -// [config] -// expect_result: fail -// glsl_version: 1.50 -// require_extensions: GL_ARB_gpu_shader_fp64 -// [end config] -// -// Test double -> float implicit conversion doesn't happen - -#version 150 -#extension GL_ARB_gpu_shader_fp64 : enable - -float _float = 0.0f; - -double _double = 0.0lf; - -void test() { - - /* double cannot be converted to float (and for vectors of same) */ - _float = _double; -} diff --git a/tests/spec/arb_gpu_shader_fp64/compiler/implicit-conversion-dvec2-vec2-bad.vert b/tests/spec/arb_gpu_shader_fp64/compiler/implicit-conversion-dvec2-vec2-bad.vert deleted file mode 100644 index 225636d41..000000000 --- a/tests/spec/arb_gpu_shader_fp64/compiler/implicit-conversion-dvec2-vec2-bad.vert +++ /dev/null @@ -1,20 +0,0 @@ -// [config] -// expect_result: fail -// glsl_version: 1.50 -// require_extensions: GL_ARB_gpu_shader_fp64 -// [end config] -// -// Test double -> float implicit conversion doesn't happen - -#version 150 -#extension GL_ARB_gpu_shader_fp64 : enable - -vec2 _vec2 = vec2(0.0f); - -dvec2 _dvec2 = dvec2(0.0lf); - -void test() { - - /* double cannot be converted to float (and for vectors of same) */ - _vec2 = _dvec2; -} diff --git a/tests/spec/arb_gpu_shader_fp64/compiler/implicit-conversion-dvec3-vec3-bad.vert b/tests/spec/arb_gpu_shader_fp64/compiler/implicit-conversion-dvec3-vec3-bad.vert deleted file mode 100644 index cf8583ebb..000000000 --- a/tests/spec/arb_gpu_shader_fp64/compiler/implicit-conversion-dvec3-vec3-bad.vert +++ /dev/null @@ -1,20 +0,0 @@ -// [config] -// expect_result: fail -// glsl_version: 1.50 -// require_extensions: GL_ARB_gpu_shader_fp64 -// [end config] -// -// Test double -> float implicit conversion doesn't happen - -#version 150 -#extension GL_ARB_gpu_shader_fp64 : enable - -vec3 _vec3 = vec3(0.0f); - -dvec3 _dvec3 = dvec3(0.0lf); - -void test() { - - /* double cannot be converted to float (and for vectors of same) */ - _vec3 = _dvec3; -} diff --git a/tests/spec/arb_gpu_shader_fp64/compiler/implicit-conversion-dvec4-vec4-bad.vert b/tests/spec/arb_gpu_shader_fp64/compiler/implicit-conversion-dvec4-vec4-bad.vert deleted file mode 100644 index dd394e5f1..000000000 --- a/tests/spec/arb_gpu_shader_fp64/compiler/implicit-conversion-dvec4-vec4-bad.vert +++ /dev/null @@ -1,20 +0,0 @@ -// [config] -// expect_result: fail -// glsl_version: 1.50 -// require_extensions: GL_ARB_gpu_shader_fp64 -// [end config] -// -// Test double -> float implicit conversion doesn't happen - -#version 150 -#extension GL_ARB_gpu_shader_fp64 : enable - -vec4 _vec4 = vec4(0.0f); - -dvec4 _dvec4 = dvec4(0.0lf); - -void test() { - - /* double cannot be converted to float (and for vectors of same) */ - _vec4 = _dvec4; -} diff --git a/tests/spec/arb_gpu_shader_fp64/compiler/implicit-conversions.vert b/tests/spec/arb_gpu_shader_fp64/compiler/implicit-conversions.vert deleted file mode 100644 index 0b88b4044..000000000 --- a/tests/spec/arb_gpu_shader_fp64/compiler/implicit-conversions.vert +++ /dev/null @@ -1,115 +0,0 @@ -// [config] -// expect_result: pass -// glsl_version: 1.50 -// require_extensions: GL_ARB_gpu_shader_fp64 -// [end config] -// -// Test that implicit conversions are allowed as specified in GL_ARB_gpu_shader_fp64 -// -// GL_ARB_gpu_shader_fp64 spec presents following conversion table: -// -// Can be implicitly -// Type of expression converted to -// --------------------- ------------------- -// int uint(*), float, double -// ivec2 uvec2(*), vec2, dvec2 -// ivec3 uvec3(*), vec3, dvec3 -// ivec4 uvec4(*), vec4, dvec4 -// -// uint float, double -// uvec2 vec2, dvec2 -// uvec3 vec3, dvec3 -// uvec4 vec4, dvec4 -// -// float double -// vec2 dvec2 -// vec3 dvec3 -// vec4 dvec4 -// -// mat2 dmat2 -// mat3 dmat3 -// mat4 dmat4 -// mat2x3 dmat2x3 -// mat2x4 dmat2x4 -// mat3x2 dmat3x2 -// mat3x4 dmat3x4 -// mat4x2 dmat4x2 -// mat4x3 dmat4x3 -// -// (*) if ARB_gpu_shader5 or NV_gpu_shader5 is supported -// - -#version 150 -#extension GL_ARB_gpu_shader_fp64 : enable - -int _int = 0; -ivec2 _ivec2 = ivec2(0); -ivec3 _ivec3 = ivec3(0); -ivec4 _ivec4 = ivec4(0); - -uint _uint = 0u; -uvec2 _uvec2 = uvec2(0u); -uvec3 _uvec3 = uvec3(0u); -uvec4 _uvec4 = uvec4(0u); - -float _float = 0.0f; -vec2 _vec2 = vec2(0.0f); -vec3 _vec3 = vec3(0.0f); -vec4 _vec4 = vec4(0.0f); - -double _double; -dvec2 _dvec2; -dvec3 _dvec3; -dvec4 _dvec4; - -mat2 _mat2 = mat2(1.0); -mat3 _mat3 = mat3(1.0); -mat4 _mat4 = mat4(1.0); -mat2x3 _mat2x3 = mat2x3(1.0); -mat2x4 _mat2x4 = mat2x4(1.0); -mat3x2 _mat3x2 = mat3x2(1.0); -mat3x4 _mat3x4 = mat3x4(1.0); -mat4x2 _mat4x2 = mat4x2(1.0); -mat4x3 _mat4x3 = mat4x3(1.0); - -dmat2 _dmat2; -dmat3 _dmat3; -dmat4 _dmat4; -dmat2x3 _dmat2x3; -dmat2x4 _dmat2x4; -dmat3x2 _dmat3x2; -dmat3x4 _dmat3x4; -dmat4x2 _dmat4x2; -dmat4x3 _dmat4x3; - -void test() { - - /* int can be converted to double (and for vectors of same) */ - _double = _int; - _dvec2 = _ivec2; - _dvec3 = _ivec3; - _dvec4 = _ivec4; - - /* uint can be converted to double (and for vectors of same) */ - _double = _uint; - _dvec2 = _uvec2; - _dvec3 = _uvec3; - _dvec4 = _uvec4; - - /* float can be converted to double (and for vectors of same) */ - _double = _float; - _dvec2 = _vec2; - _dvec3 = _vec3; - _dvec4 = _vec4; - - /* mat -> dmat conversions */ - _dmat2 = _mat2; - _dmat3 = _mat3; - _dmat4 = _mat4; - _dmat2x3 = _mat2x3; - _dmat2x4 = _mat2x4; - _dmat3x2 = _mat3x2; - _dmat3x4 = _mat3x4; - _dmat4x2 = _mat4x2; - _dmat4x3 = _mat4x3; -} |