Skip to content

Commit cefbd14

Browse files
Dave BurkeAndroid (Google) Code Review
authored andcommitted
Merge "Revert "Deleting objects on the wrong thread is a silly idea Bug #7195815"" into jb-mr1-dev
2 parents e8e2b67 + 56257af commit cefbd14

File tree

5 files changed

+25
-11
lines changed

5 files changed

+25
-11
lines changed

libs/hwui/Layer.cpp

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

2121
#include "Layer.h"
22-
#include "LayerRenderer.h"
2322
#include "OpenGLRenderer.h"
2423
#include "Caches.h"
2524

@@ -47,14 +46,17 @@ Layer::~Layer() {
4746
if (mesh) delete mesh;
4847
if (meshIndices) delete meshIndices;
4948
if (colorFilter) Caches::getInstance().resourceCache.decrementRefcount(colorFilter);
50-
if (fbo) {
51-
LayerRenderer::flushLayer(this);
52-
Caches::getInstance().fboCache.put(fbo);
53-
fbo = 0;
54-
}
49+
if (fbo) Caches::getInstance().fboCache.put(fbo);
5550
deleteTexture();
5651
}
5752

53+
void Layer::freeResourcesLocked() {
54+
if (colorFilter) {
55+
Caches::getInstance().resourceCache.decrementRefcountLocked(colorFilter);
56+
colorFilter = NULL;
57+
}
58+
}
59+
5860
void Layer::setPaint(SkPaint* paint) {
5961
OpenGLRenderer::getAlphaAndModeDirect(paint, &alpha, &mode);
6062
}
@@ -69,5 +71,7 @@ void Layer::setColorFilter(SkiaColorFilter* filter) {
6971
}
7072
}
7173

74+
75+
7276
}; // namespace uirenderer
7377
}; // namespace android

libs/hwui/Layer.h

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

51+
void freeResourcesLocked();
52+
5153
/**
5254
* Sets this layer's region to a rectangle. Computes the appropriate
5355
* texture coordinates.

libs/hwui/LayerRenderer.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,13 @@ 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+
302309
if (!Caches::getInstance().layerCache.put(layer)) {
303310
LAYER_RENDERER_LOGD(" Destroyed!");
304311
Caches::getInstance().resourceCache.decrementRefcount(layer);
@@ -315,6 +322,7 @@ void LayerRenderer::destroyLayer(Layer* layer) {
315322
void LayerRenderer::destroyLayerDeferred(Layer* layer) {
316323
if (layer) {
317324
LAYER_RENDERER_LOGD("Deferring layer destruction, fbo = %d", layer->getFbo());
325+
318326
Caches::getInstance().deleteLayerDeferred(layer);
319327
}
320328
}

libs/hwui/LayerRenderer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ 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-
6563
protected:
6664
virtual bool hasLayer();
6765
virtual Region* getRegion();
@@ -71,6 +69,8 @@ class LayerRenderer: public OpenGLRenderer {
7169
private:
7270
void generateMesh();
7371

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-
// No need to check for hasInstance, layers only exist
329-
// when we have a Caches instance
330-
Caches::getInstance().deleteLayerDeferred((Layer*) resource);
328+
Layer* layer = (Layer*) resource;
329+
layer->freeResourcesLocked();
330+
delete layer;
331331
}
332332
break;
333333
}

0 commit comments

Comments
 (0)