diff --git a/src/video_core/renderer_vulkan/vk_multi_range_buffer.cpp b/src/video_core/renderer_vulkan/vk_multi_range_buffer.cpp index 8cc3700d78..a03c9174ef 100644 --- a/src/video_core/renderer_vulkan/vk_multi_range_buffer.cpp +++ b/src/video_core/renderer_vulkan/vk_multi_range_buffer.cpp @@ -213,7 +213,8 @@ MultiRangeRef MultiRangeBufferCache::Get(const Device& device, Scheduler& schedu const u64 geometry = HashSources(sources); const u64 content = HashContent(sources); const auto it = entries.find(key); - if (it != entries.end() && it->second.geometry == geometry && it->second.size == total) { + if (it != entries.end() && !it->second.dead && it->second.geometry == geometry && + it->second.size == total) { Entry& entry = it->second; entry.frame = frame_tick; entry.gpu_tick = scheduler.CurrentTick(); @@ -320,11 +321,17 @@ void MultiRangeBufferCache::DropOwner(Scheduler& scheduler, VkBuffer owner) { break; } } - if (owned && RetireEntry(scheduler, entry)) { - it = entries.erase(it); - } else { + if (!owned) { ++it; + continue; } + if (RetireEntry(scheduler, entry)) { + it = entries.erase(it); + continue; + } + entry.dead = true; + entry.owners.clear(); + ++it; } } @@ -346,7 +353,7 @@ void MultiRangeBufferCache::TickFrame(Scheduler& scheduler) { Entry& entry = it->second; const bool expired = frame_tick - entry.frame > FRAMES_TO_LIVE && scheduler.IsFree(entry.gpu_tick); - if (expired && RetireEntry(scheduler, entry)) { + if ((expired || entry.dead) && RetireEntry(scheduler, entry)) { it = entries.erase(it); } else { ++it; diff --git a/src/video_core/renderer_vulkan/vk_multi_range_buffer.h b/src/video_core/renderer_vulkan/vk_multi_range_buffer.h index 8cab81ee31..3022c61894 100644 --- a/src/video_core/renderer_vulkan/vk_multi_range_buffer.h +++ b/src/video_core/renderer_vulkan/vk_multi_range_buffer.h @@ -83,6 +83,7 @@ private: u64 frame{}; u64 gpu_tick{}; bool dirty{true}; + bool dead{}; }; [[nodiscard]] u64 HashSources(std::span sources) const;