Re: [Piglit] [PATCH] vkrunner: Add the script used to generate vr-format-table.h
Thanks for making the changes I requested! Reviewed-by: Dylan BakerQuoting 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 0..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
[Piglit] [PATCH] vkrunner: Add the script used to generate vr-format-table.h
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 0..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 =