diff options
author | John Reck <jreck@google.com> | 2014-10-03 22:22:51 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-10-03 22:22:52 +0000 |
commit | d988a45d60cd2ff05e41a44c78cb09d307bd90cb (patch) | |
tree | 0efba036427ebcc08012e2e762341c9041f08960 /libs/hwui/DeferredLayerUpdater.cpp | |
parent | a80aba70728c2843df94474dbd7829dadb77855f (diff) | |
parent | 749906b468912dab7bf69a86e852deac3e80b0cc (diff) | |
download | frameworks_base-d988a45d60cd2ff05e41a44c78cb09d307bd90cb.zip frameworks_base-d988a45d60cd2ff05e41a44c78cb09d307bd90cb.tar.gz frameworks_base-d988a45d60cd2ff05e41a44c78cb09d307bd90cb.tar.bz2 |
Merge "Cleanup DeferredLayerUpdater" into lmp-dev
Diffstat (limited to 'libs/hwui/DeferredLayerUpdater.cpp')
-rw-r--r-- | libs/hwui/DeferredLayerUpdater.cpp | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/libs/hwui/DeferredLayerUpdater.cpp b/libs/hwui/DeferredLayerUpdater.cpp index 836de45..a6d7e78 100644 --- a/libs/hwui/DeferredLayerUpdater.cpp +++ b/libs/hwui/DeferredLayerUpdater.cpp @@ -18,38 +18,52 @@ #include "OpenGLRenderer.h" #include "LayerRenderer.h" +#include "renderthread/EglManager.h" +#include "renderthread/RenderTask.h" namespace android { namespace uirenderer { -static void defaultLayerDestroyer(Layer* layer) { - Caches::getInstance().resourceCache.decrementRefcount(layer); -} +class DeleteLayerTask : public renderthread::RenderTask { +public: + DeleteLayerTask(renderthread::EglManager& eglManager, Layer* layer) + : mEglManager(eglManager) + , mLayer(layer) + {} + + virtual void run() { + mEglManager.requireGlContext(); + LayerRenderer::destroyLayer(mLayer); + mLayer = 0; + delete this; + } -DeferredLayerUpdater::DeferredLayerUpdater(Layer* layer, LayerDestroyer destroyer) +private: + renderthread::EglManager& mEglManager; + Layer* mLayer; +}; + +DeferredLayerUpdater::DeferredLayerUpdater(renderthread::RenderThread& thread, Layer* layer) : mSurfaceTexture(0) , mTransform(0) , mNeedsGLContextAttach(false) , mUpdateTexImage(false) , mLayer(layer) , mCaches(Caches::getInstance()) - , mDestroyer(destroyer) { + , mRenderThread(thread) { mWidth = mLayer->layer.getWidth(); mHeight = mLayer->layer.getHeight(); mBlend = mLayer->isBlend(); mColorFilter = SkSafeRef(mLayer->getColorFilter()); mAlpha = mLayer->getAlpha(); mMode = mLayer->getMode(); - - if (!mDestroyer) { - mDestroyer = defaultLayerDestroyer; - } } DeferredLayerUpdater::~DeferredLayerUpdater() { SkSafeUnref(mColorFilter); setTransform(0); - mDestroyer(mLayer); + mRenderThread.queue(new DeleteLayerTask(mRenderThread.eglManager(), mLayer)); + mLayer = 0; } void DeferredLayerUpdater::setPaint(const SkPaint* paint) { @@ -121,7 +135,12 @@ void DeferredLayerUpdater::doUpdateTexImage() { void DeferredLayerUpdater::detachSurfaceTexture() { if (mSurfaceTexture.get()) { - mSurfaceTexture->detachFromContext(); + mRenderThread.eglManager().requireGlContext(); + status_t err = mSurfaceTexture->detachFromContext(); + if (err != 0) { + // TODO: Elevate to fatal exception + ALOGE("Failed to detach SurfaceTexture from context %d", err); + } mSurfaceTexture = 0; mLayer->clearTexture(); } |