From 52967ad291d64fd13a9c0bc291e1f8b439123c2c Mon Sep 17 00:00:00 2001 From: thisisjimmyfb <58957694+thisisjimmyfb@users.noreply.github.com> Date: Mon, 1 Jun 2020 11:58:56 -0700 Subject: [PATCH] Eliminated MarkDirtyWithWriteReference because it is interfering with the reference tracking for skipping cleared or don't care renderpasses --- renderdoc/driver/vulkan/vk_manager.cpp | 8 +++++ renderdoc/driver/vulkan/vk_manager.h | 6 ---- renderdoc/driver/vulkan/vk_resources.cpp | 4 ++- .../driver/vulkan/wrappers/vk_queue_funcs.cpp | 6 ++-- .../vulkan/wrappers/vk_resource_funcs.cpp | 35 ++++++++++++------- 5 files changed, 37 insertions(+), 22 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_manager.cpp b/renderdoc/driver/vulkan/vk_manager.cpp index 94ffa3079..3780896aa 100644 --- a/renderdoc/driver/vulkan/vk_manager.cpp +++ b/renderdoc/driver/vulkan/vk_manager.cpp @@ -853,6 +853,14 @@ void VulkanResourceManager::MarkMemoryFrameReferenced(ResourceId mem, VkDeviceSi SCOPED_LOCK(m_Lock); FrameRefType maxRef = MarkMemoryReferenced(m_MemFrameRefs, mem, offset, size, refType); + if(maxRef == eFrameRef_CompleteWrite) + { + // check and make sure this is really a CompleteWrite + VkResourceRecord *record = GetResourceRecord(mem); + // if we are not writing the entire memory, degrade it to a partial write + if(offset != 0 || size != record->Length) + maxRef = eFrameRef_PartialWrite; + } MarkResourceFrameReferenced(mem, maxRef, ComposeFrameRefsDisjoint); } diff --git a/renderdoc/driver/vulkan/vk_manager.h b/renderdoc/driver/vulkan/vk_manager.h index e63f741e3..177e3eaf5 100644 --- a/renderdoc/driver/vulkan/vk_manager.h +++ b/renderdoc/driver/vulkan/vk_manager.h @@ -455,12 +455,6 @@ public: bool IsResourceTrackedForPersistency(WrappedVkRes *const &res); - void MarkDirtyWithWriteReference(ResourceId id) - { - MarkResourceFrameReferenced(id, eFrameRef_ReadBeforeWrite); - MarkDirtyResource(id); - } - private: bool ResourceTypeRelease(WrappedVkRes *res); diff --git a/renderdoc/driver/vulkan/vk_resources.cpp b/renderdoc/driver/vulkan/vk_resources.cpp index 6065dfd4e..de8db1df6 100644 --- a/renderdoc/driver/vulkan/vk_resources.cpp +++ b/renderdoc/driver/vulkan/vk_resources.cpp @@ -3523,7 +3523,9 @@ bool FramebufferInfo::AttachmentFullyReferenced(size_t attachmentIndex, const Re } // if view doesn't reference the entire image if(att->viewRange.baseArrayLayer != 0 || - att->viewRange.layerCount() != (uint32_t)att->resInfo->imageInfo.layerCount) + att->viewRange.layerCount() != (uint32_t)att->resInfo->imageInfo.layerCount || + att->viewRange.baseMipLevel != 0 || + att->viewRange.levelCount() != (uint32_t)att->resInfo->imageInfo.levelCount) { return false; } diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index 4a95103e7..704a922e2 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -910,7 +910,7 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, it != record->bakedCommands->cmdInfo->dirtied.end(); ++it) { if(GetResourceManager()->HasCurrentResource(*it)) - GetResourceManager()->MarkDirtyWithWriteReference(*it); + GetResourceManager()->MarkDirtyResource(*it); } // with EXT_descriptor_indexing a binding might have been updated after @@ -931,7 +931,7 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, refit->second.second == eFrameRef_ReadBeforeWrite) { if(GetResourceManager()->HasCurrentResource(refit->first)) - GetResourceManager()->MarkDirtyWithWriteReference(refit->first); + GetResourceManager()->MarkDirtyResource(refit->first); } } } @@ -1119,7 +1119,7 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, state.mapFlushed = false; } - GetResourceManager()->MarkDirtyWithWriteReference(record->GetResourceID()); + GetResourceManager()->MarkDirtyResource(record->GetResourceID()); } else { diff --git a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp index 26da51b81..b94274ed4 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_resource_funcs.cpp @@ -704,7 +704,10 @@ void WrappedVulkan::vkUnmapMemory(VkDevice device, VkDeviceMemory mem) capframe = IsActiveCapturing(m_State); if(!capframe) - GetResourceManager()->MarkDirtyWithWriteReference(id); + { + GetResourceManager()->MarkResourceFrameReferenced(id, eFrameRef_PartialWrite); + GetResourceManager()->MarkDirtyResource(id); + } } SCOPED_LOCK(state.mrLock); @@ -861,8 +864,9 @@ VkResult WrappedVulkan::vkFlushMappedMemoryRanges(VkDevice device, uint32_t memR } ResourceId memid = GetResID(pMemRanges[i].memory); + VkResourceRecord *record = GetRecord(pMemRanges[i].memory); - MemMapState *state = GetRecord(pMemRanges[i].memory)->memMapState; + MemMapState *state = record->memMapState; state->mapFlushed = true; if(state->mappedPtr == NULL) @@ -880,12 +884,16 @@ VkResult WrappedVulkan::vkFlushMappedMemoryRanges(VkDevice device, uint32_t memR if(size == VK_WHOLE_SIZE) size = state->mapOffset + state->mapSize - offs; - GetResourceManager()->MarkMemoryFrameReferenced(GetResID(pMemRanges[i].memory), offs, size, - eFrameRef_CompleteWrite); + GetResourceManager()->MarkMemoryFrameReferenced(memid, offs, size, eFrameRef_CompleteWrite); } else { - GetResourceManager()->MarkDirtyWithWriteReference(memid); + FrameRefType refType = eFrameRef_PartialWrite; + if(pMemRanges[i].offset == 0 && pMemRanges[i].size >= record->Length) + refType = eFrameRef_CompleteWrite; + + GetResourceManager()->MarkResourceFrameReferenced(memid, refType); + GetResourceManager()->MarkDirtyResource(memid); } } } @@ -989,13 +997,15 @@ VkResult WrappedVulkan::vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkD chunk = scope.Get(); } + ResourceId id = GetResID(memory); + // memory object bindings are immutable and must happen before creation or use, // so this can always go into the record, even if a resource is created and bound // to memory mid-frame record->AddChunk(chunk); record->AddParent(GetRecord(memory)); - record->baseResource = GetResID(memory); + record->baseResource = id; record->memOffset = memoryOffset; // if the buffer was force-referenced, do the same with the memory @@ -1005,11 +1015,11 @@ VkResult WrappedVulkan::vkBindBufferMemory(VkDevice device, VkBuffer buffer, VkD // read-before-write referenced GetResourceManager()->MarkResourceFrameReferenced(record->GetResourceID(), eFrameRef_ReadBeforeWrite); - GetResourceManager()->MarkMemoryFrameReferenced(GetResID(memory), memoryOffset, - record->memSize, eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkMemoryFrameReferenced(id, memoryOffset, record->memSize, + eFrameRef_ReadBeforeWrite); // the memory is immediately dirty because we have no way of tracking writes to it - GetResourceManager()->MarkDirtyWithWriteReference(GetResID(memory)); + GetResourceManager()->MarkDirtyResource(id); } } @@ -1314,7 +1324,7 @@ VkResult WrappedVulkan::vkCreateBuffer(VkDevice device, const VkBufferCreateInfo // buffers are always bound opaquely and in arbitrary divisions, sparse residency // only means not all the buffer needs to be bound, which is not that interesting for // our purposes. We just need to make sure sparse buffers are dirty. - GetResourceManager()->MarkDirtyWithWriteReference(id); + GetResourceManager()->MarkDirtyResource(id); } if(isSparse || isExternal) @@ -1793,7 +1803,8 @@ VkResult WrappedVulkan::vkCreateImage(VkDevice device, const VkImageCreateInfo * // not be valid to map from/into if the image isn't in GENERAL layout). if(isSparse || isExternal || isLinear) { - GetResourceManager()->MarkDirtyWithWriteReference(id); + GetResourceManager()->MarkResourceFrameReferenced(id, eFrameRef_ReadBeforeWrite); + GetResourceManager()->MarkDirtyResource(id); // for external images, try creating a non-external version and take the worst case of // memory requirements, in case the non-external one (as we will replay it) needs more @@ -2129,7 +2140,7 @@ VkResult WrappedVulkan::vkBindBufferMemory2(VkDevice device, uint32_t bindInfoCo eFrameRef_ReadBeforeWrite); // the memory is immediately dirty because we have no way of tracking writes to it - GetResourceManager()->MarkDirtyWithWriteReference(GetResID(pBindInfos[i].memory)); + GetResourceManager()->MarkDirtyResource(GetResID(pBindInfos[i].memory)); } } }