[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