Skip to content

Commit 5c88fc7

Browse files
author
Romain Guy
committed
Prevent crash when flushing the layers cache
Bug #6258973 When flushing the layer caches we would attempt to delete the FBOs associate with layers in the cache. The FBO property was however not always properly cleared when recycling layers. Change-Id: I7dedfe391d659a0849f1e1d84df17313b2c6e2b2
1 parent 6db53c3 commit 5c88fc7

File tree

3 files changed

+12
-2
lines changed

3 files changed

+12
-2
lines changed

libs/hwui/LayerCache.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,14 @@ void LayerCache::setMaxSize(uint32_t maxSize) {
6969

7070
void LayerCache::deleteLayer(Layer* layer) {
7171
if (layer) {
72-
LAYER_LOGD("Destroying layer %dx%d", layer->getWidth(), layer->getHeight());
72+
GLuint fbo = layer->getFbo();
73+
LAYER_LOGD("Destroying layer %dx%d, fbo %d", layer->getWidth(), layer->getHeight(), fbo);
74+
7375
mSize -= layer->getWidth() * layer->getHeight() * 4;
74-
layer->deleteFbo();
76+
77+
if (fbo) Caches::getInstance().fboCache.put(fbo);
7578
layer->deleteTexture();
79+
7680
delete layer;
7781
}
7882
}
@@ -174,6 +178,10 @@ bool LayerCache::put(Layer* layer) {
174178
victim->layer.getHeight());
175179
}
176180

181+
layer->deferredUpdateScheduled = false;
182+
layer->renderer = NULL;
183+
layer->displayList = NULL;
184+
177185
LayerEntry entry(layer);
178186

179187
mCache.add(entry);

libs/hwui/LayerRenderer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ void LayerRenderer::destroyLayer(Layer* layer) {
309309
if (fbo) {
310310
flushLayer(layer);
311311
Caches::getInstance().fboCache.put(fbo);
312+
layer->setFbo(0);
312313
}
313314

314315
if (!Caches::getInstance().layerCache.put(layer)) {

libs/hwui/OpenGLRenderer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,7 @@ void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) {
641641

642642
// Put the FBO name back in the cache, if it doesn't fit, it will be destroyed
643643
mCaches.fboCache.put(current->fbo);
644+
layer->setFbo(0);
644645
}
645646

646647
dirtyClip();

0 commit comments

Comments
 (0)