From 99599940f68158aeef735d8763980d0dbd397b51 Mon Sep 17 00:00:00 2001 From: Ady Abraham Date: Wed, 27 Jan 2021 20:27:23 -0800 Subject: SurfaceFlinger: move sync_wait for screen capture to client Free up time from the SF's main thread by moving the fence waiting to the client. Test: Observe systrace of region sample thread Test: adb shell screencap Test: Recents takes the screenshot Test: Rotate device Test: Volume + power down for screenshot Bug: 178649983 Change-Id: I0a4991c013375b1f354e0728a06ca30a835b0422 --- services/surfaceflinger/SurfaceFlinger.cpp | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) (limited to 'services/surfaceflinger/SurfaceFlinger.cpp') diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 4225e92c60..27df232472 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -5851,23 +5851,18 @@ status_t SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture, if (!renderArea) { ALOGW("Skipping screen capture because of invalid render area."); captureResults.result = NO_MEMORY; - captureListener->onScreenCaptureComplete(captureResults); + captureListener->onScreenCaptureCompleted(captureResults); return; } status_t result = NO_ERROR; - int syncFd = -1; renderArea->render([&] { - result = renderScreenImplLocked(*renderArea, traverseLayers, buffer, forSystem, &syncFd, + result = renderScreenImplLocked(*renderArea, traverseLayers, buffer, forSystem, regionSampling, captureResults); }); - if (result == NO_ERROR) { - sync_wait(syncFd, -1); - close(syncFd); - } captureResults.result = result; - captureListener->onScreenCaptureComplete(captureResults); + captureListener->onScreenCaptureCompleted(captureResults); })); return NO_ERROR; @@ -5876,7 +5871,7 @@ status_t SurfaceFlinger::captureScreenCommon(RenderAreaFuture renderAreaFuture, status_t SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, const sp& buffer, bool forSystem, - int* outSyncFd, bool regionSampling, + bool regionSampling, ScreenCaptureResults& captureResults) { ATRACE_CALL(); @@ -5985,14 +5980,14 @@ status_t SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea, getRenderEngine().drawLayers(clientCompositionDisplay, clientCompositionLayerPointers, buffer, /*useFramebufferCache=*/false, std::move(bufferFence), &drawFence); - *outSyncFd = drawFence.release(); - - if (*outSyncFd >= 0) { - sp releaseFence = new Fence(dup(*outSyncFd)); + if (drawFence >= 0) { + sp releaseFence = new Fence(dup(drawFence)); for (auto* layer : renderedLayers) { layer->onLayerDisplayed(releaseFence); } } + + captureResults.fence = new Fence(drawFence.release()); // Always switch back to unprotected context. getRenderEngine().useProtectedContext(false); -- cgit v1.2.3-59-g8ed1b