diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 6458754cc..2da6f4a95 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -44,6 +44,8 @@ VulkanReplay::OutputWindow::OutputWindow() : wnd(NULL_WND_HANDLE), width(0), hei for(size_t i=0; i < ARRAY_COUNT(colimg); i++) colimg[i] = VK_NULL_HANDLE; + fresh = true; + bb = VK_NULL_HANDLE; bbview = VK_NULL_HANDLE; fb = VK_NULL_HANDLE; @@ -168,6 +170,8 @@ void VulkanReplay::OutputWindow::Create(WrappedVulkan *driver, VkDevice device, surface = oldsurf; + fresh = true; + if(surface == VK_NULL_HANDLE) { CreateSurface(inst); @@ -2565,6 +2569,23 @@ void VulkanReplay::BindOutputWindow(uint64_t id, bool depth) outw.depthBarrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + // first time rendering to the backbuffer, clear it, since our typical render pass + // is set to LOAD_OP_LOAD + if(outw.fresh) + { + outw.bbBarrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + outw.bbBarrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + + DoPipelineBarrier(cmd, 1, &outw.bbBarrier); + float black[] = { 0.0f, 0.0f, 0.0f, 0.0f }; + vt->CmdClearColorImage(Unwrap(cmd), Unwrap(outw.bb), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, (VkClearColorValue *)black, 1, &outw.bbBarrier.subresourceRange); + + outw.bbBarrier.oldLayout = outw.bbBarrier.newLayout; + outw.bbBarrier.srcAccessMask = outw.bbBarrier.dstAccessMask; + + outw.fresh = false; + } + outw.bbBarrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; outw.bbBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; outw.colBarrier[outw.curidx].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; diff --git a/renderdoc/driver/vulkan/vk_replay.h b/renderdoc/driver/vulkan/vk_replay.h index bab2ada89..92f4343f9 100644 --- a/renderdoc/driver/vulkan/vk_replay.h +++ b/renderdoc/driver/vulkan/vk_replay.h @@ -193,6 +193,8 @@ class VulkanReplay : public IReplayDriver WINDOW_HANDLE_DECL + bool fresh; + uint32_t width, height; VkSurfaceKHR surface;