X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fvulkan%2Futil%2Fgen_enum_to_str.py;h=df326d0a998a2a8649d6a53512b18336616545f9;hb=2d1fac119fa0d1fccae086605b43b426312b257a;hp=0564b8e02803686fec0194bd663cdbb4d2f068bb;hpb=e9dcb17962f7e58a81c93bae7bd33885675b1043;p=mesa.git diff --git a/src/vulkan/util/gen_enum_to_str.py b/src/vulkan/util/gen_enum_to_str.py index 0564b8e0280..df326d0a998 100644 --- a/src/vulkan/util/gen_enum_to_str.py +++ b/src/vulkan/util/gen_enum_to_str.py @@ -19,17 +19,16 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -"""Create enum to string functions for vulking using vk.xml.""" +"""Create enum to string functions for vulkan using vk.xml.""" from __future__ import print_function +import argparse import os import textwrap import xml.etree.cElementTree as et from mako.template import Template -VK_XML = os.path.join(os.path.dirname(__file__), '..', 'registry', 'vk.xml') - COPYRIGHT = textwrap.dedent(u"""\ * Copyright © 2017 Intel Corporation * @@ -59,6 +58,7 @@ C_TEMPLATE = Template(textwrap.dedent(u"""\ */ #include + #include #include "util/macros.h" #include "vk_enum_to_str.h" @@ -69,8 +69,17 @@ C_TEMPLATE = Template(textwrap.dedent(u"""\ { switch(input) { % for v in enum.values: + % if v in FOREIGN_ENUM_VALUES: + + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wswitch" + % endif case ${v}: return "${v}"; + % if v in FOREIGN_ENUM_VALUES: + #pragma GCC diagnostic pop + + % endif % endfor default: unreachable("Undefined enum value."); @@ -90,6 +99,7 @@ H_TEMPLATE = Template(textwrap.dedent(u"""\ #define MESA_VK_ENUM_TO_STR_H #include + #include % for enum in enums: const char * vk_${enum.name[2:]}_to_str(${enum.name} input); @@ -98,6 +108,12 @@ H_TEMPLATE = Template(textwrap.dedent(u"""\ #endif"""), output_encoding='utf-8') +# These enums are defined outside their respective enum blocks, and thus cause +# -Wswitch warnings. +FOREIGN_ENUM_VALUES = [ + "VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID", +] + class EnumFactory(object): """Factory for creating enums.""" @@ -122,13 +138,12 @@ class VkEnum(object): self.values = values or [] -def xml_parser(filename): - """Parse the XML file and return parsed data. +def parse_xml(efactory, filename): + """Parse the XML file. Accumulate results into the efactory. This parser is a memory efficient iterative XML parser that returns a list of VkEnum objects. """ - efactory = EnumFactory(VkEnum) with open(filename, 'rb') as f: context = iter(et.iterparse(f, events=('start', 'end'))) @@ -154,18 +169,31 @@ def xml_parser(filename): root.clear() - return efactory.registry.values() - def main(): - enums = xml_parser(VK_XML) - for template, file_ in [(C_TEMPLATE, 'vk_enum_to_str.c'), - (H_TEMPLATE, 'vk_enum_to_str.h')]: + parser = argparse.ArgumentParser() + parser.add_argument('--xml', required=True, + help='Vulkan API XML files', + action='append', + dest='xml_files') + parser.add_argument('--outdir', + help='Directory to put the generated files in', + required=True) + + args = parser.parse_args() + + efactory = EnumFactory(VkEnum) + for filename in args.xml_files: + parse_xml(efactory, filename) + + 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, - copyright=COPYRIGHT)) + enums=efactory.registry.values(), + copyright=COPYRIGHT, + FOREIGN_ENUM_VALUES=FOREIGN_ENUM_VALUES)) if __name__ == '__main__':