vulkan/registry: Feed vk_android_native_buffer.xml to gen_enum_to_str.py
[mesa.git] / src / vulkan / util / gen_enum_to_str.py
index 0564b8e02803686fec0194bd663cdbb4d2f068bb..df326d0a998a2a8649d6a53512b18336616545f9 100644 (file)
 # 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 <vulkan/vulkan.h>
+    #include <vulkan/vk_android_native_buffer.h>
     #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 <vulkan/vulkan.h>
+    #include <vulkan/vk_android_native_buffer.h>
 
     % 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__':