diff --git a/renderdoc/core/resource_manager.cpp b/renderdoc/core/resource_manager.cpp index 2a03cdf45..fdbedcc8f 100644 --- a/renderdoc/core/resource_manager.cpp +++ b/renderdoc/core/resource_manager.cpp @@ -117,12 +117,6 @@ FrameRefType ComposeFrameRefsUnordered(FrameRefType first, FrameRefType second) RDCASSERT(eFrameRef_Minimum <= first && first <= eFrameRef_Maximum); RDCASSERT(eFrameRef_Minimum <= second && second <= eFrameRef_Maximum); - // The order of the reference types is irrelevant, so put them in a - // consistent order (`first >= second`) to reduce the number of cases to - // consider. - if(first < second) - std::swap(first, second); - if(first == eFrameRef_Read && (second == eFrameRef_PartialWrite || second == eFrameRef_CompleteWrite)) // The resource is referenced both read and write/clear; @@ -141,6 +135,11 @@ FrameRefType ComposeFrameRefsUnordered(FrameRefType first, FrameRefType second) return first; } +FrameRefType ComposeFrameRefsDisjoint(FrameRefType x, FrameRefType y) +{ + return RDCMAX(x, y); +} + bool IsDirtyFrameRef(FrameRefType refType) { return (refType != eFrameRef_None && refType != eFrameRef_Read); diff --git a/renderdoc/core/resource_manager.h b/renderdoc/core/resource_manager.h index 738dfe62b..3fa1028f1 100644 --- a/renderdoc/core/resource_manager.h +++ b/renderdoc/core/resource_manager.h @@ -111,6 +111,11 @@ FrameRefType ComposeFrameRefs(FrameRefType first, FrameRefType second); // reset for replay. FrameRefType ComposeFrameRefsUnordered(FrameRefType first, FrameRefType second); +// Compose frame refs for disjoint subresources. +// This is used to compute the overall frame ref for images/memory from the +// frame refs of their subresources. +FrameRefType ComposeFrameRefsDisjoint(FrameRefType x, FrameRefType y); + bool IsDirtyFrameRef(FrameRefType refType); // Captures the possible initialization/reset requirements for resources. diff --git a/renderdoc/driver/vulkan/vk_manager.cpp b/renderdoc/driver/vulkan/vk_manager.cpp index 6ede00524..6b9486d55 100644 --- a/renderdoc/driver/vulkan/vk_manager.cpp +++ b/renderdoc/driver/vulkan/vk_manager.cpp @@ -781,8 +781,7 @@ void VulkanResourceManager::MarkImageFrameReferenced(ResourceId img, const Image const ImageRange &range, FrameRefType refType) { FrameRefType maxRef = MarkImageReferenced(m_ImgFrameRefs, img, imageInfo, range, refType); - MarkResourceFrameReferenced( - img, maxRef, [](FrameRefType x, FrameRefType y) -> FrameRefType { return std::max(x, y); }); + MarkResourceFrameReferenced(img, maxRef, ComposeFrameRefsDisjoint); } void VulkanResourceManager::MarkMemoryFrameReferenced(ResourceId mem, VkDeviceSize offset, @@ -791,8 +790,7 @@ void VulkanResourceManager::MarkMemoryFrameReferenced(ResourceId mem, VkDeviceSi SCOPED_LOCK(m_Lock); FrameRefType maxRef = MarkMemoryReferenced(m_MemFrameRefs, mem, offset, size, refType); - MarkResourceFrameReferenced( - mem, maxRef, [](FrameRefType x, FrameRefType y) -> FrameRefType { return std::max(x, y); }); + MarkResourceFrameReferenced(mem, maxRef, ComposeFrameRefsDisjoint); } void VulkanResourceManager::MergeReferencedImages(std::map &imgRefs) diff --git a/renderdoc/driver/vulkan/vk_resources.cpp b/renderdoc/driver/vulkan/vk_resources.cpp index 0b03c4596..ffbb5729e 100644 --- a/renderdoc/driver/vulkan/vk_resources.cpp +++ b/renderdoc/driver/vulkan/vk_resources.cpp @@ -3114,8 +3114,7 @@ void VkResourceRecord::MarkImageFrameReferenced(VkResourceRecord *img, const Ima // maintain the reference type of the image itself as the maximum reference type of any // subresource - MarkResourceFrameReferenced( - id, maxRef, [](FrameRefType x, FrameRefType y) -> FrameRefType { return std::max(x, y); }); + MarkResourceFrameReferenced(id, maxRef, ComposeFrameRefsDisjoint); } void VkResourceRecord::MarkImageViewFrameReferenced(VkResourceRecord *view, const ImageRange &range, @@ -3148,8 +3147,7 @@ void VkResourceRecord::MarkImageViewFrameReferenced(VkResourceRecord *view, cons // maintain the reference type of the image itself as the maximum reference type of any // subresource - MarkResourceFrameReferenced( - img, maxRef, [](FrameRefType x, FrameRefType y) -> FrameRefType { return std::max(x, y); }); + MarkResourceFrameReferenced(img, maxRef, ComposeFrameRefsDisjoint); } void VkResourceRecord::MarkMemoryFrameReferenced(ResourceId mem, VkDeviceSize offset, @@ -3158,8 +3156,7 @@ void VkResourceRecord::MarkMemoryFrameReferenced(ResourceId mem, VkDeviceSize of if(refType != eFrameRef_Read && refType != eFrameRef_None) cmdInfo->dirtied.insert(mem); FrameRefType maxRef = MarkMemoryReferenced(cmdInfo->memFrameRefs, mem, offset, size, refType); - MarkResourceFrameReferenced( - mem, maxRef, [](FrameRefType x, FrameRefType y) -> FrameRefType { return std::max(x, y); }); + MarkResourceFrameReferenced(mem, maxRef, ComposeFrameRefsDisjoint); } void VkResourceRecord::MarkBufferFrameReferenced(VkResourceRecord *buf, VkDeviceSize offset, diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 394ac03a9..62c55d746 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -1281,7 +1281,7 @@ FrameRefType ImgRefs::Update(ImageRange range, FrameRefType refType, Compose com { int index = (aspectIndex * splitLevelCount + level) * splitLayerCount + layer; rangeRefs[index] = comp(rangeRefs[index], refType); - maxRefType = RDCMAX(maxRefType, rangeRefs[index]); + maxRefType = ComposeFrameRefsDisjoint(maxRefType, rangeRefs[index]); } } } @@ -1310,7 +1310,7 @@ FrameRefType ImgRefs::Merge(const ImgRefs &other, Compose comp) { int index = SubresourceIndex(aspectIndex, level, layer); rangeRefs[index] = comp(rangeRefs[index], other.SubresourceRef(aspectIndex, level, layer)); - maxRefType = RDCMAX(maxRefType, rangeRefs[index]); + maxRefType = ComposeFrameRefsDisjoint(maxRefType, rangeRefs[index]); } } } @@ -1346,7 +1346,7 @@ FrameRefType MemRefs::Update(VkDeviceSize offset, VkDeviceSize size, FrameRefTyp rangeRefs.update(offset, offset + size, refType, [&maxRefType, comp](FrameRefType oldRef, FrameRefType newRef) -> FrameRefType { FrameRefType ref = comp(oldRef, newRef); - maxRefType = std::max(maxRefType, ref); + maxRefType = ComposeFrameRefsDisjoint(maxRefType, ref); return ref; }); return maxRefType; @@ -1359,7 +1359,7 @@ FrameRefType MemRefs::Merge(MemRefs &other, Compose comp) rangeRefs.merge(other.rangeRefs, [&maxRefType, comp](FrameRefType oldRef, FrameRefType newRef) -> FrameRefType { FrameRefType ref = comp(oldRef, newRef); - maxRefType = std::max(maxRefType, ref); + maxRefType = ComposeFrameRefsDisjoint(maxRefType, ref); return ref; }); return maxRefType; @@ -1494,7 +1494,7 @@ public: FrameRefType maxRef = MarkImageReferenced(descInfo->bindImgRefs, view->baseResource, view->resInfo->imageInfo, imgRange, refType); - p.second = std::max(p.second, maxRef); + p.second = ComposeFrameRefsDisjoint(p.second, maxRef); } void AddMemFrameRef(ResourceId mem, VkDeviceSize offset, VkDeviceSize size, FrameRefType refType) @@ -1517,7 +1517,7 @@ public: } FrameRefType maxRef = MarkMemoryReferenced(descInfo->bindMemRefs, mem, offset, size, refType, ComposeFrameRefsUnordered); - p.second = std::max(p.second, maxRef); + p.second = ComposeFrameRefsDisjoint(p.second, maxRef); } void RemoveBindFrameRef(ResourceId id)