diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index f207b35d1..d77b4a5c4 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -853,6 +853,29 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, if(GetResourceManager()->HasCurrentResource(*it)) GetResourceManager()->MarkDirtyResource(*it); } + + // with EXT_descriptor_indexing a binding might have been updated after + // vkCmdBindDescriptorSets, so we need to track dirtied here at the last second. + for(auto it = record->bakedCommands->cmdInfo->boundDescSets.begin(); + it != record->bakedCommands->cmdInfo->boundDescSets.end(); ++it) + { + VkResourceRecord *setrecord = GetRecord(*it); + + SCOPED_LOCK(setrecord->descInfo->refLock); + + const std::map> &frameRefs = + setrecord->descInfo->bindFrameRefs; + + for(auto refit = frameRefs.begin(); refit != frameRefs.end(); ++refit) + { + if(refit->second.second == eFrameRef_PartialWrite || + refit->second.second == eFrameRef_ReadBeforeWrite) + { + if(GetResourceManager()->HasCurrentResource(refit->first)) + GetResourceManager()->MarkDirtyResource(refit->first); + } + } + } } }