diff --git a/renderdoc/driver/vulkan/vk_resources.cpp b/renderdoc/driver/vulkan/vk_resources.cpp index 51cec9dce..72e01abde 100644 --- a/renderdoc/driver/vulkan/vk_resources.cpp +++ b/renderdoc/driver/vulkan/vk_resources.cpp @@ -4178,7 +4178,8 @@ void VkResourceRecord::MarkBufferViewFrameReferenced(VkResourceRecord *bufView, refType); } -void ResourceInfo::Update(uint32_t numBindings, const VkSparseImageMemoryBind *pBindings) +void ResourceInfo::Update(uint32_t numBindings, const VkSparseImageMemoryBind *pBindings, + std::set &memories) { // update texel mappings for(uint32_t i = 0; i < numBindings; i++) @@ -4194,10 +4195,13 @@ void ResourceInfo::Update(uint32_t numBindings, const VkSparseImageMemoryBind *p sub, {(uint32_t)bind.offset.x, (uint32_t)bind.offset.y, (uint32_t)bind.offset.z}, {bind.extent.width, bind.extent.height, bind.extent.depth}, GetResID(bind.memory), bind.memoryOffset, false); + + memories.insert(GetResID(bind.memory)); } } -void ResourceInfo::Update(uint32_t numBindings, const VkSparseMemoryBind *pBindings) +void ResourceInfo::Update(uint32_t numBindings, const VkSparseMemoryBind *pBindings, + std::set &memories) { // update mip tail mappings const bool isBuffer = (imageInfo.extent.width == 0); @@ -4206,6 +4210,8 @@ void ResourceInfo::Update(uint32_t numBindings, const VkSparseMemoryBind *pBindi { const VkSparseMemoryBind &bind = pBindings[i]; + memories.insert(GetResID(bind.memory)); + // don't need to figure out which aspect we're in if we only have one table if(isBuffer || altSparseAspects.empty()) { diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index bea46d4b5..0c3bae02a 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -1004,8 +1004,10 @@ struct ResourceInfo ImageInfo imageInfo; bool IsSparse() const { return sparseTable.getPageByteSize() > 0; } - void Update(uint32_t numBindings, const VkSparseMemoryBind *pBindings); - void Update(uint32_t numBindings, const VkSparseImageMemoryBind *pBindings); + void Update(uint32_t numBindings, const VkSparseMemoryBind *pBindings, + std::set &memories); + void Update(uint32_t numBindings, const VkSparseImageMemoryBind *pBindings, + std::set &memories); }; struct MemRefs diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index 22bb0313e..d4e053e96 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -1875,26 +1875,30 @@ VkResult WrappedVulkan::vkQueueBindSparse(VkQueue queue, uint32_t bindInfoCount, // update our internal page tables if(IsCaptureMode(m_State)) { + std::set memories; for(uint32_t i = 0; i < bindInfoCount; i++) { for(uint32_t buf = 0; buf < pBindInfo[i].bufferBindCount; buf++) { const VkSparseBufferMemoryBindInfo &bind = pBindInfo[i].pBufferBinds[buf]; - GetRecord(bind.buffer)->resInfo->Update(bind.bindCount, bind.pBinds); + GetRecord(bind.buffer)->resInfo->Update(bind.bindCount, bind.pBinds, memories); } for(uint32_t op = 0; op < pBindInfo[i].imageOpaqueBindCount; op++) { const VkSparseImageOpaqueMemoryBindInfo &bind = pBindInfo[i].pImageOpaqueBinds[op]; - GetRecord(bind.image)->resInfo->Update(bind.bindCount, bind.pBinds); + GetRecord(bind.image)->resInfo->Update(bind.bindCount, bind.pBinds, memories); } for(uint32_t op = 0; op < pBindInfo[i].imageBindCount; op++) { const VkSparseImageMemoryBindInfo &bind = pBindInfo[i].pImageBinds[op]; - GetRecord(bind.image)->resInfo->Update(bind.bindCount, bind.pBinds); + GetRecord(bind.image)->resInfo->Update(bind.bindCount, bind.pBinds, memories); } } + + for(ResourceId id : memories) + GetResourceManager()->MarkDirtyResource(id); } return ret;