From 83c2e52ba59519898efa4984de756a799c74b35c Mon Sep 17 00:00:00 2001 From: Tony Wasserka Date: Thu, 7 Jul 2022 12:34:00 +0200 Subject: [PATCH] Vulkan: Handle queries for unknown functions more gracefully --- ThunkLibs/libvulkan/Guest.cpp | 44 ++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/ThunkLibs/libvulkan/Guest.cpp b/ThunkLibs/libvulkan/Guest.cpp index 1d3d42846..64a80ada9 100644 --- a/ThunkLibs/libvulkan/Guest.cpp +++ b/ThunkLibs/libvulkan/Guest.cpp @@ -36,18 +36,40 @@ const std::unordered_map*>(raw_args)->a0; + fprintf(stderr, "FATAL: Called unknown Vulkan function at address %p\n", reinterpret_cast(called_function)); + __builtin_trap(); +} + +static PFN_vkVoidFunction MakeGuestCallable(const char* origin, PFN_vkVoidFunction func, const char* name) { + auto It = HostPtrInvokers.find(name); + if (It == HostPtrInvokers.end()) { + fprintf(stderr, "%s: Unknown Vulkan function at address %p: %s\n", origin, func, name); + if (stub_unknown_functions) { + const auto StubHostPtrInvoker = CallHostThunkFromRuntimePointer; + LinkAddressToFunction((uintptr_t)func, reinterpret_cast(StubHostPtrInvoker)); + return func; + } + return nullptr; + } + fprintf(stderr, "Linking address %p to host invoker %#lx\n", func, It->second); + LinkAddressToFunction((uintptr_t)func, It->second); + return func; +} + PFN_vkVoidFunction vkGetDeviceProcAddr(VkDevice a_0,const char* a_1){ auto Ret = fexfn_pack_vkGetDeviceProcAddr(a_0, a_1); if (!Ret) { return nullptr; } - auto It = HostPtrInvokers.find(a_1); - if (It == HostPtrInvokers.end() || !It->second) { - fprintf(stderr, "\tvkGetDeviceProcAddr: Couldn't find Guest symbol: '%s'\n", a_1); - __builtin_trap(); - } - LinkAddressToFunction((uintptr_t)Ret, It->second); - return Ret; + return MakeGuestCallable(__FUNCTION__, Ret, a_1); } PFN_vkVoidFunction vkGetInstanceProcAddr(VkInstance a_0,const char* a_1){ @@ -58,13 +80,7 @@ PFN_vkVoidFunction vkGetInstanceProcAddr(VkInstance a_0,const char* a_1){ if (!Ret) { return nullptr; } - auto It = HostPtrInvokers.find(a_1); - if (It == HostPtrInvokers.end() || !It->second) { - fprintf(stderr, "\tvkGetInstanceProcAddr: Couldn't find Guest symbol: '%s'\n", a_1); - __builtin_trap(); - } - LinkAddressToFunction((uintptr_t)Ret, It->second); - return Ret; + return MakeGuestCallable(__FUNCTION__, Ret, a_1); } }