<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">I made a quick comment below.  With that, this patch is<br><br></div><div class="gmail_quote">Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br><br></div><div class="gmail_quote">Assuming you pulled 1 and 2 from master of the public github repo for Khronos, they are<br><br></div><div class="gmail_quote">Acked-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br></div><div class="gmail_quote"><br>On Thu, Jan 12, 2017 at 1:43 PM, Lionel Landwerlin <span dir="ltr"><<a href="mailto:lionel.g.landwerlin@intel.com" target="_blank">lionel.g.landwerlin@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Signed-off-by: Lionel Landwerlin <<a href="mailto:lionel.g.landwerlin@intel.com">lionel.g.landwerlin@intel.com</a><wbr>><br>
---<br>
 src/intel/vulkan/Makefile.am            |  15 ++--<br>
 src/intel/vulkan/anv_<wbr>entrypoints_gen.py | 125 +++++++++++++++++-------------<wbr>--<br>
 2 files changed, 71 insertions(+), 69 deletions(-)<br>
<br>
diff --git a/src/intel/vulkan/Makefile.am b/src/intel/vulkan/Makefile.am<br>
index df7645fb13..d32b57f267 100644<br>
--- a/src/intel/vulkan/Makefile.am<br>
+++ b/src/intel/vulkan/Makefile.am<br>
@@ -23,11 +23,6 @@ include Makefile.sources<br>
<br>
 vulkan_includedir = $(includedir)/vulkan<br>
<br>
-vulkan_include_HEADERS = \<br>
-       $(top_srcdir)/include/vulkan/<wbr>vk_platform.h \<br>
-       $(top_srcdir)/include/vulkan/<wbr>vulkan.h \<br>
-       $(top_srcdir)/include/vulkan/<wbr>vulkan_intel.h<br>
-<br>
 lib_LTLIBRARIES = <a href="http://libvulkan_intel.la" rel="noreferrer" target="_blank">libvulkan_intel.la</a><br>
<br>
 check_LTLIBRARIES = <a href="http://libvulkan-test.la" rel="noreferrer" target="_blank">libvulkan-test.la</a><br>
@@ -138,12 +133,14 @@ VULKAN_LIB_DEPS += \<br>
 nodist_EXTRA_libvulkan_intel_<wbr>la_SOURCES = dummy.cpp<br>
 libvulkan_intel_la_SOURCES = $(VULKAN_GEM_FILES)<br>
<br>
-anv_entrypoints.h : anv_entrypoints_gen.py $(vulkan_include_HEADERS)<br>
-       $(AM_V_GEN) cat $(vulkan_include_HEADERS) |\<br>
+vulkan_api_xml = $(top_srcdir)/src/vulkan/<wbr>registry/vk.xml<br>
+<br>
+anv_entrypoints.h : anv_entrypoints_gen.py $(vulkan_api_xml)<br>
+       $(AM_V_GEN) cat $(vulkan_api_xml) |\<br>
        $(PYTHON2) $(srcdir)/anv_entrypoints_gen.<wbr>py header > $@<br>
<br>
-anv_entrypoints.c : anv_entrypoints_gen.py $(vulkan_include_HEADERS)<br>
-       $(AM_V_GEN) cat $(vulkan_include_HEADERS) |\<br>
+anv_entrypoints.c : anv_entrypoints_gen.py $(vulkan_api_xml)<br>
+       $(AM_V_GEN) cat $(vulkan_api_xml) |\<br>
        $(PYTHON2) $(srcdir)/anv_entrypoints_gen.<wbr>py code > $@<br>
<br>
 BUILT_SOURCES = $(VULKAN_GENERATED_FILES)<br>
diff --git a/src/intel/vulkan/anv_<wbr>entrypoints_gen.py b/src/intel/vulkan/anv_<wbr>entrypoints_gen.py<br>
index 9d23dbb358..e303b7e8e8 100644<br>
--- a/src/intel/vulkan/anv_<wbr>entrypoints_gen.py<br>
+++ b/src/intel/vulkan/anv_<wbr>entrypoints_gen.py<br>
@@ -23,13 +23,7 @@<br>
 #<br>
<br>
 import fileinput, re, sys<br>
-<br>
-# Each function typedef in the vulkan.h header is all on one line and matches<br>
-# this regepx. We hope that won't change.<br>
-<br>
-p = re.compile('typedef ([^ ]*) *\((?:VKAPI_PTR)? *\*PFN_vk([^(]*)\)(.*);')<br>
-<br>
-entrypoints = []<br>
+import xml.etree.ElementTree as ET<br>
<br>
 # We generate a static hash table for entry point lookup<br>
 # (vkGetProcAddress). We use a linear congruential generator for our hash<br>
@@ -51,29 +45,11 @@ def hash(name):<br>
<br>
     return h<br>
<br>
-def get_platform_guard_macro(name)<wbr>:<br>
-    if "Xlib" in name:<br>
-        return "VK_USE_PLATFORM_XLIB_KHR"<br>
-    elif "Xcb" in name:<br>
-        return "VK_USE_PLATFORM_XCB_KHR"<br>
-    elif "Wayland" in name:<br>
-        return "VK_USE_PLATFORM_WAYLAND_KHR"<br>
-    elif "Mir" in name:<br>
-        return "VK_USE_PLATFORM_MIR_KHR"<br>
-    elif "Android" in name:<br>
-        return "VK_USE_PLATFORM_ANDROID_KHR"<br>
-    elif "Win32" in name:<br>
-        return "VK_USE_PLATFORM_WIN32_KHR"<br>
-    else:<br>
-        return None<br>
-<br>
-def print_guard_start(name):<br>
-    guard = get_platform_guard_macro(name)<br>
+def print_guard_start(guard):<br>
     if guard is not None:<br>
         print "#ifdef {0}".format(guard)<br>
<br>
-def print_guard_end(name):<br>
-    guard = get_platform_guard_macro(name)<br>
+def print_guard_end(guard):<br>
     if guard is not None:<br>
         print "#endif // {0}".format(guard)<br>
<br>
@@ -87,18 +63,48 @@ elif (sys.argv[1] == "code"):<br>
     opt_code = True<br>
     sys.argv.pop()<br>
<br>
-# Parse the entry points in the header<br>
-<br>
-i = 0<br>
-for line in fileinput.input():<br>
-    m  = p.match(line)<br>
-    if (m):<br>
-        if m.group(2) == 'VoidFunction':<br>
-            continue<br>
-        fullname = "vk" + m.group(2)<br>
-        h = hash(fullname)<br>
-        entrypoints.append((m.group(1)<wbr>, m.group(2), m.group(3), i, h))<br>
-        i = i + 1<br>
+# Extract the entry points from the registry<br>
+def get_entrypoints(doc, entrypoints_to_defines):<br>
+    i = 0<br>
+    entrypoints = []<br>
+    commands = doc.findall('./commands/<wbr>command')<br>
+    for command in commands:<br></blockquote><div><br></div><div>If you use python's "itertools", you can avoid incrementing "i".  Just do<br><br></div><div>for i, command in itertools.iterate(commands):<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+        type = command.find('./proto/type').<wbr>text<br>
+        name = command.find('./proto/name').<wbr>text[2:]<br>
+        params = map(lambda p: "".join(p.itertext()), command.findall('./param'))<br>
+        params = ', '.join(params)<br>
+        if name in entrypoints_to_defines:<br>
+            guard = entrypoints_to_defines[name]<br>
+        else:<br>
+            guard = None<br>
+        entrypoints.append((type, name, params, i, hash(name), guard))<br>
+        i += 1<br>
+    return entrypoints<br>
+<br>
+# Maps entry points to extension defines<br>
+def get_entrypoints_defines(doc):<br>
+    entrypoints_to_defines = {}<br>
+    extensions = doc.findall('./extensions/<wbr>extension')<br>
+    for extension in extensions:<br>
+        define = extension.get('protect')<br>
+        entrypoints = extension.findall('./require/<wbr>command')<br>
+        for entrypoint in entrypoints:<br>
+            name = entrypoint.get('name')[2:]<br>
+            entrypoints_to_defines[name] = define<br>
+    return entrypoints_to_defines<br>
+<br>
+doc = ET.parse(sys.stdin)<br>
+entrypoints = get_entrypoints(doc, get_entrypoints_defines(doc))<br>
+<br>
+# Manually add CreateDmaBufImageINTEL for which we don't have an extension<br>
+# defined.<br>
+entrypoints.append(('<wbr>VkResult', 'CreateDmaBufImageINTEL',<br>
+                    'VkDevice _device,' +<br>
+                    'const VkDmaBufImageCreateInfo* pCreateInfo, ' +<br>
+                    'const VkAllocationCallbacks* pAllocator,' +<br>
+                    'VkDeviceMemory* pMem,' +<br>
+                    'VkImage* pImage', len(entrypoints),<br>
+                    hash('CreateDmaBufImageINTEL')<wbr>, None))<br>
<br>
 # For outputting entrypoints.h we generate a anv_EntryPoint() prototype<br>
 # per entry point.<br>
@@ -111,8 +117,7 @@ if opt_header:<br>
     print "      void *entrypoints[%d];" % len(entrypoints)<br>
     print "      struct {"<br>
<br>
-    for type, name, args, num, h in entrypoints:<br>
-        guard = get_platform_guard_macro(name)<br>
+    for type, name, args, num, h, guard in entrypoints:<br>
         if guard is not None:<br>
             print "#ifdef {0}".format(guard)<br>
             print "         PFN_vk{0} {0};".format(name)<br>
@@ -127,14 +132,14 @@ if opt_header:<br>
<br>
     print "void anv_set_dispatch_devinfo(const struct gen_device_info *info);\n"<br>
<br>
-    for type, name, args, num, h in entrypoints:<br>
-        print_guard_start(name)<br>
-        print "%s anv_%s%s;" % (type, name, args)<br>
-        print "%s gen7_%s%s;" % (type, name, args)<br>
-        print "%s gen75_%s%s;" % (type, name, args)<br>
-        print "%s gen8_%s%s;" % (type, name, args)<br>
-        print "%s gen9_%s%s;" % (type, name, args)<br>
-        print_guard_end(name)<br>
+    for type, name, args, num, h, guard in entrypoints:<br>
+        print_guard_start(guard)<br>
+        print "%s anv_%s(%s);" % (type, name, args)<br>
+        print "%s gen7_%s(%s);" % (type, name, args)<br>
+        print "%s gen75_%s(%s);" % (type, name, args)<br>
+        print "%s gen8_%s(%s);" % (type, name, args)<br>
+        print "%s gen9_%s(%s);" % (type, name, args)<br>
+        print_guard_end(guard)<br>
     exit()<br>
<br>
<br>
@@ -180,7 +185,7 @@ static const char strings[] ="""<br>
<br>
 offsets = []<br>
 i = 0;<br>
-for type, name, args, num, h in entrypoints:<br>
+for type, name, args, num, h, guard in entrypoints:<br>
     print "   \"vk%s\\0\"" % name<br>
     offsets.append(i)<br>
     i += 2 + len(name) + 1<br>
@@ -189,7 +194,7 @@ print "   ;"<br>
 # Now generate the table of all entry points<br>
<br>
 print "\nstatic const struct anv_entrypoint entrypoints[] = {"<br>
-for type, name, args, num, h in entrypoints:<br>
+for type, name, args, num, h, guard in entrypoints:<br>
     print "   { %5d, 0x%08x }," % (offsets[num], h)<br>
 print "};\n"<br>
<br>
@@ -202,15 +207,15 @@ print """<br>
 """<br>
<br>
 for layer in [ "anv", "gen7", "gen75", "gen8", "gen9" ]:<br>
-    for type, name, args, num, h in entrypoints:<br>
-        print_guard_start(name)<br>
-        print "%s %s_%s%s __attribute__ ((weak));" % (type, layer, name, args)<br>
-        print_guard_end(name)<br>
+    for type, name, args, num, h, guard in entrypoints:<br>
+        print_guard_start(guard)<br>
+        print "%s %s_%s(%s) __attribute__ ((weak));" % (type, layer, name, args)<br>
+        print_guard_end(guard)<br>
     print "\nconst struct anv_dispatch_table %s_layer = {" % layer<br>
-    for type, name, args, num, h in entrypoints:<br>
-        print_guard_start(name)<br>
+    for type, name, args, num, h, guard in entrypoints:<br>
+        print_guard_start(guard)<br>
         print "   .%s = %s_%s," % (name, layer, name)<br>
-        print_guard_end(name)<br>
+        print_guard_end(guard)<br>
     print "};\n"<br>
<br>
 print """<br>
@@ -251,7 +256,7 @@ anv_resolve_entrypoint(const struct gen_device_info *devinfo, uint32_t index)<br>
<br>
 map = [none for f in xrange(hash_size)]<br>
 collisions = [0 for f in xrange(10)]<br>
-for type, name, args, num, h in entrypoints:<br>
+for type, name, args, num, h, guard in entrypoints:<br>
     level = 0<br>
     while map[h & hash_mask] != none:<br>
         h = h + prime_step<br>
@@ -286,7 +291,7 @@ for i in xrange(0, hash_size, 8):<br>
             print "0x%04x," % (map[j] & 0xffff),<br>
     print<br>
<br>
-print "};"<br>
+print "};"<br>
<br>
 # Finally we generate the hash table lookup function.  The hash function and<br>
 # linear probing algorithm matches the hash table generated above.<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.11.0<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div></div>