diff options
author | Chris Craik <ccraik@google.com> | 2014-09-08 16:40:21 -0700 |
---|---|---|
committer | Chris Craik <ccraik@google.com> | 2014-09-08 16:44:47 -0700 |
commit | 8a226d24b8b2fde4c855d0051cb7bfc5b5813c36 (patch) | |
tree | dff0340b91172e35a5e2bff67e013e2fd27623ca /libs/hwui | |
parent | 95e71085e2d6f9482679a2a5c34d3d7fbc7d39c6 (diff) | |
download | frameworks_base-8a226d24b8b2fde4c855d0051cb7bfc5b5813c36.zip frameworks_base-8a226d24b8b2fde4c855d0051cb7bfc5b5813c36.tar.gz frameworks_base-8a226d24b8b2fde4c855d0051cb7bfc5b5813c36.tar.bz2 |
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
Diffstat (limited to 'libs/hwui')
-rw-r--r-- | libs/hwui/Layer.cpp | 16 | ||||
-rw-r--r-- | libs/hwui/Layer.h | 18 | ||||
-rw-r--r-- | libs/hwui/LayerCache.cpp | 2 | ||||
-rw-r--r-- | 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 25caae3..91c4aee 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 911b99880..36a4ed1 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 efa30ac..d49daf6 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 e3b0daf..103c843 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); |