Skip to content

Commit 8a13749

Browse files
author
Romain Guy
committed
Deleting objects on the wrong thread is a silly idea
Bug #7195815 Turns out that multi-threading is hard. Change-Id: Ib0b4bd6dc3caea27f7ced22cbb363bb955fe58ab
1 parent 1ab8a08 commit 8a13749

File tree

5 files changed

+11
-25
lines changed

5 files changed

+11
-25
lines changed

libs/hwui/Layer.cpp

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include <utils/Log.h>
2020

2121
#include "Layer.h"
22+
#include "LayerRenderer.h"
2223
#include "OpenGLRenderer.h"
2324
#include "Caches.h"
2425

@@ -46,15 +47,12 @@ Layer::~Layer() {
4647
if (mesh) delete mesh;
4748
if (meshIndices) delete meshIndices;
4849
if (colorFilter) Caches::getInstance().resourceCache.decrementRefcount(colorFilter);
49-
if (fbo) Caches::getInstance().fboCache.put(fbo);
50-
deleteTexture();
51-
}
52-
53-
void Layer::freeResourcesLocked() {
54-
if (colorFilter) {
55-
Caches::getInstance().resourceCache.decrementRefcountLocked(colorFilter);
56-
colorFilter = NULL;
50+
if (fbo) {
51+
LayerRenderer::flushLayer(this);
52+
Caches::getInstance().fboCache.put(fbo);
53+
fbo = 0;
5754
}
55+
deleteTexture();
5856
}
5957

6058
void Layer::setPaint(SkPaint* paint) {
@@ -71,7 +69,5 @@ void Layer::setColorFilter(SkiaColorFilter* filter) {
7169
}
7270
}
7371

74-
75-
7672
}; // namespace uirenderer
7773
}; // namespace android

libs/hwui/Layer.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,6 @@ struct Layer {
4848
Layer(const uint32_t layerWidth, const uint32_t layerHeight);
4949
~Layer();
5050

51-
void freeResourcesLocked();
52-
5351
/**
5452
* Sets this layer's region to a rectangle. Computes the appropriate
5553
* texture coordinates.

libs/hwui/LayerRenderer.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -299,13 +299,6 @@ void LayerRenderer::destroyLayer(Layer* layer) {
299299
LAYER_RENDERER_LOGD("Recycling layer, %dx%d fbo = %d",
300300
layer->getWidth(), layer->getHeight(), layer->getFbo());
301301

302-
GLuint fbo = layer->getFbo();
303-
if (fbo) {
304-
flushLayer(layer);
305-
Caches::getInstance().fboCache.put(fbo);
306-
layer->setFbo(0);
307-
}
308-
309302
if (!Caches::getInstance().layerCache.put(layer)) {
310303
LAYER_RENDERER_LOGD(" Destroyed!");
311304
Caches::getInstance().resourceCache.decrementRefcount(layer);
@@ -322,7 +315,6 @@ void LayerRenderer::destroyLayer(Layer* layer) {
322315
void LayerRenderer::destroyLayerDeferred(Layer* layer) {
323316
if (layer) {
324317
LAYER_RENDERER_LOGD("Deferring layer destruction, fbo = %d", layer->getFbo());
325-
326318
Caches::getInstance().deleteLayerDeferred(layer);
327319
}
328320
}

libs/hwui/LayerRenderer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ class LayerRenderer: public OpenGLRenderer {
6060
ANDROID_API static void destroyLayerDeferred(Layer* layer);
6161
ANDROID_API static bool copyLayer(Layer* layer, SkBitmap* bitmap);
6262

63+
static void flushLayer(Layer* layer);
64+
6365
protected:
6466
virtual bool hasLayer();
6567
virtual Region* getRegion();
@@ -69,8 +71,6 @@ class LayerRenderer: public OpenGLRenderer {
6971
private:
7072
void generateMesh();
7173

72-
static void flushLayer(Layer* layer);
73-
7474
Layer* mLayer;
7575
}; // class LayerRenderer
7676

libs/hwui/ResourceCache.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,9 +325,9 @@ void ResourceCache::deleteResourceReferenceLocked(void* resource, ResourceRefere
325325
}
326326
break;
327327
case kLayer: {
328-
Layer* layer = (Layer*) resource;
329-
layer->freeResourcesLocked();
330-
delete layer;
328+
// No need to check for hasInstance, layers only exist
329+
// when we have a Caches instance
330+
Caches::getInstance().deleteLayerDeferred((Layer*) resource);
331331
}
332332
break;
333333
}

0 commit comments

Comments
 (0)