anv: Teach generator scripts how to parse mutliple XML files
authorChad Versace <chadversary@chromium.org>
Tue, 22 Aug 2017 23:23:26 +0000 (16:23 -0700)
committerChad Versace <chadversary@chromium.org>
Mon, 18 Sep 2017 21:26:54 +0000 (14:26 -0700)
The taught scripts are anv_extensions.py and anv_entrypoints_gen.py.  To
give a script multiple XML files, call it like so:

    anv_extensions.py --xml a.xml --xml b.xml --xml c.xml ...

The scripts parse the XML files in the given order.

This will allow us to feed the scripts XML files for extensions that are
missing from the official vk.xml, such as VK_ANDROID_native_buffer.

Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
src/intel/vulkan/anv_entrypoints_gen.py
src/intel/vulkan/anv_extensions.py

index 3240704a0d8661a532fa3a8f25f817d1b8d3f469..983be09a39b75aa5fc12fc7fd17fac9fd8f2ef5e 100644 (file)
@@ -253,7 +253,7 @@ def cal_hash(name):
         lambda h, c: (h * PRIME_FACTOR + ord(c)) & U32_MASK, name, 0)
 
 
-def get_entrypoints(doc, entrypoints_to_defines):
+def get_entrypoints(doc, entrypoints_to_defines, start_index):
     """Extract the entry points from the registry."""
     entrypoints = []
 
@@ -275,7 +275,7 @@ def get_entrypoints(doc, entrypoints_to_defines):
         for command in extension.findall('./require/command'):
             enabled_commands.add(command.attrib['name'])
 
-    index = 0
+    index = start_index
     for command in doc.findall('./commands/command'):
         type = command.find('./proto/type').text
         fullname = command.find('./proto/name').text
@@ -344,11 +344,19 @@ def main():
     parser = argparse.ArgumentParser()
     parser.add_argument('--outdir', help='Where to write the files.',
                         required=True)
-    parser.add_argument('--xml', help='Vulkan API XML file.', required=True)
+    parser.add_argument('--xml',
+                        help='Vulkan API XML file.',
+                        required=True,
+                        action='append',
+                        dest='xml_files')
     args = parser.parse_args()
 
-    doc = et.parse(args.xml)
-    entrypoints = get_entrypoints(doc, get_entrypoints_defines(doc))
+    entrypoints = []
+
+    for filename in args.xml_files:
+        doc = et.parse(filename)
+        entrypoints += get_entrypoints(doc, get_entrypoints_defines(doc),
+                                       start_index=len(entrypoints))
 
     # Manually add CreateDmaBufImageINTEL for which we don't have an extension
     # defined.
index c94149c130af75237b7f57d93b87390f7fd208e4..4dfde064ca779a1fa0515638401b34525cc84ae7 100644 (file)
@@ -140,9 +140,6 @@ def _init_exts_from_xml(xml):
 
         ext.type = ext_elem.attrib['type']
 
-    for ext in EXTENSIONS:
-        assert ext.type == 'instance' or ext.type == 'device'
-
 _TEMPLATE = Template(COPYRIGHT + """
 #include "anv_private.h"
 
@@ -234,10 +231,18 @@ VkResult anv_EnumerateDeviceExtensionProperties(
 if __name__ == '__main__':
     parser = argparse.ArgumentParser()
     parser.add_argument('--out', help='Output C file.', required=True)
-    parser.add_argument('--xml', help='Vulkan API XML file.', required=True)
+    parser.add_argument('--xml',
+                        help='Vulkan API XML file.',
+                        required=True,
+                        action='append',
+                        dest='xml_files')
     args = parser.parse_args()
 
-    _init_exts_from_xml(args.xml)
+    for filename in args.xml_files:
+        _init_exts_from_xml(filename)
+
+    for ext in EXTENSIONS:
+        assert ext.type == 'instance' or ext.type == 'device'
 
     template_env = {
         'MAX_API_VERSION': MAX_API_VERSION,