diff options
author | John Reck <jreck@google.com> | 2014-06-30 16:20:04 -0700 |
---|---|---|
committer | John Reck <jreck@google.com> | 2014-06-30 16:36:26 -0700 |
commit | f47a594f5250b1914c36423ee6b371f0b8db09d0 (patch) | |
tree | f86289c7b515c2111fde3ce11e7fca384bc2f603 /libs/hwui/renderthread/CanvasContext.cpp | |
parent | dd59aba6c7e142eae14d5f29ea6873a5b9790174 (diff) | |
download | frameworks_base-f47a594f5250b1914c36423ee6b371f0b8db09d0.zip frameworks_base-f47a594f5250b1914c36423ee6b371f0b8db09d0.tar.gz frameworks_base-f47a594f5250b1914c36423ee6b371f0b8db09d0.tar.bz2 |
Fix onTrimMemory for HardwareRenderer
Also fixes detachFunctor possibly drawing after return
Bug: 15189843
Bug: 15990672
Change-Id: I64c48cb674c461a8eeaba407b697e09f72c98ce3
Diffstat (limited to 'libs/hwui/renderthread/CanvasContext.cpp')
-rw-r--r-- | libs/hwui/renderthread/CanvasContext.cpp | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 9c3cf44..524ee62 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -30,6 +30,9 @@ #include "../OpenGLRenderer.h" #include "../Stencil.h" +#define TRIM_MEMORY_COMPLETE 80 +#define TRIM_MEMORY_UI_HIDDEN 20 + namespace android { namespace uirenderer { namespace renderthread { @@ -156,6 +159,10 @@ void CanvasContext::prepareTree(TreeInfo& info) { } } +void CanvasContext::stopDrawing() { + mRenderThread.removeFrameCallback(this); +} + void CanvasContext::notifyFramePending() { ATRACE_CALL(); mRenderThread.pushBackFrameCallback(this); @@ -216,8 +223,6 @@ void CanvasContext::doFrame() { profiler().startFrame(); TreeInfo info(TreeInfo::MODE_RT_ONLY, mRenderThread.renderState()); - info.prepareTextures = false; - prepareTree(info); if (info.out.canDrawThisFrame) { draw(); @@ -241,10 +246,25 @@ bool CanvasContext::copyLayerInto(DeferredLayerUpdater* layer, SkBitmap* bitmap) return LayerRenderer::copyLayer(mRenderThread.renderState(), layer->backingLayer(), bitmap); } -void CanvasContext::flushCaches(Caches::FlushMode flushMode) { +void CanvasContext::destroyHardwareResources() { + stopDrawing(); if (mEglManager.hasEglContext()) { requireGlContext(); - Caches::getInstance().flush(flushMode); + TreeInfo info(TreeInfo::MODE_DESTROY_RESOURCES, mRenderThread.renderState()); + mRootRenderNode->prepareTree(info); + Caches::getInstance().flush(Caches::kFlushMode_Layers); + } +} + +void CanvasContext::trimMemory(RenderThread& thread, int level) { + // No context means nothing to free + if (!thread.eglManager().hasEglContext()) return; + + if (level >= TRIM_MEMORY_COMPLETE) { + Caches::getInstance().flush(Caches::kFlushMode_Full); + thread.eglManager().destroy(); + } else if (level >= TRIM_MEMORY_UI_HIDDEN) { + Caches::getInstance().flush(Caches::kFlushMode_Moderate); } } @@ -264,11 +284,7 @@ Layer* CanvasContext::createTextureLayer() { } void CanvasContext::requireGlContext() { - if (mEglSurface != EGL_NO_SURFACE) { - makeCurrent(); - } else { - mEglManager.usePBufferSurface(); - } + mEglManager.requireGlContext(); } void CanvasContext::setTextureAtlas(RenderThread& thread, |