[Piglit] [PATCH] vkrunner: Add the script used to generate vr-format-table.h
Neil Roberts
nroberts at igalia.com
Fri Apr 6 12:14:20 UTC 2018
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
More information about the Piglit
mailing list