diff --git a/renderdoc/driver/vulkan/vk_dispatchtables.h b/renderdoc/driver/vulkan/vk_dispatchtables.h index 9b8892cdc..fc6f83868 100644 --- a/renderdoc/driver/vulkan/vk_dispatchtables.h +++ b/renderdoc/driver/vulkan/vk_dispatchtables.h @@ -49,6 +49,8 @@ struct InstanceDeviceInfo #undef CheckExt #define CheckExt(name, ver) bool ext_##name; + bool brokenGetDeviceProcAddr = false; + int vulkanVersion = VK_API_VERSION_1_0; CheckDeviceExts(); diff --git a/renderdoc/driver/vulkan/vk_layer.cpp b/renderdoc/driver/vulkan/vk_layer.cpp index e30d095de..085d8226c 100644 --- a/renderdoc/driver/vulkan/vk_layer.cpp +++ b/renderdoc/driver/vulkan/vk_layer.cpp @@ -300,6 +300,11 @@ VK_LAYER_RENDERDOC_CaptureGetDeviceProcAddr(VkDevice device, const char *pName) HookInitVulkanDeviceExts(); + if(instDevInfo->brokenGetDeviceProcAddr) + { + HookInitVulkanInstanceExts(); + } + if(GetDeviceDispatchTable(device)->GetDeviceProcAddr == NULL) return NULL; return GetDeviceDispatchTable(device)->GetDeviceProcAddr(Unwrap(device), pName); diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 05bccef69..0f4578067 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -27,6 +27,7 @@ #include "../vk_rendertext.h" #include "../vk_shader_cache.h" #include "api/replay/version.h" +#include "strings/string_utils.h" // intercept and overwrite the application info if present. We must use the same appinfo on // capture and replay, and the safer default is not to replay as if we were the original app but @@ -454,9 +455,15 @@ VkResult WrappedVulkan::vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo modifiedCreateInfo.ppEnabledExtensionNames = addedExts; + bool brokenGetDeviceProcAddr = false; + // override applicationInfo with RenderDoc's, but preserve apiVersion if(modifiedCreateInfo.pApplicationInfo) { + if(modifiedCreateInfo.pApplicationInfo->pEngineName && + strlower(modifiedCreateInfo.pApplicationInfo->pEngineName) == "idtech") + brokenGetDeviceProcAddr = true; + if(modifiedCreateInfo.pApplicationInfo->apiVersion >= VK_API_VERSION_1_0) renderdocAppInfo.apiVersion = modifiedCreateInfo.pApplicationInfo->apiVersion; @@ -481,6 +488,8 @@ VkResult WrappedVulkan::vkCreateInstance(const VkInstanceCreateInfo *pCreateInfo record->instDevInfo = new InstanceDeviceInfo(); + record->instDevInfo->brokenGetDeviceProcAddr = brokenGetDeviceProcAddr; + record->instDevInfo->vulkanVersion = VK_API_VERSION_1_0; if(renderdocAppInfo.apiVersion > VK_API_VERSION_1_0) @@ -1897,6 +1906,9 @@ VkResult WrappedVulkan::vkCreateDevice(VkPhysicalDevice physicalDevice, record->instDevInfo = new InstanceDeviceInfo(); + record->instDevInfo->brokenGetDeviceProcAddr = + GetRecord(m_Instance)->instDevInfo->brokenGetDeviceProcAddr; + record->instDevInfo->vulkanVersion = GetRecord(m_Instance)->instDevInfo->vulkanVersion; #undef CheckExt