Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7e7ed7f7 authored by Mathias Agopian's avatar Mathias Agopian
Browse files

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
parent 55801e41
Loading
Loading
Loading
Loading
+12 −7
Original line number Original line Diff line number Diff line
@@ -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);
        }
        }
    }
    }
}
}