[Piglit] [PATCH 6/8] arb_gpu_shader_fp64: use generator to test in/out attributes
Andres Gomez
agomez at igalia.com
Mon Apr 25 15:44:17 UTC 2016
Dylan, do you think we can get an R-b or Ack-b from you for this second
version of the patch?
Thanks!
On Wed, 2016-03-16 at 17:39 +0200, Andres Gomez wrote:
> From: "Juan A. Suarez Romero" <jasuarez at igalia.com>
>
> Vertex shader inputs and fragment shader outputs can only be
> single-precision values.
>
> From GL_ARB_gpu_shader_fp64 spec:
>
> "Modify Section 4.3.4, Inputs, p. 31
>
> (modify third paragraph of the section, p. 31) ... Vertex shader
> inputs
> can only be single-precision floating-point scalars, vectors, or
> matrices, or signed and unsigned integers and integer
> vectors. Vertex
> shader inputs can also form arrays of these types, but not
> structures."
>
> "Modify Section 4.3.6, Outputs, p. 33
>
> (modify third paragraph of the section, p. 33) They can only be
> float,
> double, single- or double-precision floating-point vectors or
> matrices,
> signed or unsigned integers or integer vectors, or arrays or
> structures
> of any these.
>
> (modify last paragraph, p. 33) ... Fragment outputs can only be
> float,
> single-precision floating-point vectors, signed or unsigned integers
> or
> integer vectors, or arrays of these. ..."
>
> Contributed by Andres Gomez.
> ---
> generated_tests/CMakeLists.txt | 8 ++
> generated_tests/gen_inout_fp64.py | 151
> +++++++++++++++++++++
> .../templates/gen_inout_fp64/template.frag.mako | 29 ++++
> .../gen_inout_fp64/template.shader_test.mako | 28 ++--
> .../templates/gen_inout_fp64/template.vert.mako | 30 ++++
> .../execution/vs-out-fs-in-double.shader_test | 43 ------
> .../preprocessor/fs-output-double.frag | 23 ----
> .../preprocessor/vs-input-double.vert | 24 ----
> 8 files changed, 237 insertions(+), 99 deletions(-)
> create mode 100644 generated_tests/gen_inout_fp64.py
> create mode 100644
> generated_tests/templates/gen_inout_fp64/template.frag.mako
> rename tests/spec/arb_gpu_shader_fp64/execution/vs-out-fs-in-double-
> 2.shader_test =>
> generated_tests/templates/gen_inout_fp64/template.shader_test.mako
> (56%)
> create mode 100644
> generated_tests/templates/gen_inout_fp64/template.vert.mako
> delete mode 100644 tests/spec/arb_gpu_shader_fp64/execution/vs-out-
> fs-in-double.shader_test
> delete mode 100644 tests/spec/arb_gpu_shader_fp64/preprocessor/fs-
> output-double.frag
> delete mode 100644 tests/spec/arb_gpu_shader_fp64/preprocessor/vs-
> input-double.vert
>
> diff --git a/generated_tests/CMakeLists.txt
> b/generated_tests/CMakeLists.txt
> index 0dc617b..569ca21 100644
> --- a/generated_tests/CMakeLists.txt
> +++ b/generated_tests/CMakeLists.txt
> @@ -117,6 +117,13 @@ piglit_make_generated_tests(
> gen_constant_array_size_tests_fp64.py
> builtin_function_fp64.py)
> piglit_make_generated_tests(
> + inout_fp64.list
> + gen_inout_fp64.py
> + templates/gen_inout_fp64/template.frag.mako
> + templates/gen_inout_fp64/template.vert.mako
> + templates/gen_inout_fp64/template.shader_test.mako
> + )
> +piglit_make_generated_tests(
> shader_precision_tests.list
> gen_shader_precision_tests.py
> builtin_function.py
> @@ -173,6 +180,7 @@ add_custom_target(gen-gl-tests
> interpolation-qualifier-built-in-
> variable.list
> builtin_uniform_tests_fp64.list
> constant_array_size_tests_fp64.list
> + inout_fp64.list
> shader_precision_tests.list
> shader_image_load_store_tests.list
> variable_index_read_tests.list
> diff --git a/generated_tests/gen_inout_fp64.py
> b/generated_tests/gen_inout_fp64.py
> new file mode 100644
> index 0000000..844f2a9
> --- /dev/null
> +++ b/generated_tests/gen_inout_fp64.py
> @@ -0,0 +1,151 @@
> +# 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 in/out fp64 tests."""
> +
> +from __future__ import print_function, division, absolute_import
> +import argparse
> +import os
> +import itertools
> +
> +from templates import template_dir
> +from modules import utils
> +
> +TEMPLATES =
> template_dir(os.path.basename(os.path.splitext(__file__)[0]))
> +
> +def get_dir_name(ver, test_type):
> + """Returns the directory name to save tests given a GLSL
> version."""
> +
> + assert isinstance(ver, str)
> + assert isinstance(test_type, str)
> + if ver == '150':
> + feature_dir = 'arb_gpu_shader_fp64'
> + else:
> + feature_dir = 'glsl-' + ver[0] + '.' + ver[1:]
> +
> + return os.path.join('spec', feature_dir, test_type,
> + 'inout')
> +
> +
> +def generate_compilation_tests(type_name, shader, ver, names_only):
> + """Generate in/out GLSL compilation tests."""
> +
> + assert isinstance(type_name, str)
> + assert shader in ('vert', 'frag')
> + assert isinstance(ver, str)
> + assert isinstance(names_only, bool)
> +
> + filename = os.path.join(
> + get_dir_name(ver, 'compiler'),
> + '{0}-{1}put-{2}.{3}'.format('fs' if shader == 'frag' else
> 'vs',
> + 'out' if shader == 'frag' else
> 'in',
> + type_name, shader))
> +
> + print(filename)
> +
> + if not names_only:
> + with open(filename, 'w') as test_file:
> + test_file.write(TEMPLATES.get_template(
> + 'template.{0}.mako'.format(shader)).render_unicode(
> + glsl_version='{}.{}'.format(ver[0], ver[1:]),
> + glsl_version_int=ver,
> + type_name=type_name,
> + extra_params=',0.0' if type_name in ['dvec2',
> 'dvec3'] else ''))
> +
> +
> +def generate_execution_tests(type_name, ver, names_only):
> + """Generate in/out shader runner tests."""
> +
> + assert isinstance(type_name, str)
> + assert isinstance(ver, str)
> + assert isinstance(names_only, bool)
> +
> + filename = os.path.join(
> + get_dir_name(ver, 'execution'),
> + 'vs-out-fs-in-{0}.shader_test'.format(type_name))
> +
> + print(filename)
> +
> + if not names_only:
> + with open(filename, 'w') as test_file:
> + test_file.write(TEMPLATES.get_template(
> + 'template.shader_test.mako').render_unicode(
> + glsl_version='{}.{}'.format(ver[0], ver[1:]),
> + glsl_version_int=ver,
> + type_name=type_name))
> +
> +
> +def all_compilation_tests(names_only):
> + """Creates all the combinations for in/out compilation tests."""
> +
> + assert isinstance(names_only, bool)
> + type_names = ['double', 'dvec2', 'dvec3', 'dvec4',
> + 'dmat2', 'dmat2x3', 'dmat2x4',
> + 'dmat3x2', 'dmat3', 'dmat3x4',
> + 'dmat4x2', 'dmat4x3', 'dmat4']
> + shaders = ['frag', 'vert']
> + glsl_ver = ['150', '400']
> + if not names_only:
> + for ver in glsl_ver:
> + utils.safe_makedirs(get_dir_name(ver, 'compiler'))
> +
> + for t_name, shader, ver in itertools.product(type_names,
> shaders, glsl_ver):
> + yield t_name, shader, ver, names_only
> +
> +
> +def all_execution_tests(names_only):
> + """Creates all the combinations for in/out shader runner
> tests."""
> +
> + assert isinstance(names_only, bool)
> + type_names = ['double', 'dvec2', 'dvec3', 'dvec4']
> + glsl_ver = ['150', '400']
> + if not names_only:
> + for ver in glsl_ver:
> + utils.safe_makedirs(get_dir_name(ver, 'execution'))
> +
> + for t_name, ver in itertools.product(type_names, glsl_ver):
> + yield t_name, ver, names_only
> +
> +
> +def main():
> + """Main function."""
> +
> + parser = argparse.ArgumentParser(
> + description="Generate in/out tests for 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()
> +
> + for test_args in all_compilation_tests(args.names_only):
> + generate_compilation_tests(*test_args)
> +
> + for test_args in all_execution_tests(args.names_only):
> + generate_execution_tests(*test_args)
> +
> +
> +if __name__ == '__main__':
> + main()
> diff --git
> a/generated_tests/templates/gen_inout_fp64/template.frag.mako
> b/generated_tests/templates/gen_inout_fp64/template.frag.mako
> new file mode 100644
> index 0000000..6ded703
> --- /dev/null
> +++ b/generated_tests/templates/gen_inout_fp64/template.frag.mako
> @@ -0,0 +1,29 @@
> +/* [config]
> + * expect_result: fail
> + * glsl_version: ${glsl_version}
> +%if glsl_version == '1.50':
> + * require_extensions: GL_ARB_gpu_shader_fp64
> + * [end config]
> + *
> + * GL_ARB_gpu_shader_fp64 spec states:
> + *
> + * "Fragment outputs can only be float, single-precision
> + * floating-point vectors, signed or unsigned integers or
> + * integer vectors, or arrays of these."
> +%else:
> + * [end config]
> +%endif
> + */
> +
> +#version ${glsl_version_int}
> +%if glsl_version == '1.50':
> +#extension GL_ARB_gpu_shader_fp64 : require
> +%endif
> +
> +out ${type_name} color;
> +
> +void main()
> +{
> + color = ${type_name}(0.0);
> +}
> +
> diff --git a/tests/spec/arb_gpu_shader_fp64/execution/vs-out-fs-in-
> double-2.shader_test
> b/generated_tests/templates/gen_inout_fp64/template.shader_test.mako
> similarity index 56%
> rename from tests/spec/arb_gpu_shader_fp64/execution/vs-out-fs-in-
> double-2.shader_test
> rename to
> generated_tests/templates/gen_inout_fp64/template.shader_test.mako
> index 5c3ef95..72e2550 100644
> --- a/tests/spec/arb_gpu_shader_fp64/execution/vs-out-fs-in-double-
> 2.shader_test
> +++
> b/generated_tests/templates/gen_inout_fp64/template.shader_test.mako
> @@ -1,34 +1,44 @@
> -# test emitting a single double from vs->fs works
> +# test emitting a ${type_name} from vs->fs works
> # when originally written this failed in varying lowering
>
> [require]
> -GLSL >= 1.50
> +GLSL >= ${glsl_version}
> +%if glsl_version == '1.50':
> GL_ARB_gpu_shader_fp64
> +%endif
>
> [vertex shader]
> -#version 150
> +#version ${glsl_version_int}
> +%if glsl_version == '1.50':
> #extension GL_ARB_gpu_shader_fp64 : require
> +%endif
>
> uniform double arg0;
> +
> in vec4 vertex;
> -flat out double dout1;
> +flat out ${type_name} dout1;
> +
> void main()
> {
> gl_Position = vertex;
> - dout1 = arg0;
> + dout1 = ${type_name}(arg0);
> }
>
> [fragment shader]
> -#version 150
> +#version ${glsl_version_int}
> +%if glsl_version == '1.50':
> #extension GL_ARB_gpu_shader_fp64 : require
> +%endif
>
> -flat in double dout1;
> +flat in ${type_name} dout1;
> uniform double tolerance;
> uniform double expected;
> +out vec4 color;
> +
> void main()
> {
> - double result = trunc(dout1);
> - gl_FragColor = distance(result, expected) <= tolerance ?
> vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
> + ${type_name} result = trunc(dout1);
> + color = distance(result, ${type_name}(expected)) <= tolerance ?
> vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
> }
>
> [vertex data]
> diff --git
> a/generated_tests/templates/gen_inout_fp64/template.vert.mako
> b/generated_tests/templates/gen_inout_fp64/template.vert.mako
> new file mode 100644
> index 0000000..64c03fe
> --- /dev/null
> +++ b/generated_tests/templates/gen_inout_fp64/template.vert.mako
> @@ -0,0 +1,30 @@
> +/* [config]
> + * expect_result: fail
> + * glsl_version: ${glsl_version}
> +%if glsl_version == '1.50':
> + * require_extensions: GL_ARB_gpu_shader_fp64
> + * [end config]
> + *
> + * GL_ARB_gpu_shader_fp64 spec states:
> + *
> + * "Vertex shader inputs can only be single-precision
> + * floating-point scalars, vectors, or matrices, or signed and
> + * unsigned integers and integer vectors. Vertex shader inputs
> + * can also form arrays of these types, but not structures."
> +%else:
> + * [end config]
> +%endif
> + */
> +
> +#version ${glsl_version_int}
> +%if glsl_version == '1.50':
> +#extension GL_ARB_gpu_shader_fp64 : require
> +%endif
> +
> +in ${type_name} vertex;
> +
> +void main()
> +{
> + gl_Position = vec4(vertex${extra_params});
> +}
> +
> diff --git a/tests/spec/arb_gpu_shader_fp64/execution/vs-out-fs-in-
> double.shader_test b/tests/spec/arb_gpu_shader_fp64/execution/vs-out-
> fs-in-double.shader_test
> deleted file mode 100644
> index c01db72..0000000
> --- a/tests/spec/arb_gpu_shader_fp64/execution/vs-out-fs-in-
> double.shader_test
> +++ /dev/null
> @@ -1,43 +0,0 @@
> -# test truncating a double holds precision
> -[require]
> -GLSL >= 1.50
> -GL_ARB_gpu_shader_fp64
> -
> -[vertex shader]
> -#version 150
> -#extension GL_ARB_gpu_shader_fp64 : require
> -uniform double arg0;
> -in vec4 vertex;
> -flat out dvec4 dout1;
> -void main()
> -{
> - gl_Position = vertex;
> - dout1 = dvec4(arg0);
> -}
> -
> -[fragment shader]
> -#version 150
> -#extension GL_ARB_gpu_shader_fp64 : require
> -#
> -flat in dvec4 dout1;
> -uniform double tolerance;
> -uniform double expected;
> -void main()
> -{
> - dvec4 result = trunc(dout1);
> - gl_FragColor = distance(result, dvec4(expected)) <= tolerance ?
> vec4(0.0, 1.0, 0.0, 1.0) : vec4(1.0, 0.0, 0.0, 1.0);
> -}
> -
> -[vertex data]
> -vertex/float/2
> --1.0 -1.0
> - 1.0 -1.0
> - 1.0 1.0
> --1.0 1.0
> -
> -[test]
> -uniform double arg0 1.7976931348623157E+308
> -uniform double expected 1.7976931348623157E+308
> -uniform double tolerance 2.0000000000000002e-05
> -draw arrays GL_TRIANGLE_FAN 0 4
> -probe rgba 0 0 0.0 1.0 0.0 1.0
> diff --git a/tests/spec/arb_gpu_shader_fp64/preprocessor/fs-output-
> double.frag b/tests/spec/arb_gpu_shader_fp64/preprocessor/fs-output-
> double.frag
> deleted file mode 100644
> index 111f01c..0000000
> --- a/tests/spec/arb_gpu_shader_fp64/preprocessor/fs-output-
> double.frag
> +++ /dev/null
> @@ -1,23 +0,0 @@
> -// [config]
> -// expect_result: fail
> -// glsl_version: 1.50
> -// require_extensions: GL_ARB_gpu_shader_fp64
> -// [end config]
> -//
> -// GL_ARB_gpu_shader_fp64 spec states:
> -//
> -// "Fragment outputs can only be float, single-precision
> -// floating-point vectors, signed or unsigned integers or
> -// integer vectors, or arrays of these."
> -//
> -
> -#version 150
> -#extension GL_ARB_gpu_shader_fp64: require
> -
> -out dvec4 color;
> -
> -void main()
> -{
> - color = dvec4(0.0, 0.0, 0.0, 0.0);
> -}
> -
> diff --git a/tests/spec/arb_gpu_shader_fp64/preprocessor/vs-input-
> double.vert b/tests/spec/arb_gpu_shader_fp64/preprocessor/vs-input-
> double.vert
> deleted file mode 100644
> index 930248b..0000000
> --- a/tests/spec/arb_gpu_shader_fp64/preprocessor/vs-input-
> double.vert
> +++ /dev/null
> @@ -1,24 +0,0 @@
> -// [config]
> -// expect_result: fail
> -// glsl_version: 1.50
> -// require_extensions: GL_ARB_gpu_shader_fp64
> -// [end config]
> -//
> -// GL_ARB_gpu_shader_fp64 spec states:
> -//
> -// "Vertex shader inputs can only be single-precision
> -// floating-point scalars, vectors, or matrices, or signed and
> -// unsigned integers and integer vectors. Vertex shader inputs
> -// can also form arrays of these types, but not structures."
> -//
> -
> -#version 150
> -#extension GL_ARB_gpu_shader_fp64: require
> -
> -in dvec4 vertex;
> -
> -void main()
> -{
> - gl_Position = vertex;
> -}
> -
--
Br,
Andres
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: This is a digitally signed message part
URL: <https://lists.freedesktop.org/archives/piglit/attachments/20160425/2150bd33/attachment-0001.sig>
More information about the Piglit
mailing list