From b70d157a35866de7fea8c2fc291c6c92c7b0590d Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 28 Apr 2021 16:29:41 +0100 Subject: [PATCH] Only ignore transitions from undefined current state for partial updates * If the current state of a temporary ImageState is unknown in a renderpass transition mid-command buffer that means it's a subresource which isn't touched and we want to skip barriering it. We *don't* want to barrier from UNDEFINED and discard. * However if this is a real ImageState which hasn't been initialised, we do want to do that. So only opt-in to the skipping behaviour in the case we know this isn't a 'real' ImageState but a temporary tracker. --- renderdoc/driver/vulkan/vk_image_states.cpp | 5 +++-- renderdoc/driver/vulkan/vk_resources.h | 2 ++ renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_image_states.cpp b/renderdoc/driver/vulkan/vk_image_states.cpp index 57faf56dc..79417ddea 100644 --- a/renderdoc/driver/vulkan/vk_image_states.cpp +++ b/renderdoc/driver/vulkan/vk_image_states.cpp @@ -1271,8 +1271,9 @@ void ImageState::Transition(const ImageState &dstState, VkAccessFlags srcAccessM { ImageSubresourceState srcSub; - // ignore transitions of subresources that were untouched - if(it->state() == ImageSubresourceState()) + // ignore transitions of subresources that were untouched if this isn't the *canonical* image + // state, but just an overlay tracking changes within a command buffer + if(it->state() == ImageSubresourceState() && m_Overlay) continue; if(!it->state().Update(dstSub, srcSub, info.GetFrameRefCompFunc())) diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index fba59d303..ef20699d4 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -1700,6 +1700,7 @@ struct ImageState rdcarray oldQueueFamilyTransfers; rdcarray newQueueFamilyTransfers; bool isMemoryBound = false; + bool m_Overlay = false; ResourceId boundMemory = ResourceId(); VkDeviceSize boundMemoryOffset = 0ull; VkDeviceSize boundMemorySize = 0ull; @@ -1712,6 +1713,7 @@ struct ImageState : wrappedHandle(wrappedHandle), subresourceStates(imageInfo, refType), maxRefType(refType) { } + void SetOverlay() { m_Overlay = true; } ImageState InitialState() const; void InitialState(ImageState &result) const; ImageState CommandBufferInitialState() const; diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index db7b0fa8e..c67ce8730 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -1164,6 +1164,7 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(SerialiserType &ser, VkCommandB { ResourceId id = it->first; ImageState &endState = it->second; + endState.SetOverlay(); LockedConstImageStateRef current = FindConstImageState(id); if(!current) {