New extensions can introduce additional enums. Most of the new enums will have disjoint numbers from the initial enums. For example new formats introduced by VK_IMG_format_pvrtc :
VK_FORMAT_ASTC_10x8_UNORM_BLOCK = 177, VK_FORMAT_ASTC_10x8_SRGB_BLOCK = 178, VK_FORMAT_ASTC_10x10_UNORM_BLOCK = 179, VK_FORMAT_ASTC_10x10_SRGB_BLOCK = 180, VK_FORMAT_ASTC_12x10_UNORM_BLOCK = 181, VK_FORMAT_ASTC_12x10_SRGB_BLOCK = 182, VK_FORMAT_ASTC_12x12_UNORM_BLOCK = 183, VK_FORMAT_ASTC_12x12_SRGB_BLOCK = 184, VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG = 1000054000, VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG = 1000054001, VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG = 1000054002, VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG = 1000054003, VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG = 1000054004, VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG = 1000054005, VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG = 1000054006, VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG = 1000054007, It's obvious we can't have a single table for handling those anymore. Fortunately the enum values actually contain the number of the extension that introduced the new enums. So we can build an indirection table off the extension number and then index by subtracting the first enum of the the format enum value. This change makes the extension number available in the generated enum code. Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com> --- src/vulkan/util/gen_enum_to_str.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/vulkan/util/gen_enum_to_str.py b/src/vulkan/util/gen_enum_to_str.py index 28bfbfde235..06d625d9ac8 100644 --- a/src/vulkan/util/gen_enum_to_str.py +++ b/src/vulkan/util/gen_enum_to_str.py @@ -91,6 +91,10 @@ H_TEMPLATE = Template(textwrap.dedent(u"""\ #include <vulkan/vulkan.h> + % for ext in extensions: + #define _${ext.name}_number (${ext.number}) + % endfor + % for enum in enums: const char * vk_${enum.name[2:]}_to_str(${enum.name} input); % endfor @@ -113,6 +117,14 @@ class NamedFactory(object): return n +class VkExtension(object): + """Simple struct-like class representing extensions""" + + def __init__(self, name, number): + self.name = name + self.number = number + + class VkEnum(object): """Simple struct-like class representing a single Vulkan Enum.""" @@ -121,6 +133,7 @@ class VkEnum(object): self.values = values or [] + def xml_parser(filename): """Parse the XML file and return parsed data. @@ -128,6 +141,7 @@ def xml_parser(filename): of VkEnum objects. """ enum_factory = NamedFactory(VkEnum) + ext_factory = NamedFactory(VkExtension) with open(filename, 'rb') as f: context = iter(et.iterparse(f, events=('start', 'end'))) @@ -144,6 +158,8 @@ def xml_parser(filename): enum = enum_factory(elem.attrib['name']) enum.values.extend([e.attrib['name'] for e in elem if e.tag == 'enum']) + elif event == 'start' and elem.tag == 'extension': + ext_factory(elem.attrib['name'], int(elem.attrib['number'])) elif event == 'end' and elem.tag == 'extension': if elem.attrib['supported'] != 'vulkan': continue @@ -153,7 +169,8 @@ def xml_parser(filename): root.clear() - return enum_factory.registry.values() + return (enum_factory.registry.values(), + ext_factory.registry.values()) def main(): @@ -165,14 +182,16 @@ def main(): args = parser.parse_args() - enums = xml_parser(args.xml) + enums, extensions = xml_parser(args.xml) enums.sort(key=lambda e: e.name) + extensions.sort(key=lambda e: e.number) for template, file_ in [(C_TEMPLATE, os.path.join(args.outdir, 'vk_enum_to_str.c')), (H_TEMPLATE, os.path.join(args.outdir, 'vk_enum_to_str.h'))]: with open(file_, 'wb') as f: f.write(template.render( file=os.path.basename(__file__), enums=enums, + extensions=extensions, copyright=COPYRIGHT)) -- 2.14.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev