Loading services/surfaceflinger/SurfaceFlinger.cpp +14 −5 Original line number Original line Diff line number Diff line Loading @@ -2037,13 +2037,22 @@ void SurfaceFlinger::postFramebuffer() displayDevice->onSwapBuffersCompleted(); displayDevice->onSwapBuffersCompleted(); displayDevice->makeCurrent(mEGLDisplay, mEGLContext); displayDevice->makeCurrent(mEGLDisplay, mEGLContext); for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) { for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) { sp<Fence> releaseFence = Fence::NO_FENCE; // The layer buffer from the previous frame (if any) is released if (layer->getCompositionType(hwcId) == HWC2::Composition::Client) { // by HWC only when the release fence from this frame (if any) is releaseFence = displayDevice->getClientTargetAcquireFence(); // signaled. Always get the release fence from HWC first. } else { auto hwcLayer = layer->getHwcLayer(hwcId); auto hwcLayer = layer->getHwcLayer(hwcId); releaseFence = mHwc->getLayerReleaseFence(hwcId, hwcLayer); 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 = Fence::merge("LayerRelease", releaseFence, displayDevice->getClientTargetAcquireFence()); } } layer->onLayerDisplayed(releaseFence); layer->onLayerDisplayed(releaseFence); } } if (hwcId >= 0) { if (hwcId >= 0) { Loading Loading
services/surfaceflinger/SurfaceFlinger.cpp +14 −5 Original line number Original line Diff line number Diff line Loading @@ -2037,13 +2037,22 @@ void SurfaceFlinger::postFramebuffer() displayDevice->onSwapBuffersCompleted(); displayDevice->onSwapBuffersCompleted(); displayDevice->makeCurrent(mEGLDisplay, mEGLContext); displayDevice->makeCurrent(mEGLDisplay, mEGLContext); for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) { for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) { sp<Fence> releaseFence = Fence::NO_FENCE; // The layer buffer from the previous frame (if any) is released if (layer->getCompositionType(hwcId) == HWC2::Composition::Client) { // by HWC only when the release fence from this frame (if any) is releaseFence = displayDevice->getClientTargetAcquireFence(); // signaled. Always get the release fence from HWC first. } else { auto hwcLayer = layer->getHwcLayer(hwcId); auto hwcLayer = layer->getHwcLayer(hwcId); releaseFence = mHwc->getLayerReleaseFence(hwcId, hwcLayer); 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 = Fence::merge("LayerRelease", releaseFence, displayDevice->getClientTargetAcquireFence()); } } layer->onLayerDisplayed(releaseFence); layer->onLayerDisplayed(releaseFence); } } if (hwcId >= 0) { if (hwcId >= 0) { Loading