[Piglit] [PATCH] vkrunner: Add the script used to generate vr-format-table.h

Dylan Baker dylan at pnwbakers.com
Fri Apr 6 17:41:56 UTC 2018


Thanks for making the changes I requested!

Reviewed-by: Dylan Baker <dylan at pnwbakers.com>

Quoting Neil Roberts (2018-04-06 05:14:20)
> Note that the script is not run automatically as part of the build
> process and instead vr-format-table.h is checked into git.
> ---
> 
> I’ve split the script out to make it easier to review.
> 
> Thanks for the feedback Dylan.
> 
>  tests/vulkan/vkrunner/make-formats.py | 137 ++++++++++++++++++++++++++++++++++
>  1 file changed, 137 insertions(+)
>  create mode 100755 tests/vulkan/vkrunner/make-formats.py
> 
> diff --git a/tests/vulkan/vkrunner/make-formats.py b/tests/vulkan/vkrunner/make-formats.py
> new file mode 100755
> index 000000000..01e9000de
> --- /dev/null
> +++ b/tests/vulkan/vkrunner/make-formats.py
> @@ -0,0 +1,137 @@
> +#!/usr/bin/env python
> +
> +# Copyright (C) 2018 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.
> +
> +from __future__ import (
> +    absolute_import, division, print_function, unicode_literals
> +)
> +
> +# This script is used to generate vr-format-table.h from vulkan.h. It
> +# is not run automatically as part of the build process but if need be
> +# it can be used to update the file as follows:
> +#
> +# ./make-formats.py < /usr/include/vulkan/vulkan.h > vr-format-table.h
> +
> +import re
> +import sys
> +from mako.template import Template
> +
> +FORMAT_RE = re.compile(r'\bVK_FORMAT_([A-Z0-9_]+)\b')
> +SKIP_RE = re.compile(r'(?:_BLOCK(?:_IMG)?|_KHR|^UNDEFINED|'
> +                     r'^RANGE_SIZE|^MAX_ENUM|_RANGE)$')
> +COMPONENT_RE = re.compile('([A-Z]+)([0-9]+)')
> +PACK_RE = re.compile('PACK([0-9]+)$')
> +
> +SWIZZLES = ['RGBA', 'BGRA', 'ARGB', 'ABGR']
> +
> +TEMPLATE="""\
> +/* Automatically generated by make-formats.py */
> +static const struct vr_format
> +formats[] = {
> +% for format in formats:
> +       {
> +               .vk_format = VK_FORMAT_${format['name']},
> +               .name = "${format['name']}",
> +               .packed_size = ${format['packed_size']},
> +               .swizzle = VR_FORMAT_SWIZZLE_${format['swizzle']},
> +               .mode = VR_FORMAT_MODE_${format['mode']},
> +               .n_components = ${len(format['components'])},
> +               .components = {
> +                       % for letter, size in format['components']:
> +                       { .bits = ${size} },
> +                       % endfor
> +               }
> +       },
> +% endfor
> +};"""
> +
> +
> +def get_format_names(data):
> +    in_enum = False
> +
> +    for line in data:
> +        if line.startswith('typedef enum VkFormat '):
> +            in_enum = True
> +        elif line.startswith('}'):
> +            in_enum = False
> +        if not in_enum:
> +            continue
> +
> +        md = FORMAT_RE.search(line)
> +        if md is None:
> +            continue
> +        name = md.group(1)
> +        if SKIP_RE.search(name):
> +            continue
> +        yield name
> +
> +
> +def get_formats(data):
> +    for name in sorted(set(get_format_names(data))):
> +        parts = name.split('_')
> +
> +        components = get_components(parts[0])
> +
> +        if components is None:
> +            continue
> +
> +        swizzle = get_swizzle(components)
> +
> +        if len(parts) >= 3:
> +            md = PACK_RE.match(parts[2])
> +            packed_size = int(md.group(1))
> +        else:
> +            packed_size = 0
> +
> +        yield {'name': name,
> +               'packed_size': packed_size,
> +               'swizzle': swizzle,
> +               'mode': parts[1],
> +               'components': components}
> +
> +
> +def get_components(name):
> +    components = [(md.group(1), int(md.group(2)))
> +                  for md in COMPONENT_RE.finditer(name)]
> +    for letter, size in components:
> +        if letter not in "RGBA":
> +            return None
> +    return components
> +
> +
> +def get_swizzle(components):
> +    component_letters = "".join((letter for letter, size in components))
> +    for swizzle in SWIZZLES:
> +        if swizzle.startswith(component_letters):
> +            return swizzle
> +    print("Unknown swizzle {}".format(component_letters),
> +          file=sys.stderr)
> +    sys.exit(1)
> +
> +
> +def main():
> +    template = Template(TEMPLATE)
> +    print(template.render(formats = get_formats(sys.stdin)))
> +
> +
> +if __name__ == '__main__':
> +    main()
> -- 
> 2.14.3
> 
> _______________________________________________
> Piglit mailing list
> Piglit at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/piglit
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: signature
URL: <https://lists.freedesktop.org/archives/piglit/attachments/20180406/a83d1ddb/attachment.sig>


More information about the Piglit mailing list