From 8a1374946a928fcba7495c87ff6adda327fdfb9f Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Tue, 25 Sep 2012 15:49:03 -0700 Subject: Deleting objects on the wrong thread is a silly idea Bug #7195815 Turns out that multi-threading is hard. Change-Id: Ib0b4bd6dc3caea27f7ced22cbb363bb955fe58ab --- libs/hwui/Layer.cpp | 16 ++++++---------- libs/hwui/Layer.h | 2 -- libs/hwui/LayerRenderer.cpp | 8 -------- libs/hwui/LayerRenderer.h | 4 ++-- libs/hwui/ResourceCache.cpp | 6 +++--- 5 files changed, 11 insertions(+), 25 deletions(-) (limited to 'libs') diff --git a/libs/hwui/Layer.cpp b/libs/hwui/Layer.cpp index fb525ee..cd2e571 100644 --- a/libs/hwui/Layer.cpp +++ b/libs/hwui/Layer.cpp @@ -19,6 +19,7 @@ #include #include "Layer.h" +#include "LayerRenderer.h" #include "OpenGLRenderer.h" #include "Caches.h" @@ -46,15 +47,12 @@ Layer::~Layer() { if (mesh) delete mesh; if (meshIndices) delete meshIndices; if (colorFilter) Caches::getInstance().resourceCache.decrementRefcount(colorFilter); - if (fbo) Caches::getInstance().fboCache.put(fbo); - deleteTexture(); -} - -void Layer::freeResourcesLocked() { - if (colorFilter) { - Caches::getInstance().resourceCache.decrementRefcountLocked(colorFilter); - colorFilter = NULL; + if (fbo) { + LayerRenderer::flushLayer(this); + Caches::getInstance().fboCache.put(fbo); + fbo = 0; } + deleteTexture(); } void Layer::setPaint(SkPaint* paint) { @@ -71,7 +69,5 @@ void Layer::setColorFilter(SkiaColorFilter* filter) { } } - - }; // namespace uirenderer }; // namespace android diff --git a/libs/hwui/Layer.h b/libs/hwui/Layer.h index 9b6205d..59c66d7 100644 --- a/libs/hwui/Layer.h +++ b/libs/hwui/Layer.h @@ -48,8 +48,6 @@ struct Layer { Layer(const uint32_t layerWidth, const uint32_t layerHeight); ~Layer(); - void freeResourcesLocked(); - /** * Sets this layer's region to a rectangle. Computes the appropriate * texture coordinates. diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp index 799aea3..c581041 100644 --- a/libs/hwui/LayerRenderer.cpp +++ b/libs/hwui/LayerRenderer.cpp @@ -299,13 +299,6 @@ void LayerRenderer::destroyLayer(Layer* layer) { LAYER_RENDERER_LOGD("Recycling layer, %dx%d fbo = %d", layer->getWidth(), layer->getHeight(), layer->getFbo()); - GLuint fbo = layer->getFbo(); - if (fbo) { - flushLayer(layer); - Caches::getInstance().fboCache.put(fbo); - layer->setFbo(0); - } - if (!Caches::getInstance().layerCache.put(layer)) { LAYER_RENDERER_LOGD(" Destroyed!"); Caches::getInstance().resourceCache.decrementRefcount(layer); @@ -322,7 +315,6 @@ void LayerRenderer::destroyLayer(Layer* layer) { void LayerRenderer::destroyLayerDeferred(Layer* layer) { if (layer) { LAYER_RENDERER_LOGD("Deferring layer destruction, fbo = %d", layer->getFbo()); - Caches::getInstance().deleteLayerDeferred(layer); } } diff --git a/libs/hwui/LayerRenderer.h b/libs/hwui/LayerRenderer.h index 392f863..acedbcc 100644 --- a/libs/hwui/LayerRenderer.h +++ b/libs/hwui/LayerRenderer.h @@ -60,6 +60,8 @@ public: ANDROID_API static void destroyLayerDeferred(Layer* layer); ANDROID_API static bool copyLayer(Layer* layer, SkBitmap* bitmap); + static void flushLayer(Layer* layer); + protected: virtual bool hasLayer(); virtual Region* getRegion(); @@ -69,8 +71,6 @@ protected: private: void generateMesh(); - static void flushLayer(Layer* layer); - Layer* mLayer; }; // class LayerRenderer diff --git a/libs/hwui/ResourceCache.cpp b/libs/hwui/ResourceCache.cpp index 18d8324..39e64bc 100644 --- a/libs/hwui/ResourceCache.cpp +++ b/libs/hwui/ResourceCache.cpp @@ -325,9 +325,9 @@ void ResourceCache::deleteResourceReferenceLocked(void* resource, ResourceRefere } break; case kLayer: { - Layer* layer = (Layer*) resource; - layer->freeResourcesLocked(); - delete layer; + // No need to check for hasInstance, layers only exist + // when we have a Caches instance + Caches::getInstance().deleteLayerDeferred((Layer*) resource); } break; } -- cgit v1.1