From 0390077c517d9643d21e3d23465cb89de982233d Mon Sep 17 00:00:00 2001 From: chaviw Date: Tue, 18 Aug 2020 12:34:51 -0700 Subject: Run screen capture requests asynchronously After posting the screenshot request to the main thread, don't wait for the results and instead just return immediately. The results from the screenshot will be sent through the requested ScreenCaptureListener In the current change, SurfaceComposerClient still waits for the result before returning so the JNI callers still get the screenshot synchronously. The call will become asynchronous in native in a later change. Test: SurfaceFlinger_test Test: adb shell screencap Test: power + volume down screenshot Test: Recents screenshots Change-Id: I5e352d6920b9298a0a376354f977f2ef7456841b --- services/surfaceflinger/RegionSamplingThread.cpp | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'services/surfaceflinger/RegionSamplingThread.cpp') diff --git a/services/surfaceflinger/RegionSamplingThread.cpp b/services/surfaceflinger/RegionSamplingThread.cpp index 6ba1942e2b..a2fc6925b8 100644 --- a/services/surfaceflinger/RegionSamplingThread.cpp +++ b/services/surfaceflinger/RegionSamplingThread.cpp @@ -446,9 +446,26 @@ void RegionSamplingThread::captureSample() { PIXEL_FORMAT_RGBA_8888, 1, usage, "RegionSamplingThread"); } - ScreenCaptureResults captureResults; + class SyncScreenCaptureListener : public BnScreenCaptureListener { + public: + status_t onScreenCaptureComplete(const ScreenCaptureResults& captureResults) override { + resultsPromise.set_value(captureResults); + return NO_ERROR; + } + + ScreenCaptureResults waitForResults() { + std::future resultsFuture = resultsPromise.get_future(); + return resultsFuture.get(); + } + + private: + std::promise resultsPromise; + }; + + const sp captureListener = new SyncScreenCaptureListener(); mFlinger.captureScreenCommon(std::move(renderAreaFuture), traverseLayers, buffer, - true /* regionSampling */, captureResults); + true /* regionSampling */, captureListener); + ScreenCaptureResults captureResults = captureListener->waitForResults(); std::vector activeDescriptors; for (const auto& descriptor : descriptors) { -- cgit v1.2.3-59-g8ed1b