loader: Fix bugs where non-dispatchable objects overwrite dispatch table
Also fix the GPA for non pass through cases
diff --git a/loader/vk-loader-generate.py b/loader/vk-loader-generate.py
index 617174d..8f18ea5 100755
--- a/loader/vk-loader-generate.py
+++ b/loader/vk-loader-generate.py
@@ -45,13 +45,17 @@
def run(self):
print(self.generate())
- def _does_function_create_object(self, proto):
- out_objs = proto.object_out_params()
- if proto.name == "ResetFences":
- return False
- return out_objs and out_objs[-1] == proto.params[-1]
+ def _requires_special_trampoline_code(self, name):
+ # Dont be cute trying to use a general rule to programmatically populate this list
+ # it just obsfucates what is going on!
+ wsi_creates_dispatchable_object = ["GetPhysicalDeviceInfo", "CreateSwapChainWSI"]
+ creates_dispatchable_object = ["CreateDevice", "GetDeviceQueue", "CreateCommandBuffer"] + wsi_creates_dispatchable_object
+ if name in creates_dispatchable_object:
+ return True
+ else:
+ return False
- def _is_loader_special_case(self, proto):
+ def _is_loader_non_trampoline_entrypoint(self, proto):
if proto.name in ["GetProcAddr", "EnumeratePhysicalDevices", "EnumerateLayers", "DbgRegisterMsgCallback", "DbgUnregisterMsgCallback", "DbgSetGlobalOption", "DestroyInstance"]:
return True
return not self.is_dispatchable_object_first_param(proto)
@@ -124,19 +128,15 @@
def _generate_object_setup(self, proto):
method = "loader_init_dispatch"
cond = "res == VK_SUCCESS"
+ setup = []
+
+ if not self._requires_special_trampoline_code(proto.name):
+ return setup
if "Get" in proto.name:
method = "loader_set_dispatch"
- setup = []
-
- if proto.name == "AllocDescriptorSets":
- psets = proto.params[-2].name
- pcount = proto.params[-1].name
- setup.append("uint32_t i;")
- setup.append("for (i = 0; i < *%s; i++)" % pcount)
- setup.append(" %s(%s[i], disp);" % (method, psets))
- elif proto.name == "GetPhysicalDeviceInfo":
+ if proto.name == "GetPhysicalDeviceInfo":
ptype = proto.params[-3].name
psize = proto.params[-2].name
pdata = proto.params[-1].name
@@ -159,7 +159,7 @@
setup.append(" %s(info[i].image, disp);" % method)
setup.append(" %s(info[i].memory, disp);" % method)
setup.append("}")
- elif proto.name != "ResetFences":
+ else:
obj_params = proto.object_out_params()
for param in obj_params:
setup.append("%s(*%s, disp);" % (method, param.name))
@@ -179,7 +179,7 @@
funcs = []
for proto in self.protos:
- if self._is_loader_special_case(proto):
+ if self._is_loader_non_trampoline_entrypoint(proto):
continue
func = []
@@ -377,10 +377,8 @@
(self.gpa.ret, self.prefix, proto.name))
special_lookups = []
- # these functions require special trampoline code beyond just the normal create object trampoline code
- special_names = ["AllocDescriptorSets", "GetSwapChainInfoWSI", "GetPhysicalDeviceInfo"]
for proto in self.protos:
- if self._is_loader_special_case(proto) or self._does_function_create_object(proto) or proto.name in special_names:
+ if self._is_loader_non_trampoline_entrypoint(proto) or self._requires_special_trampoline_code(proto.name):
special_lookups.append("if (!strcmp(name, \"%s\"))" % proto.name)
special_lookups.append(" return (%s) %s%s;" %
(self.gpa.ret, self.prefix, proto.name))