diff options
| author | 2019-11-26 19:12:51 +0000 | |
|---|---|---|
| committer | 2019-11-26 19:12:51 +0000 | |
| commit | 27936a638d064cf36dfa85720cb9a819ef23ae4c (patch) | |
| tree | b5c5dee5d60b8d79d1676bbb55055c17fec9d3b3 /services/surfaceflinger/SurfaceFlinger.cpp | |
| parent | b5b8623e91416cb1f10097adf38b5b46fd9f5ded (diff) | |
| parent | c5686802261e26e035889f047cf43016d890181f (diff) | |
Merge "When destroying layer, add children to offscreen layers"
Diffstat (limited to 'services/surfaceflinger/SurfaceFlinger.cpp')
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index bf3b4c9f01..20ffbc7fec 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -3732,9 +3732,6 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& display, int } if (currentMode == HWC_POWER_MODE_OFF) { - // Turn on the display - // TODO: @vhau temp fix only! See b/141111965 - mTransactionCompletedThread.clearAllPending(); getHwComposer().setPowerMode(*displayId, mode); if (display->isPrimary() && mode != HWC_POWER_MODE_DOZE_SUSPEND) { setVsyncEnabledInHWC(*displayId, mHWCVsyncPendingState); @@ -5516,6 +5513,20 @@ void SurfaceFlinger::onLayerFirstRef(Layer* layer) { void SurfaceFlinger::onLayerDestroyed(Layer* layer) { mNumLayers--; + removeFromOffscreenLayers(layer); +} + +// WARNING: ONLY CALL THIS FROM LAYER DTOR +// Here we add children in the current state to offscreen layers and remove the +// layer itself from the offscreen layer list. Since +// this is the dtor, it is safe to access the current state. This keeps us +// from dangling children layers such that they are not reachable from the +// Drawing state nor the offscreen layer list +// See b/141111965 +void SurfaceFlinger::removeFromOffscreenLayers(Layer* layer) { + for (auto& child : layer->getCurrentChildren()) { + mOffscreenLayers.emplace(child.get()); + } mOffscreenLayers.erase(layer); } |