From 560b5966d6b912fa5a814e6d07665381c61909ef Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 7 Mar 2016 23:25:17 +0100 Subject: [PATCH] Make sure backbuffer is transitioned between image layouts for overlay --- renderdoc/driver/vulkan/vk_core.cpp | 5 ---- renderdoc/driver/vulkan/vk_debug.cpp | 6 ----- .../driver/vulkan/wrappers/vk_wsi_funcs.cpp | 27 +++++++++++++++++++ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index a97b7ebc1..53b8f95f2 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -912,11 +912,6 @@ bool WrappedVulkan::EndFrameCapture(void *dev, void *wnd) { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } }; - VkImageMemoryBarrier *barriers[] = { - &bbBarrier, - &readBarrier, - }; - DoPipelineBarrier(cmd, 1, &bbBarrier); DoPipelineBarrier(cmd, 1, &readBarrier); diff --git a/renderdoc/driver/vulkan/vk_debug.cpp b/renderdoc/driver/vulkan/vk_debug.cpp index 9ea2c260d..dedb2dc80 100644 --- a/renderdoc/driver/vulkan/vk_debug.cpp +++ b/renderdoc/driver/vulkan/vk_debug.cpp @@ -1880,11 +1880,6 @@ void VulkanDebugManager::BeginText(const TextPrintState &textstate) { const VkLayerDispatchTable *vt = ObjDisp(textstate.cmd); - VkCommandBufferBeginInfo beginInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, NULL, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT }; - - VkResult vkr = vt->BeginCommandBuffer(Unwrap(textstate.cmd), &beginInfo); - RDCASSERTEQUAL(vkr, VK_SUCCESS); - VkClearValue clearval = {0}; VkRenderPassBeginInfo rpbegin = { VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, NULL, @@ -1957,7 +1952,6 @@ void VulkanDebugManager::RenderTextInternal(const TextPrintState &textstate, flo void VulkanDebugManager::EndText(const TextPrintState &textstate) { ObjDisp(textstate.cmd)->CmdEndRenderPass(Unwrap(textstate.cmd)); - ObjDisp(textstate.cmd)->EndCommandBuffer(Unwrap(textstate.cmd)); } void VulkanDebugManager::GetBufferData(ResourceId buff, uint64_t offset, uint64_t len, vector &ret) diff --git a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp index 747ed6736..d7d1a70b9 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp @@ -538,11 +538,30 @@ VkResult WrappedVulkan::vkQueuePresentKHR( if(overlay & eRENDERDOC_Overlay_Enabled) { VkRenderPass rp = swapInfo.rp; + VkImage im = swapInfo.images[pPresentInfo->pImageIndices[0]].im; VkFramebuffer fb = swapInfo.images[pPresentInfo->pImageIndices[0]].fb; VkLayerDispatchTable *vt = ObjDisp(GetDev()); TextPrintState textstate = { GetNextCmd(), rp, fb, swapInfo.extent.width, swapInfo.extent.height }; + + VkCommandBufferBeginInfo beginInfo = { VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, NULL, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT }; + + VkResult vkr = vt->BeginCommandBuffer(Unwrap(textstate.cmd), &beginInfo); + RDCASSERTEQUAL(vkr, VK_SUCCESS); + + VkImageMemoryBarrier bbBarrier = { + VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, NULL, + 0, 0, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, + VK_QUEUE_FAMILY_IGNORED, VK_QUEUE_FAMILY_IGNORED, + Unwrap(im), + { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 } + }; + + bbBarrier.srcAccessMask = VK_ACCESS_ALL_READ_BITS; + bbBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + + DoPipelineBarrier(textstate.cmd, 1, &bbBarrier); GetDebugManager()->BeginText(textstate); @@ -625,6 +644,14 @@ VkResult WrappedVulkan::vkQueuePresentKHR( } GetDebugManager()->EndText(textstate); + + std::swap(bbBarrier.oldLayout, bbBarrier.newLayout); + bbBarrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + bbBarrier.dstAccessMask = VK_ACCESS_ALL_READ_BITS; + + DoPipelineBarrier(textstate.cmd, 1, &bbBarrier); + + ObjDisp(textstate.cmd)->EndCommandBuffer(Unwrap(textstate.cmd)); SubmitCmds();