diff options
author | 2021-01-27 20:27:23 -0800 | |
---|---|---|
committer | 2021-01-29 18:03:58 +0000 | |
commit | 99599940f68158aeef735d8763980d0dbd397b51 (patch) | |
tree | b8620b3a33b7d51223a4a22707d1bab2669de793 /libs/gui | |
parent | 31999efbac943af5c43c64a6929d5fe5857c6532 (diff) |
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
Diffstat (limited to 'libs/gui')
-rw-r--r-- | libs/gui/ScreenCaptureResults.cpp | 15 | ||||
-rw-r--r-- | libs/gui/aidl/android/gui/IScreenCaptureListener.aidl | 2 | ||||
-rw-r--r-- | libs/gui/include/gui/ScreenCaptureResults.h | 2 | ||||
-rw-r--r-- | libs/gui/include/gui/SyncScreenCaptureListener.h | 6 |
4 files changed, 22 insertions, 3 deletions
diff --git a/libs/gui/ScreenCaptureResults.cpp b/libs/gui/ScreenCaptureResults.cpp index 2b29487268..f3849bcdcd 100644 --- a/libs/gui/ScreenCaptureResults.cpp +++ b/libs/gui/ScreenCaptureResults.cpp @@ -25,6 +25,14 @@ status_t ScreenCaptureResults::writeToParcel(android::Parcel* parcel) const { } else { SAFE_PARCEL(parcel->writeBool, false); } + + if (fence != Fence::NO_FENCE) { + SAFE_PARCEL(parcel->writeBool, true); + SAFE_PARCEL(parcel->write, *fence); + } else { + SAFE_PARCEL(parcel->writeBool, false); + } + SAFE_PARCEL(parcel->writeBool, capturedSecureLayers); SAFE_PARCEL(parcel->writeUint32, static_cast<uint32_t>(capturedDataspace)); SAFE_PARCEL(parcel->writeInt32, result); @@ -39,6 +47,13 @@ status_t ScreenCaptureResults::readFromParcel(const android::Parcel* parcel) { SAFE_PARCEL(parcel->read, *buffer); } + bool hasFence; + SAFE_PARCEL(parcel->readBool, &hasFence); + if (hasFence) { + fence = new Fence(); + SAFE_PARCEL(parcel->read, *fence); + } + SAFE_PARCEL(parcel->readBool, &capturedSecureLayers); uint32_t dataspace = 0; SAFE_PARCEL(parcel->readUint32, &dataspace); diff --git a/libs/gui/aidl/android/gui/IScreenCaptureListener.aidl b/libs/gui/aidl/android/gui/IScreenCaptureListener.aidl index f490118b8f..e0f66cd0a1 100644 --- a/libs/gui/aidl/android/gui/IScreenCaptureListener.aidl +++ b/libs/gui/aidl/android/gui/IScreenCaptureListener.aidl @@ -20,5 +20,5 @@ import android.gui.ScreenCaptureResults; /** @hide */ oneway interface IScreenCaptureListener { - void onScreenCaptureComplete(in ScreenCaptureResults captureResults); + void onScreenCaptureCompleted(in ScreenCaptureResults captureResults); }
\ No newline at end of file diff --git a/libs/gui/include/gui/ScreenCaptureResults.h b/libs/gui/include/gui/ScreenCaptureResults.h index fdb4b6985e..0ccc6e8b8a 100644 --- a/libs/gui/include/gui/ScreenCaptureResults.h +++ b/libs/gui/include/gui/ScreenCaptureResults.h @@ -27,6 +27,7 @@ #include <binder/Parcel.h> #include <binder/Parcelable.h> +#include <ui/Fence.h> #include <ui/GraphicBuffer.h> namespace android::gui { @@ -39,6 +40,7 @@ public: status_t readFromParcel(const android::Parcel* parcel) override; sp<GraphicBuffer> buffer; + sp<Fence> fence = Fence::NO_FENCE; bool capturedSecureLayers{false}; ui::Dataspace capturedDataspace{ui::Dataspace::V0_SRGB}; status_t result = OK; diff --git a/libs/gui/include/gui/SyncScreenCaptureListener.h b/libs/gui/include/gui/SyncScreenCaptureListener.h index 8620b77c18..0784fbc058 100644 --- a/libs/gui/include/gui/SyncScreenCaptureListener.h +++ b/libs/gui/include/gui/SyncScreenCaptureListener.h @@ -26,14 +26,16 @@ using gui::ScreenCaptureResults; struct SyncScreenCaptureListener : gui::BnScreenCaptureListener { public: - binder::Status onScreenCaptureComplete(const ScreenCaptureResults& captureResults) override { + binder::Status onScreenCaptureCompleted(const ScreenCaptureResults& captureResults) override { resultsPromise.set_value(captureResults); return binder::Status::ok(); } ScreenCaptureResults waitForResults() { std::future<ScreenCaptureResults> resultsFuture = resultsPromise.get_future(); - return resultsFuture.get(); + const auto screenCaptureResults = resultsFuture.get(); + screenCaptureResults.fence->waitForever(""); + return screenCaptureResults; } private: |