layers : gh682 move gipa dispatch table init

Move the GIPA setup of the dispatch tables for layers into
the layer_init_device_dispatch_table call since we're already
doing a majority of it there.  This removes the need to separately
setup the WSI extension entry-points.

Additionally, memset the table to 0, just to make sure anything
that gets added in the future is obvoiusly not set.

Change-Id: I63c7c107cd9f7957e2766fdbeb8a06bc1ae0eda6
diff --git a/vk-generate.py b/vk-generate.py
index 6fafc19..4f182e4 100755
--- a/vk-generate.py
+++ b/vk-generate.py
@@ -95,6 +95,12 @@
         pass
 
 class DispatchTableOpsSubcommand(Subcommand):
+    def __init__(self, argv):
+        self.argv = argv
+        self.headers = vulkan.headers_all
+        self.protos = vulkan.protos_all
+        self.outfile = None
+
     def run(self):
         if len(self.argv) < 1:
             print("DispatchTableOpsSubcommand: <prefix> unspecified")
@@ -121,13 +127,56 @@
         func = []
         if type == "device":
             # GPA has to be first one and uses wrapped object
-            stmts.append("memset(table, 0, sizeof(*table));")
-            stmts.append("table->GetDeviceProcAddr =(PFN_vkGetDeviceProcAddr)  gpa(device,\"vkGetDeviceProcAddr\");")
+            stmts.append("    memset(table, 0, sizeof(*table));")
+            stmts.append("    // Core device function pointers")
+            stmts.append("    table->GetDeviceProcAddr = (PFN_vkGetDeviceProcAddr) gpa(device, \"vkGetDeviceProcAddr\");")
+
+            KHR_printed = False
+            EXT_printed = False
+            XLIB_printed = False
+            XCB_printed = False
+            MIR_printed = False
+            WAY_printed = False
             for proto in self.protos:
-                if proto.name == "CreateInstance" or proto.name == "EnumerateInstanceExtensionProperties" or proto.name == "EnumerateInstanceLayerProperties" or proto.params[0].ty == "VkInstance" or proto.params[0].ty == "VkPhysicalDevice":
+                if proto.name == "CreateInstance" or proto.name == "EnumerateInstanceExtensionProperties" or \
+                  proto.name == "EnumerateInstanceLayerProperties" or proto.params[0].ty == "VkInstance" or \
+                  proto.params[0].ty == "VkPhysicalDevice" or proto.name == "GetDeviceProcAddr":
                     continue
-                if proto.name != "GetDeviceProcAddr" and 'KHR' not in proto.name:
-                    stmts.append("table->%s = (PFN_vk%s) gpa(device, \"vk%s\");" %
+                if 'KHR' in proto.name and not KHR_printed:
+                    stmts.append("    // KHR device extension function pointers")
+                    KHR_printed = True
+                if 'EXT' in proto.name and not EXT_printed:
+                    stmts.append("    // EXT device extension function pointers")
+                    EXT_printed = True
+                if XLIB_printed and 'Xlib' not in proto.name:
+                    stmts.append("#endif // VK_USE_PLATFORM_XLIB_KHR")
+                    XLIB_printed = False
+                if XCB_printed and 'Xcb' not in proto.name:
+                    stmts.append("#endif // VK_USE_PLATFORM_XCB_KHR")
+                    XCB_printed = False
+                if MIR_printed and 'Mir' not in proto.name:
+                    stmts.append("#endif // VK_USE_PLATFORM_MIR_KHR")
+                    MIR_printed = False
+                if WAY_printed and 'Wayland' not in proto.name:
+                    stmts.append("#endif // VK_USE_PLATFORM_WAYLAND_KHR")
+                    WAY_printed = False
+                if 'KHR' in proto.name and 'Xlib' in proto.name:
+                    if not XLIB_printed:
+                        stmts.append("#ifdef VK_USE_PLATFORM_XLIB_KHR")
+                        XLIB_printed = True
+                if 'KHR' in proto.name and 'Xcb' in proto.name:
+                    if not XCB_printed:
+                        stmts.append("#ifdef VK_USE_PLATFORM_XCB_KHR")
+                        XCB_printed = True
+                if 'KHR' in proto.name and 'Mir' in proto.name:
+                    if not MIR_printed:
+                        stmts.append("#ifdef VK_USE_PLATFORM_MIR_KHR")
+                        MIR_printed = True
+                if 'KHR' in proto.name and 'Wayland' in proto.name:
+                    if not WAY_printed:
+                        stmts.append("#ifdef VK_USE_PLATFORM_WAYLAND_KHR")
+                        WAY_printed = True
+                stmts.append("    table->%s = (PFN_vk%s) gpa(device, \"vk%s\");" %
                         (proto.name, proto.name, proto.name))
             func.append("static inline void %s_init_device_dispatch_table(VkDevice device,"
                 % self.prefix)
@@ -136,21 +185,62 @@
             func.append("%s                                               PFN_vkGetDeviceProcAddr gpa)"
                 % (" " * len(self.prefix)))
         else:
-            stmts.append("table->GetInstanceProcAddr =(PFN_vkGetInstanceProcAddr)  gpa(instance,\"vkGetInstanceProcAddr\");")
+            stmts.append("    memset(table, 0, sizeof(*table));")
+            stmts.append("    // Core instance function pointers")
+            stmts.append("    table->GetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) gpa(instance, \"vkGetInstanceProcAddr\");")
+
+            KHR_printed = False
+            EXT_printed = False
+            XLIB_printed = False
+            XCB_printed = False
+            MIR_printed = False
+            WAY_printed = False
             for proto in self.protos:
-                if proto.params[0].ty != "VkInstance" and proto.params[0].ty != "VkPhysicalDevice":
+                if proto.params[0].ty != "VkInstance" and proto.params[0].ty != "VkPhysicalDevice" or \
+                  proto.name == "CreateDevice" or proto.name == "GetInstanceProcAddr":
                     continue
-                if proto.name == "CreateDevice":
-                    continue
-                if proto.name != "GetInstanceProcAddr" and 'KHR' not in proto.name:
-                    stmts.append("table->%s = (PFN_vk%s) gpa(instance, \"vk%s\");" %
-                          (proto.name, proto.name, proto.name))
+                if 'KHR' in proto.name and not KHR_printed:
+                    stmts.append("    // KHR instance extension function pointers")
+                    KHR_printed = True
+                if 'EXT' in proto.name and not EXT_printed:
+                    stmts.append("    // EXT instance extension function pointers")
+                    EXT_printed = True
+                if XLIB_printed and 'Xlib' not in proto.name:
+                    stmts.append("#endif // VK_USE_PLATFORM_XLIB_KHR")
+                    XLIB_printed = False
+                if XCB_printed and 'Xcb' not in proto.name:
+                    stmts.append("#endif // VK_USE_PLATFORM_XCB_KHR")
+                    XCB_printed = False
+                if MIR_printed and 'Mir' not in proto.name:
+                    stmts.append("#endif // VK_USE_PLATFORM_MIR_KHR")
+                    MIR_printed = False
+                if WAY_printed and 'Wayland' not in proto.name:
+                    stmts.append("#endif // VK_USE_PLATFORM_WAYLAND_KHR")
+                    WAY_printed = False
+                if 'KHR' in proto.name and 'Xlib' in proto.name:
+                    if not XLIB_printed:
+                        stmts.append("#ifdef VK_USE_PLATFORM_XLIB_KHR")
+                        XLIB_printed = True
+                if 'KHR' in proto.name and 'Xcb' in proto.name:
+                    if not XCB_printed:
+                        stmts.append("#ifdef VK_USE_PLATFORM_XCB_KHR")
+                        XCB_printed = True
+                if 'KHR' in proto.name and 'Mir' in proto.name:
+                    if not MIR_printed:
+                        stmts.append("#ifdef VK_USE_PLATFORM_MIR_KHR")
+                        MIR_printed = True
+                if 'KHR' in proto.name and 'Wayland' in proto.name:
+                    if not WAY_printed:
+                        stmts.append("#ifdef VK_USE_PLATFORM_WAYLAND_KHR")
+                        WAY_printed = True
+                stmts.append("    table->%s = (PFN_vk%s) gpa(instance, \"vk%s\");" %
+                      (proto.name, proto.name, proto.name))
             func.append("static inline void %s_init_instance_dispatch_table(" % self.prefix)
             func.append("%s        VkInstance instance," % (" " * len(self.prefix)))
             func.append("%s        VkLayerInstanceDispatchTable *table," % (" " * len(self.prefix)))
             func.append("%s        PFN_vkGetInstanceProcAddr gpa)" % (" " * len(self.prefix)))
         func.append("{")
-        func.append("    %s" % "\n    ".join(stmts))
+        func.append("%s" % "\n".join(stmts))
         func.append("}")
 
         return "\n".join(func)