summaryrefslogtreecommitdiff
path: root/services/surfaceflinger/RegionSamplingThread.cpp
diff options
context:
space:
mode:
author chaviw <chaviw@google.com> 2020-08-18 12:34:51 -0700
committer chaviw <chaviw@google.com> 2020-09-01 11:37:38 -0700
commit0390077c517d9643d21e3d23465cb89de982233d (patch)
treeb98fb42326c8b578c786cadac6cb5210a2f6bc9e /services/surfaceflinger/RegionSamplingThread.cpp
parenta52ade19d81810937fac4b86d99f9edc843c1194 (diff)
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
Diffstat (limited to 'services/surfaceflinger/RegionSamplingThread.cpp')
-rw-r--r--services/surfaceflinger/RegionSamplingThread.cpp21
1 files changed, 19 insertions, 2 deletions
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<ScreenCaptureResults> resultsFuture = resultsPromise.get_future();
+ return resultsFuture.get();
+ }
+
+ private:
+ std::promise<ScreenCaptureResults> resultsPromise;
+ };
+
+ const sp<SyncScreenCaptureListener> captureListener = new SyncScreenCaptureListener();
mFlinger.captureScreenCommon(std::move(renderAreaFuture), traverseLayers, buffer,
- true /* regionSampling */, captureResults);
+ true /* regionSampling */, captureListener);
+ ScreenCaptureResults captureResults = captureListener->waitForResults();
std::vector<Descriptor> activeDescriptors;
for (const auto& descriptor : descriptors) {