On Tue, Mar 14, 2017 at 4:04 AM, Lionel Landwerlin < [email protected]> wrote:
> 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. > Seriously? That seems a bit sketchy. Or is this for promoted extensions? The patch looks correct assuming this is something we actually want. > 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 >
_______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
