Skip to content

Commit 92d4be6

Browse files
authored
Fix framebuffer cache memory leak (#9693)
Once a framebuffer is destroyed, it must be removed from the mapping, and not just marked unused. Same for render passes.
1 parent ad8c188 commit 92d4be6

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

filament/backend/src/vulkan/VulkanFboCache.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -376,21 +376,34 @@ void VulkanFboCache::gc() noexcept {
376376
}
377377
const uint32_t evictTime = mCurrentTime - TIME_BEFORE_EVICTION;
378378

379-
for (FboMap::iterator iter = mFramebufferCache.begin(); iter != mFramebufferCache.end(); ++iter) {
379+
for (FboMap::iterator iter = mFramebufferCache.begin(); iter != mFramebufferCache.end(); ) {
380380
const FboVal fbo = iter->second;
381381
if (fbo.timestamp < evictTime && fbo.handle) {
382382
mRenderPassRefCount[iter->first.renderPass]--;
383383
vkDestroyFramebuffer(mDevice, fbo.handle, VKALLOC);
384384
iter.value().handle = VK_NULL_HANDLE;
385+
386+
// erase(iterator) returns the iterator to the next element.
387+
iter = mFramebufferCache.erase(iter);
388+
} else {
389+
++iter;
385390
}
386391
}
387-
for (auto iter = mRenderPassCache.begin(); iter != mRenderPassCache.end(); ++iter) {
392+
393+
for (RenderPassMap::iterator iter = mRenderPassCache.begin(); iter != mRenderPassCache.end(); ) {
388394
const VkRenderPass handle = iter->second.handle;
389395
if (iter->second.timestamp < evictTime && handle && mRenderPassRefCount[handle] == 0) {
390396
vkDestroyRenderPass(mDevice, handle, VKALLOC);
391397
iter.value().handle = VK_NULL_HANDLE;
398+
399+
// erase(iterator) returns the iterator to the next element.
400+
iter = mRenderPassCache.erase(iter);
401+
mRenderPassRefCount.erase(handle);
402+
} else {
403+
++iter;
392404
}
393405
}
406+
394407
FVK_SYSTRACE_END();
395408
}
396409

filament/backend/src/vulkan/VulkanFboCache.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,8 @@ class VulkanFboCache {
117117
using FboMap = tsl::robin_map<FboKey, FboVal, FboKeyHashFn, FboKeyEqualFn>;
118118
FboMap mFramebufferCache;
119119

120-
tsl::robin_map<RenderPassKey, RenderPassVal, RenderPassHash, RenderPassEq> mRenderPassCache;
120+
using RenderPassMap = tsl::robin_map<RenderPassKey, RenderPassVal, RenderPassHash, RenderPassEq>;
121+
RenderPassMap mRenderPassCache;
121122
tsl::robin_map<VkRenderPass, uint32_t> mRenderPassRefCount;
122123
uint32_t mCurrentTime = 0;
123124
};

0 commit comments

Comments
 (0)