the layer list per display could contain non-visible layers
this happened because we didn't check that the visible region was within the bounds of the display. Bug: 7064121 Change-Id: I2e81850a3dc3d1474253520ad7f9e559c26d5a96
This commit is contained in:
parent
55801e41e6
commit
7e7ed7f77a
@ -757,26 +757,31 @@ void SurfaceFlinger::rebuildLayerStacks() {
|
|||||||
const LayerVector& currentLayers(mDrawingState.layersSortedByZ);
|
const LayerVector& currentLayers(mDrawingState.layersSortedByZ);
|
||||||
for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
|
for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
|
||||||
const sp<DisplayDevice>& hw(mDisplays[dpy]);
|
const sp<DisplayDevice>& hw(mDisplays[dpy]);
|
||||||
|
const Transform& tr(hw->getTransform());
|
||||||
|
const Rect bounds(hw->getBounds());
|
||||||
|
|
||||||
Region opaqueRegion;
|
Region opaqueRegion;
|
||||||
Region dirtyRegion;
|
Region dirtyRegion;
|
||||||
computeVisibleRegions(currentLayers,
|
computeVisibleRegions(currentLayers,
|
||||||
hw->getLayerStack(), dirtyRegion, opaqueRegion);
|
hw->getLayerStack(), dirtyRegion, opaqueRegion);
|
||||||
hw->dirtyRegion.orSelf(dirtyRegion);
|
|
||||||
|
|
||||||
Vector< sp<LayerBase> > layersSortedByZ;
|
Vector< sp<LayerBase> > layersSortedByZ;
|
||||||
const size_t count = currentLayers.size();
|
const size_t count = currentLayers.size();
|
||||||
for (size_t i=0 ; i<count ; i++) {
|
for (size_t i=0 ; i<count ; i++) {
|
||||||
const Layer::State& s(currentLayers[i]->drawingState());
|
const sp<LayerBase>& layer(currentLayers[i]);
|
||||||
|
const Layer::State& s(layer->drawingState());
|
||||||
if (s.layerStack == hw->getLayerStack()) {
|
if (s.layerStack == hw->getLayerStack()) {
|
||||||
if (!currentLayers[i]->visibleRegion.isEmpty()) {
|
Region visibleRegion(tr.transform(layer->visibleRegion));
|
||||||
layersSortedByZ.add(currentLayers[i]);
|
visibleRegion.andSelf(bounds);
|
||||||
|
if (!visibleRegion.isEmpty()) {
|
||||||
|
layersSortedByZ.add(layer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
hw->setVisibleLayersSortedByZ(layersSortedByZ);
|
hw->setVisibleLayersSortedByZ(layersSortedByZ);
|
||||||
hw->undefinedRegion.set(hw->getBounds());
|
hw->undefinedRegion.set(bounds);
|
||||||
hw->undefinedRegion.subtractSelf(
|
hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
|
||||||
hw->getTransform().transform(opaqueRegion));
|
hw->dirtyRegion.orSelf(dirtyRegion);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user