From 3e9999bd866fac71c72e6b484a9836c87c328a08 Mon Sep 17 00:00:00 2001 From: sergeyv Date: Thu, 19 Jan 2017 15:37:02 -0800 Subject: Explicitly destroy Layer in DeferredLayerUpdater on destroyHardwareResources() Change-Id: I0987104eabda9a2a302b9e765213aad48f93aea4 Test: refactoring CL. Existing tests still pass bug:33753499 --- libs/hwui/DeferredLayerUpdater.cpp | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) (limited to 'libs/hwui/DeferredLayerUpdater.cpp') diff --git a/libs/hwui/DeferredLayerUpdater.cpp b/libs/hwui/DeferredLayerUpdater.cpp index 0ae50e96fc39..ee7764302c38 100644 --- a/libs/hwui/DeferredLayerUpdater.cpp +++ b/libs/hwui/DeferredLayerUpdater.cpp @@ -17,6 +17,7 @@ #include "GlLayer.h" #include "VkLayer.h" +#include "renderstate/RenderState.h" #include "renderthread/EglManager.h" #include "renderthread/RenderTask.h" #include "utils/PaintUtils.h" @@ -24,25 +25,32 @@ namespace android { namespace uirenderer { -DeferredLayerUpdater::DeferredLayerUpdater(Layer* layer) - : mSurfaceTexture(nullptr) +DeferredLayerUpdater::DeferredLayerUpdater(RenderState& renderState, CreateLayerFn createLayerFn, + Layer::Api layerApi) + : mRenderState(renderState) + , mBlend(false) + , mSurfaceTexture(nullptr) , mTransform(nullptr) , mNeedsGLContextAttach(false) , mUpdateTexImage(false) - , mLayer(layer) { - mWidth = mLayer->getWidth(); - mHeight = mLayer->getHeight(); - mBlend = mLayer->isBlend(); - mColorFilter = SkSafeRef(mLayer->getColorFilter()); - mAlpha = mLayer->getAlpha(); - mMode = mLayer->getMode(); + , mLayer(nullptr) + , mLayerApi(layerApi) + , mCreateLayerFn(createLayerFn) { + renderState.registerDeferredLayerUpdater(this); } DeferredLayerUpdater::~DeferredLayerUpdater() { SkSafeUnref(mColorFilter); setTransform(nullptr); - mLayer->postDecStrong(); - mLayer = nullptr; + mRenderState.unregisterDeferredLayerUpdater(this); + destroyLayer(); +} + +void DeferredLayerUpdater::destroyLayer() { + if (mLayer) { + mLayer->postDecStrong(); + mLayer = nullptr; + } } void DeferredLayerUpdater::setPaint(const SkPaint* paint) { @@ -53,6 +61,10 @@ void DeferredLayerUpdater::setPaint(const SkPaint* paint) { } void DeferredLayerUpdater::apply() { + if (!mLayer) { + mLayer = mCreateLayerFn(mRenderState, mWidth, mHeight, mColorFilter, mAlpha, mMode, mBlend); + } + mLayer->setColorFilter(mColorFilter); mLayer->setAlpha(mAlpha, mMode); -- cgit v1.2.3-59-g8ed1b