From e3b50d2377888b052da341b7bfe97eb807ffb778 Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 3 Jan 2019 17:30:24 +0000 Subject: [PATCH] If an image is in an external or foreign queue we can't fetch contents * There's nothing we can do - we can't safely transition from/to the external queue so we have to treat the initial contents as missing/undefined. --- renderdoc/driver/vulkan/vk_core.cpp | 4 ++-- renderdoc/driver/vulkan/vk_initstate.cpp | 8 ++++++++ renderdoc/driver/vulkan/vk_manager.cpp | 2 ++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index b3804c934..c8c34cb01 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1180,8 +1180,8 @@ bool WrappedVulkan::Serialise_BeginCaptureFrame(SerialiserType &ser) barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL; - barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.srcQueueFamilyIndex = m_QueueFamilyIdx; + barrier.dstQueueFamilyIndex = m_QueueFamilyIdx; barrier.image = Unwrap(img); barrier.subresourceRange = stit->subresourceRange; diff --git a/renderdoc/driver/vulkan/vk_initstate.cpp b/renderdoc/driver/vulkan/vk_initstate.cpp index 6a025ba29..f9503031b 100644 --- a/renderdoc/driver/vulkan/vk_initstate.cpp +++ b/renderdoc/driver/vulkan/vk_initstate.cpp @@ -117,6 +117,14 @@ bool WrappedVulkan::Prepare_InitialState(WrappedVkRes *res) layout = &m_ImageLayouts[im->id]; } + if(layout->queueFamilyIndex == VK_QUEUE_FAMILY_EXTERNAL || + layout->queueFamilyIndex == VK_QUEUE_FAMILY_FOREIGN_EXT) + { + RDCWARN("Image %s in external/foreign queue family, initial contents impossible to fetch.", + ToStr(im->id).c_str()); + return true; + } + if(layout->queueFamilyIndex != m_QueueFamilyIdx) { // get a command buffer for giving up ownership before the copy and acquiring it afterwards. diff --git a/renderdoc/driver/vulkan/vk_manager.cpp b/renderdoc/driver/vulkan/vk_manager.cpp index 29941d680..2c589bb21 100644 --- a/renderdoc/driver/vulkan/vk_manager.cpp +++ b/renderdoc/driver/vulkan/vk_manager.cpp @@ -279,6 +279,8 @@ void VulkanResourceManager::SerialiseImageStates(SerialiserType &ser, t.srcQueueFamilyIndex = ImageState.queueFamilyIndex; t.dstQueueFamilyIndex = ImageState.queueFamilyIndex; m_Core->RemapQueueFamilyIndices(t.srcQueueFamilyIndex, t.dstQueueFamilyIndex); + if(t.dstQueueFamilyIndex == VK_QUEUE_FAMILY_IGNORED) + t.dstQueueFamilyIndex = t.srcQueueFamilyIndex = m_Core->GetQueueFamilyIndex(); state.dstQueueFamilyIndex = t.dstQueueFamilyIndex; t.image = Unwrap(GetCurrentHandle(liveid)); t.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;