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)))