It seems new extensions will start to use aliases in enums, meaning multiple enums with the same value. This forces us to track the values of the enums to generate correct C code.
Signed-off-by: Lionel Landwerlin <[email protected]> Cc: Dylan Baker <[email protected]> --- src/vulkan/util/gen_enum_to_str.py | 49 ++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/src/vulkan/util/gen_enum_to_str.py b/src/vulkan/util/gen_enum_to_str.py index fb31addf94..1ffe4e362b 100644 --- a/src/vulkan/util/gen_enum_to_str.py +++ b/src/vulkan/util/gen_enum_to_str.py @@ -24,6 +24,7 @@ from __future__ import print_function import argparse import os +import re import textwrap import xml.etree.cElementTree as et @@ -67,9 +68,9 @@ C_TEMPLATE = Template(textwrap.dedent(u"""\ vk_${enum.name[2:]}_to_str(${enum.name} input) { switch(input) { - % for v in enum.values: - case ${v}: - return "${v}"; + % for k, v in enum.values.iteritems(): + case ${v[0]}: + return "${' / '.join(v)}"; % endfor default: unreachable("Undefined enum value."); @@ -116,10 +117,17 @@ class EnumFactory(object): class VkEnum(object): """Simple struct-like class representing a single Vulkan Enum.""" - def __init__(self, name, values=None): + def __init__(self, name): self.name = name - self.values = values or [] + self.values = {} + self.names = {} + def add_item(self, name, value): + if value in self.values: + self.values[value].append(name) + else: + self.values[value] = [name] + self.names[name] = value def xml_parser(filename): """Parse the XML file and return parsed data. @@ -129,6 +137,24 @@ def xml_parser(filename): """ efactory = EnumFactory(VkEnum) + number_regexp = re.compile('^-?[0-9]+$') + + def compute_enum_value(enum, elem, parent): + if 'offset' in elem.attrib: + # Formula taken from the src/spec/generator.py + # https://github.com/khronosGroup/Vulkan-Docs + value = 1000000000 + (int(parent.attrib['number']) - 1) * 1000 + value += int(elem.attrib['offset']) + if 'dir' in e.attrib: + value = -value + else: + number = elem.attrib['value'] + if re.match(number_regexp, number): + value = int(number) + else: + value = enum.names[number] + return value + with open(filename, 'rb') as f: context = iter(et.iterparse(f, events=('start', 'end'))) @@ -140,16 +166,19 @@ def xml_parser(filename): for event, elem in context: if event == 'end' and elem.tag == 'enums': type_ = elem.attrib.get('type') - if type_ == 'enum': - enum = efactory(elem.attrib['name']) - enum.values.extend([e.attrib['name'] for e in elem - if e.tag == 'enum']) + if type_ != 'enum': + continue + enum = efactory(elem.attrib['name']) + for e in elem: + if e.tag != 'enum': + continue + enum.add_item(e.attrib['name'], compute_enum_value(enum, e, None)) elif event == 'end' and elem.tag == 'extension': if elem.attrib['supported'] != 'vulkan': continue for e in elem.findall('.//enum[@extends][@offset]'): enum = efactory(e.attrib['extends']) - enum.values.append(e.attrib['name']) + enum.add_item(e.attrib['name'], compute_enum_value(enum, e, elem)) root.clear() -- 2.11.0 _______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
