From abca88852455bbe0eac3fba8b57285d7a96a913c Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 4 May 2016 21:00:21 +0200 Subject: [PATCH] Make sure to add WSI extensions needed for replay - app may not use WSI --- renderdoc/driver/vulkan/vk_core.h | 3 ++ renderdoc/driver/vulkan/vk_linux.cpp | 24 ++++++++++++++ renderdoc/driver/vulkan/vk_win32.cpp | 17 ++++++++++ .../vulkan/wrappers/vk_device_funcs.cpp | 33 +++++++++++++------ 4 files changed, 67 insertions(+), 10 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 1c45e0fbf..175b60403 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -484,6 +484,9 @@ private: VulkanDrawcallTreeNode m_ParentDrawcall; + // in vk_.cpp + void AddRequiredExtensions(bool instance, vector &extensionList); + void InsertDrawsAndRefreshIDs(vector &cmdBufNodes, uint32_t baseEventID, uint32_t baseDrawID); list m_DrawcallStack; diff --git a/renderdoc/driver/vulkan/vk_linux.cpp b/renderdoc/driver/vulkan/vk_linux.cpp index b1397e5e9..954052d74 100644 --- a/renderdoc/driver/vulkan/vk_linux.cpp +++ b/renderdoc/driver/vulkan/vk_linux.cpp @@ -86,6 +86,30 @@ bool VulkanReplay::IsOutputWindowVisible(uint64_t id) return true; } +void WrappedVulkan::AddRequiredExtensions(bool instance, vector &extensionList) +{ + bool device = !instance; + + // TODO should check if these are present.. + + if(instance) + { + extensionList.push_back(VK_KHR_SURFACE_EXTENSION_NAME); + +#if defined(VK_USE_PLATFORM_XCB_KHR) + extensionList.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME); +#endif + +#if defined(VK_USE_PLATFORM_XLIB_KHR) + extensionList.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME); +#endif + } + else if(device) + { + extensionList.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME); + } +} + #if defined(VK_USE_PLATFORM_XCB_KHR) VkBool32 WrappedVulkan::vkGetPhysicalDeviceXcbPresentationSupportKHR( diff --git a/renderdoc/driver/vulkan/vk_win32.cpp b/renderdoc/driver/vulkan/vk_win32.cpp index 5a87d37b2..300243fcf 100644 --- a/renderdoc/driver/vulkan/vk_win32.cpp +++ b/renderdoc/driver/vulkan/vk_win32.cpp @@ -69,6 +69,23 @@ bool VulkanReplay::IsOutputWindowVisible(uint64_t id) return (IsWindowVisible(m_OutputWindows[id].wnd) == TRUE); } +void WrappedVulkan::AddRequiredExtensions(bool instance, vector &extensionList) +{ + bool device = !instance; + + // TODO should check if these are present.. + + if(instance) + { + extensionList.push_back(VK_KHR_SURFACE_EXTENSION_NAME); + extensionList.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); + } + else if(device) + { + extensionList.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME); + } +} + #if !defined(VK_USE_PLATFORM_WIN32_KHR) #error "Win32 KHR platform not defined" #endif diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index b1f188ab9..a7dc6b93a 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -99,6 +99,8 @@ void WrappedVulkan::Initialise(VkInitParams ¶ms) params.Extensions.push_back("VK_EXT_debug_report"); #endif + AddRequiredExtensions(true, params.Extensions); + const char **layerscstr = new const char *[params.Layers.size()]; for(size_t i=0; i < params.Layers.size(); i++) layerscstr[i] = params.Layers[i].c_str(); @@ -518,18 +520,13 @@ bool WrappedVulkan::Serialise_vkCreateDevice( // we must make any modifications locally, so the free of pointers // in the serialised VkDeviceCreateInfo don't double-free VkDeviceCreateInfo createInfo = serCreateInfo; - - // disable this extension as we might have captured it but we don't need - // to replay it + + std::vector Extensions; for(uint32_t i=0; i < createInfo.enabledExtensionCount; i++) { - const char **extNames = (const char **)createInfo.ppEnabledExtensionNames; - if(!strcmp(extNames[i], DEBUG_MARKER_EXTENSION_NAME)) - { - for(uint32_t j=i; j < createInfo.enabledExtensionCount-1; j++) - extNames[j] = extNames[j+1]; - createInfo.enabledExtensionCount--; - } + // don't include the debug marker extension + if(strcmp(createInfo.ppEnabledExtensionNames[i], DEBUG_MARKER_EXTENSION_NAME)) + Extensions.push_back(createInfo.ppEnabledExtensionNames[i]); } std::vector Layers; @@ -537,6 +534,8 @@ bool WrappedVulkan::Serialise_vkCreateDevice( Layers.push_back(createInfo.ppEnabledLayerNames[i]); StripUnwantedLayers(Layers); + + AddRequiredExtensions(false, Extensions); #if defined(FORCE_VALIDATION_LAYERS) Layers.push_back("VK_LAYER_LUNARG_standard_validation"); @@ -555,6 +554,19 @@ bool WrappedVulkan::Serialise_vkCreateDevice( createInfo.ppEnabledLayerNames = layerArray; } + createInfo.enabledExtensionCount = (uint32_t)Extensions.size(); + + const char **extArray = NULL; + if(!Extensions.empty()) + { + extArray = new const char *[createInfo.enabledExtensionCount]; + + for(uint32_t i=0; i < createInfo.enabledExtensionCount; i++) + extArray[i] = Extensions[i].c_str(); + + createInfo.ppEnabledExtensionNames = extArray; + } + physicalDevice = GetResourceManager()->GetLiveHandle(physId); VkDevice device; @@ -716,6 +728,7 @@ bool WrappedVulkan::Serialise_vkCreateDevice( SAFE_DELETE_ARRAY(modQueues); SAFE_DELETE_ARRAY(layerArray); + SAFE_DELETE_ARRAY(extArray); } return true;