scripts: Add ifdef protection to non_wsi ext APIs

Dispatch_table_helper.h should not be platform dependent, wrap all
platform dependencies in pre-processor directives for safe
compilation.

Change-Id: I6c876efaceb4d3c38c719f1db9e93d7bd543370e
diff --git a/vk-generate.py b/vk-generate.py
index 7c57b15..92c3b62 100755
--- a/vk-generate.py
+++ b/vk-generate.py
@@ -123,6 +123,23 @@
                           "#include <vulkan/vk_layer.h>",
                           "#include <string.h>"])
 
+    # Determine if a prototype belongs to an extension in a list of extensions
+    def proto_in_ext(self, name, ext_list):
+        for ext in ext_list:
+            for api in ext.protos:
+                if name == api.name:
+                    return True
+        return False
+
+    # Pull out wsi flavor from a linux WSI extension API name
+    def extract_wsi_type(self, name):
+        wsi_name_map = [("Xcb",     "VK_USE_PLATFORM_XCB_KHR"),
+                        ("Xlib",    "VK_USE_PLATFORM_XLIB_KHR"),
+                        ("Wayland", "VK_USE_PLATFORM_WAYLAND_KHR"),
+                        ("Mir",     "VK_USE_PLATFORM_MIR_KHR")]
+        result = [item[1] for item in wsi_name_map if item[0] in name]
+        return result[0]
+
     def _generate_init_dispatch(self, type):
         stmts = []
         func = []
@@ -137,7 +154,21 @@
                   proto.name == "EnumerateInstanceLayerProperties" or proto.params[0].ty == "VkInstance" or \
                   proto.params[0].ty == "VkPhysicalDevice" or proto.name == "GetDeviceProcAddr":
                     continue
+
+                # Conditionally compile platform-specific APIs
+                protect = ''
+                if self.proto_in_ext(proto.name, vulkan.win32_only_exts):
+                    protect = "VK_USE_PLATFORM_WIN32_KHR"
+                elif self.proto_in_ext(proto.name, vulkan.android_only_exts):
+                    protect = "VK_USE_PLATFORM_ANDROID_KHR"
+
+                # Output table entry, with an ifdef if needed
+                if protect != '':
+                    stmts.append("#ifdef %s" % protect)
                 stmts.append("    table->%s = (PFN_vk%s) gpa(device, \"vk%s\");" % (proto.name, proto.name, proto.name))
+                # If platform-specific entry was protected by an #ifdef, close with a #endif
+                if protect != '':
+                    stmts.append("#endif // %s" % protect)
             func.append("static inline void %s_init_device_dispatch_table(VkDevice device,"
                 % self.prefix)
             func.append("%s                                               VkLayerDispatchTable *table,"
@@ -153,35 +184,28 @@
                 if proto.params[0].ty != "VkInstance" and proto.params[0].ty != "VkPhysicalDevice" or \
                   proto.name == "CreateDevice" or proto.name == "GetInstanceProcAddr":
                     continue
-                # Protect platform-dependent APIs with #ifdef
-                if 'KHR' in proto.name and 'Win32' in proto.name:
-                    stmts.append("#ifdef VK_USE_PLATFORM_WIN32_KHR")
-                if 'KHR' in proto.name and 'Xlib' in proto.name:
-                    stmts.append("#ifdef VK_USE_PLATFORM_XLIB_KHR")
-                if 'KHR' in proto.name and 'Xcb' in proto.name:
-                    stmts.append("#ifdef VK_USE_PLATFORM_XCB_KHR")
-                if 'KHR' in proto.name and 'Mir' in proto.name:
-                    stmts.append("#ifdef VK_USE_PLATFORM_MIR_KHR")
-                if 'KHR' in proto.name and 'Wayland' in proto.name:
-                    stmts.append("#ifdef VK_USE_PLATFORM_WAYLAND_KHR")
-                if 'KHR' in proto.name and 'Android' in proto.name:
-                    stmts.append("#ifdef VK_USE_PLATFORM_ANDROID_KHR")
-                # Output dispatch table entry
-                stmts.append("    table->%s = (PFN_vk%s) gpa(instance, \"vk%s\");" %
-                      (proto.name, proto.name, proto.name))
-                # If entry was protected by an #ifdef, close with a #endif
-                if 'KHR' in proto.name and 'Win32' in proto.name:
-                    stmts.append("#endif // VK_USE_PLATFORM_WIN32_KHR")
-                if 'KHR' in proto.name and 'Xlib' in proto.name:
-                    stmts.append("#endif // VK_USE_PLATFORM_XLIB_KHR")
-                if 'KHR' in proto.name and 'Xcb' in proto.name:
-                    stmts.append("#endif // VK_USE_PLATFORM_XCB_KHR")
-                if 'KHR' in proto.name and 'Mir' in proto.name:
-                    stmts.append("#endif // VK_USE_PLATFORM_MIR_KHR")
-                if 'KHR' in proto.name and 'Wayland' in proto.name:
-                    stmts.append("#endif // VK_USE_PLATFORM_WAYLAND_KHR")
-                if 'KHR' in proto.name and 'Android' in proto.name:
-                    stmts.append("#endif // VK_USE_PLATFORM_ANDROID_KHR")
+
+                protect = ''
+                # Protect platform-dependent WSI APIs with #ifdef
+                if self.proto_in_ext(proto.name, vulkan.win32_wsi_exts):
+                    protect = "VK_USE_PLATFORM_WIN32_KHR"
+                elif self.proto_in_ext(proto.name, vulkan.linux_wsi_exts):
+                    protect = self.extract_wsi_type(proto.name)
+                elif self.proto_in_ext(proto.name, vulkan.android_wsi_exts):
+                    protect = "VK_USE_PLATFORM_ANDROID_KHR"
+                # Protect non-WSI platform-dependent APIs with #ifdef
+                elif self.proto_in_ext(proto.name, vulkan.win32_only_exts):
+                    protect = "VK_USE_PLATFORM_WIN32_KHR"
+                elif self.proto_in_ext(proto.name, vulkan.android_only_exts):
+                    protect = "VK_USE_PLATFORM_ANDROID_KHR"
+
+                # Output dispatch table entry, with an ifdef if needed
+                if protect != '':
+                    stmts.append("#ifdef %s" % protect)
+                stmts.append("    table->%s = (PFN_vk%s) gpa(instance, \"vk%s\");" % (proto.name, proto.name, proto.name))
+                if protect != '':
+                    stmts.append("#endif // %s" % protect)
+
             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)))