summaryrefslogtreecommitdiffstats
path: root/libs/hwui/DeferredLayerUpdater.cpp
diff options
context:
space:
mode:
authorJohn Reck <jreck@google.com>2014-10-03 22:22:51 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-10-03 22:22:52 +0000
commitd988a45d60cd2ff05e41a44c78cb09d307bd90cb (patch)
tree0efba036427ebcc08012e2e762341c9041f08960 /libs/hwui/DeferredLayerUpdater.cpp
parenta80aba70728c2843df94474dbd7829dadb77855f (diff)
parent749906b468912dab7bf69a86e852deac3e80b0cc (diff)
downloadframeworks_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.cpp41
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();
}