diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index 1546808e2..497ef77b3 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -933,11 +933,8 @@ void DescriptorSetBindingElement::AddBindRefs(VkResourceRecord *record, FrameRef } if(imageInfo.imageView != VK_NULL_HANDLE) { - record->AddBindFrameRef(GetResID(imageInfo.imageView), eFrameRef_Read, - GetRecord(imageInfo.imageView)->resInfo != NULL); - record->AddBindFrameRef(GetRecord(imageInfo.imageView)->baseResource, ref); - if(GetRecord(imageInfo.imageView)->baseResourceMem != ResourceId()) - record->AddBindFrameRef(GetRecord(imageInfo.imageView)->baseResourceMem, eFrameRef_Read); + VkResourceRecord *view = GetRecord(imageInfo.imageView); + record->AddImgFrameRef(view, ref); } if(imageInfo.sampler != VK_NULL_HANDLE) { diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index cc8b7105b..acc45663f 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -1346,4 +1346,4 @@ DECLARE_REFLECTION_ENUM(VkVertexInputRate); // win32 only enums #if ENABLED(RDOC_WIN32) DECLARE_REFLECTION_ENUM(VkFullScreenExclusiveEXT); -#endif \ No newline at end of file +#endif diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 644718771..2839911e7 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -1016,6 +1016,7 @@ struct DescriptorSetData static const uint32_t SPARSE_REF_BIT = 0x80000000; std::map > bindFrameRefs; std::map bindMemRefs; + std::map bindImgRefs; }; struct PipelineLayoutData @@ -1410,6 +1411,39 @@ public: } } + void AddImgFrameRef(VkResourceRecord *view, FrameRefType refType) + { + AddBindFrameRef(view->GetResourceID(), eFrameRef_Read, + view->resInfo && view->resInfo->IsSparse()); + if(view->baseResourceMem != ResourceId()) + AddBindFrameRef(view->baseResourceMem, eFrameRef_Read, false); + + rdcpair &p = descInfo->bindFrameRefs[view->baseResource]; + if((p.first & ~DescriptorSetData::SPARSE_REF_BIT) == 0) + { + descInfo->bindImgRefs.erase(view->baseResource); + p.first = 1; + p.second = eFrameRef_None; + } + else + { + p.first++; + } + + ImageRange imgRange; + imgRange.aspectMask = view->viewRange.aspectMask; + imgRange.baseMipLevel = view->viewRange.baseMipLevel; + imgRange.levelCount = view->viewRange.levelCount; + imgRange.baseArrayLayer = view->viewRange.baseArrayLayer; + imgRange.layerCount = view->viewRange.layerCount; + imgRange.viewType = view->viewRange.viewType(); + + FrameRefType maxRef = MarkImageReferenced(descInfo->bindImgRefs, view->baseResource, + view->resInfo->imageInfo, imgRange, refType); + + p.second = std::max(p.second, maxRef); + } + void AddMemFrameRef(ResourceId mem, VkDeviceSize offset, VkDeviceSize size, FrameRefType refType) { if(mem == ResourceId()) diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index 3aec1416e..cf2e3ea88 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -864,6 +864,7 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, GetResourceManager()->MarkSparseMapReferenced(sparserecord->resInfo); } } + GetResourceManager()->MergeReferencedImages(setrecord->descInfo->bindImgRefs); GetResourceManager()->MergeReferencedMemory(setrecord->descInfo->bindMemRefs); }