From 8a226d24b8b2fde4c855d0051cb7bfc5b5813c36 Mon Sep 17 00:00:00 2001 From: Chris Craik Date: Mon, 8 Sep 2014 16:40:21 -0700 Subject: [PATCH] Don't track TextureLayer lifecycles in RenderState bug:17208461 They are destroyed via finalizer-enqueued destroy method, so it's not valid to check that they've been destroyed at gl context destruction time. Change-Id: I670f69825547facd5f31d44acb406418881fee00 --- libs/hwui/Layer.cpp | 16 +++++++++++----- libs/hwui/Layer.h | 18 +++++++++--------- libs/hwui/LayerCache.cpp | 2 +- libs/hwui/LayerRenderer.cpp | 3 +-- 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/libs/hwui/Layer.cpp b/libs/hwui/Layer.cpp index 25caae3a9e0c2..91c4aee98d0d3 100644 --- a/libs/hwui/Layer.cpp +++ b/libs/hwui/Layer.cpp @@ -29,15 +29,15 @@ namespace android { namespace uirenderer { -Layer::Layer(RenderState& renderState, const uint32_t layerWidth, const uint32_t layerHeight) +Layer::Layer(Type layerType, RenderState& renderState, const uint32_t layerWidth, const uint32_t layerHeight) : caches(Caches::getInstance()) , renderState(renderState) - , texture(caches) { + , texture(caches) + , type(layerType) { mesh = NULL; meshElementCount = 0; cacheable = true; dirty = false; - textureLayer = false; renderTarget = GL_TEXTURE_2D; texture.width = layerWidth; texture.height = layerHeight; @@ -55,11 +55,17 @@ Layer::Layer(RenderState& renderState, const uint32_t layerWidth, const uint32_t caches.resourceCache.incrementRefcount(this); rendererLightPosDirty = true; wasBuildLayered = false; - renderState.registerLayer(this); + if (!isTextureLayer()) { + // track only non-texture layer lifecycles in renderstate, + // because texture layers are destroyed via finalizer + renderState.registerLayer(this); + } } Layer::~Layer() { - renderState.unregisterLayer(this); + if (!isTextureLayer()) { + renderState.unregisterLayer(this); + } SkSafeUnref(colorFilter); removeFbo(); deleteTexture(); diff --git a/libs/hwui/Layer.h b/libs/hwui/Layer.h index 911b998803349..36a4ed11d2e8d 100644 --- a/libs/hwui/Layer.h +++ b/libs/hwui/Layer.h @@ -54,7 +54,12 @@ class DeferStateStruct; */ class Layer { public: - Layer(RenderState& renderState, const uint32_t layerWidth, const uint32_t layerHeight); + enum Type { + kType_Texture, + kType_DisplayList, + }; + + Layer(Type type, RenderState& renderState, const uint32_t layerWidth, const uint32_t layerHeight); ~Layer(); static uint32_t computeIdealWidth(uint32_t layerWidth); @@ -219,11 +224,7 @@ public: } inline bool isTextureLayer() const { - return textureLayer; - } - - inline void setTextureLayer(bool textureLayer) { - this->textureLayer = textureLayer; + return type == kType_Texture; } inline SkColorFilter* getColorFilter() const { @@ -343,10 +344,9 @@ private: bool cacheable; /** - * When set to true, this layer must be treated as a texture - * layer. + * Denotes whether the layer is a DisplayList, or Texture layer. */ - bool textureLayer; + const Type type; /** * When set to true, this layer is dirty and should be cleared diff --git a/libs/hwui/LayerCache.cpp b/libs/hwui/LayerCache.cpp index efa30ac36a6ee..d49daf61bb8a1 100644 --- a/libs/hwui/LayerCache.cpp +++ b/libs/hwui/LayerCache.cpp @@ -112,7 +112,7 @@ Layer* LayerCache::get(RenderState& renderState, const uint32_t width, const uin } else { LAYER_LOGD("Creating new layer %dx%d", entry.mWidth, entry.mHeight); - layer = new Layer(renderState, entry.mWidth, entry.mHeight); + layer = new Layer(Layer::kType_DisplayList, renderState, entry.mWidth, entry.mHeight); layer->setBlend(true); layer->setEmpty(true); layer->setFbo(0); diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp index e3b0dafc37909..103c843246270 100644 --- a/libs/hwui/LayerRenderer.cpp +++ b/libs/hwui/LayerRenderer.cpp @@ -272,9 +272,8 @@ bool LayerRenderer::resizeLayer(Layer* layer, uint32_t width, uint32_t height) { Layer* LayerRenderer::createTextureLayer(RenderState& renderState) { LAYER_RENDERER_LOGD("Creating new texture layer"); - Layer* layer = new Layer(renderState, 0, 0); + Layer* layer = new Layer(Layer::kType_Texture, renderState, 0, 0); layer->setCacheable(false); - layer->setTextureLayer(true); layer->setEmpty(true); layer->setFbo(0); layer->setAlpha(255, SkXfermode::kSrcOver_Mode);