diff options
| author | 2017-11-17 16:32:46 +0000 | |
|---|---|---|
| committer | 2017-11-17 16:32:46 +0000 | |
| commit | 91601ac498b70af52ad262002aef8bd903acc24a (patch) | |
| tree | 4adbb1974f7bd92f1a4fe0c1547d593bedec8b8c /services/surfaceflinger | |
| parent | 1813302b7eb1d616de0b896c196756dff5af7e12 (diff) | |
| parent | 3d91a35182cb15675e4fda87ffcab529ae4c3fd3 (diff) | |
Merge "surfaceflinger: fix fencing when composition mode switches" am: 42ddbb44ac am: 4256a72959
am: 3d91a35182
Change-Id: I3ffbf8ba6f224cdb8c4d6d5a36ad40a1860dfad4
Diffstat (limited to 'services/surfaceflinger')
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 5e1de75e54..50ed8f701a 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2037,13 +2037,22 @@ void SurfaceFlinger::postFramebuffer() displayDevice->onSwapBuffersCompleted(); displayDevice->makeCurrent(mEGLDisplay, mEGLContext); for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) { - sp<Fence> releaseFence = Fence::NO_FENCE; + // The layer buffer from the previous frame (if any) is released + // by HWC only when the release fence from this frame (if any) is + // signaled. Always get the release fence from HWC first. + auto hwcLayer = layer->getHwcLayer(hwcId); + sp<Fence> releaseFence = mHwc->getLayerReleaseFence(hwcId, hwcLayer); + + // If the layer was client composited in the previous frame, we + // need to merge with the previous client target acquire fence. + // Since we do not track that, always merge with the current + // client target acquire fence when it is available, even though + // this is suboptimal. if (layer->getCompositionType(hwcId) == HWC2::Composition::Client) { - releaseFence = displayDevice->getClientTargetAcquireFence(); - } else { - auto hwcLayer = layer->getHwcLayer(hwcId); - releaseFence = mHwc->getLayerReleaseFence(hwcId, hwcLayer); + releaseFence = Fence::merge("LayerRelease", releaseFence, + displayDevice->getClientTargetAcquireFence()); } + layer->onLayerDisplayed(releaseFence); } if (hwcId >= 0) { |