OSDN Git Service

Make sure to sync GPU after deleting memory in trimMemory.
authorGreg Daniel <egdaniel@google.com>
Wed, 17 Apr 2019 16:18:50 +0000 (12:18 -0400)
committerGreg Daniel <egdaniel@google.com>
Mon, 22 Apr 2019 13:43:06 +0000 (13:43 +0000)
On GL some devices may not delete gpu memory immediately after calling
delete and instead will just queue it up. We must call glFinish to
make sure the memory is deleted when we want it.

More importantly Vulkan memory will not be freed until the GPU is done
with all the work. Thus we require an additional flush to make sure the
previous gpu work we submitted has finished and we can delete the
memory.

Test: manual testing on device
Bug: b/130440975
Change-Id: I2a9202dd7d15d97b365120a8caf9e10b4100efc3

libs/hwui/renderthread/CacheManager.cpp

index 7cb241d..1b638c1 100644 (file)
@@ -126,6 +126,10 @@ void CacheManager::trimMemory(TrimMemoryMode mode) {
             SkGraphics::SetFontCacheLimit(mMaxCpuFontCacheBytes);
             break;
     }
+
+    // We must sync the cpu to make sure deletions of resources still queued up on the GPU actually
+    // happen.
+    mGrContext->flush(kSyncCpu_GrFlushFlag, 0, nullptr);
 }
 
 void CacheManager::trimStaleResources() {