loader: Make VkInstance a dispatchable object and init with instance table
diff --git a/loader/vk-loader-generate.py b/loader/vk-loader-generate.py
index 8f18ea5..1d55d56 100755
--- a/loader/vk-loader-generate.py
+++ b/loader/vk-loader-generate.py
@@ -237,23 +237,30 @@
"#include <string.h>",
"#include \"loader_platform.h\""])
- def _generate_init(self):
+ def _generate_init(self, type):
stmts = []
- for proto in self.protos:
- if self.is_dispatchable_object_first_param(proto) or proto.name == "CreateInstance":
- stmts.append("table->%s = (PFN_vk%s) gpa(gpu, \"vk%s\");" %
- (proto.name, proto.name, proto.name))
- else:
- stmts.append("table->%s = vk%s; /* non-dispatchable */" %
- (proto.name, proto.name))
-
func = []
- func.append("static inline void %s_initialize_dispatch_table(VkLayerDispatchTable *table,"
+ if type == "device":
+ for proto in self.protos:
+ if self.is_dispatchable_object_first_param(proto) or proto.name == "CreateInstance":
+ stmts.append("table->%s = (PFN_vk%s) gpa(gpu, \"vk%s\");" %
+ (proto.name, proto.name, proto.name))
+ else:
+ stmts.append("table->%s = vk%s; /* non-dispatchable */" %
+ (proto.name, proto.name))
+ func.append("static inline void %s_init_device_dispatch_table(VkLayerDispatchTable *table,"
% self.prefix)
- func.append("%s PFN_vkGetProcAddr gpa,"
+ func.append("%s PFN_vkGetProcAddr gpa,"
% (" " * len(self.prefix)))
- func.append("%s VkPhysicalDevice gpu)"
+ func.append("%s VkPhysicalDevice gpu)"
% (" " * len(self.prefix)))
+ else:
+ for proto in self.protos:
+ if proto.params[0].ty != "VkInstance" and proto.params[0].ty != "VkPhysicalDevice":
+ continue
+ stmts.append("table->%s = vk%s;" % (proto.name, proto.name))
+ func.append("static inline void %s_init_instance_dispatch_table(VkLayerInstanceDispatchTable *table)"
+ % self.prefix)
func.append("{")
func.append(" %s" % "\n ".join(stmts))
func.append("}")
@@ -285,8 +292,9 @@
return "\n".join(func)
def generate_body(self):
- body = [self._generate_init(),
- self._generate_lookup()]
+ body = [self._generate_init("device"),
+ self._generate_lookup(),
+ self._generate_init("instance")]
return "\n\n".join(body)