summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2012-09-25 15:49:03 -0700
committerRomain Guy <romainguy@google.com>2012-09-25 15:49:03 -0700
commit8a1374946a928fcba7495c87ff6adda327fdfb9f (patch)
treeab6b1d092aec1b19751e820c3e18a10c21a40759 /libs
parent1ab8a08a9b85aa62045a6a78fd93859382c88b0f (diff)
downloadframeworks_base-8a1374946a928fcba7495c87ff6adda327fdfb9f.zip
frameworks_base-8a1374946a928fcba7495c87ff6adda327fdfb9f.tar.gz
frameworks_base-8a1374946a928fcba7495c87ff6adda327fdfb9f.tar.bz2
Deleting objects on the wrong thread is a silly idea
Bug #7195815 Turns out that multi-threading is hard. Change-Id: Ib0b4bd6dc3caea27f7ced22cbb363bb955fe58ab
Diffstat (limited to 'libs')
-rw-r--r--libs/hwui/Layer.cpp16
-rw-r--r--libs/hwui/Layer.h2
-rw-r--r--libs/hwui/LayerRenderer.cpp8
-rw-r--r--libs/hwui/LayerRenderer.h4
-rw-r--r--libs/hwui/ResourceCache.cpp6
5 files changed, 11 insertions, 25 deletions
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 <utils/Log.h>
#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;
}