diff options
author | 2020-09-11 16:10:26 +0000 | |
---|---|---|
committer | 2020-09-11 16:10:26 +0000 | |
commit | ac4ce2a34d4433f836b2f616a18d9d6961d013f5 (patch) | |
tree | f196acc82e52093f713aed29c2d69c072be1c30d | |
parent | b1a3a81748d6388d9e15875e375abe57da857665 (diff) | |
parent | 99eeeb8ddb1613fbc688bd37ebdaf8b66d105eed (diff) |
Merge "Revert "Update screen capture functions to accept a ScreenCaptur...""
-rw-r--r-- | libs/gui/SurfaceComposerClient.cpp | 40 | ||||
-rw-r--r-- | libs/gui/include/gui/SurfaceComposerClient.h | 16 | ||||
-rw-r--r-- | libs/gui/include/gui/SyncScreenCaptureListener.h | 40 | ||||
-rw-r--r-- | libs/gui/tests/BLASTBufferQueue_test.cpp | 1 | ||||
-rw-r--r-- | libs/gui/tests/Surface_test.cpp | 1 | ||||
-rw-r--r-- | services/surfaceflinger/RegionSamplingThread.cpp | 17 | ||||
-rw-r--r-- | services/surfaceflinger/tests/utils/ScreenshotUtils.h | 18 |
7 files changed, 80 insertions, 53 deletions
diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 6d1f399460..ce2e5ed195 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -1923,29 +1923,57 @@ status_t SurfaceComposerClient::setGlobalShadowSettings(const half4& ambientColo } // ---------------------------------------------------------------------------- +status_t SyncScreenCaptureListener::onScreenCaptureComplete( + const ScreenCaptureResults& captureResults) { + resultsPromise.set_value(captureResults); + return NO_ERROR; +} + +ScreenCaptureResults SyncScreenCaptureListener::waitForResults() { + std::future<ScreenCaptureResults> resultsFuture = resultsPromise.get_future(); + return resultsFuture.get(); +} status_t ScreenshotClient::captureDisplay(const DisplayCaptureArgs& captureArgs, - const sp<IScreenCaptureListener>& captureListener) { + ScreenCaptureResults& captureResults) { sp<ISurfaceComposer> s(ComposerService::getComposerService()); if (s == nullptr) return NO_INIT; - return s->captureDisplay(captureArgs, captureListener); + sp<SyncScreenCaptureListener> captureListener = new SyncScreenCaptureListener(); + status_t status = s->captureDisplay(captureArgs, captureListener); + if (status != NO_ERROR) { + return status; + } + captureResults = captureListener->waitForResults(); + return captureResults.result; } status_t ScreenshotClient::captureDisplay(uint64_t displayOrLayerStack, - const sp<IScreenCaptureListener>& captureListener) { + ScreenCaptureResults& captureResults) { sp<ISurfaceComposer> s(ComposerService::getComposerService()); if (s == nullptr) return NO_INIT; - return s->captureDisplay(displayOrLayerStack, captureListener); + sp<SyncScreenCaptureListener> captureListener = new SyncScreenCaptureListener(); + status_t status = s->captureDisplay(displayOrLayerStack, captureListener); + if (status != NO_ERROR) { + return status; + } + captureResults = captureListener->waitForResults(); + return captureResults.result; } status_t ScreenshotClient::captureLayers(const LayerCaptureArgs& captureArgs, - const sp<IScreenCaptureListener>& captureListener) { + ScreenCaptureResults& captureResults) { sp<ISurfaceComposer> s(ComposerService::getComposerService()); if (s == nullptr) return NO_INIT; - return s->captureLayers(captureArgs, captureListener); + sp<SyncScreenCaptureListener> captureListener = new SyncScreenCaptureListener(); + status_t status = s->captureLayers(captureArgs, captureListener); + if (status != NO_ERROR) { + return status; + } + captureResults = captureListener->waitForResults(); + return captureResults.result; } } // namespace android diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index 6cac287d77..af37468c2d 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -18,6 +18,7 @@ #include <stdint.h> #include <sys/types.h> +#include <future> #include <set> #include <unordered_map> #include <unordered_set> @@ -593,14 +594,23 @@ private: // --------------------------------------------------------------------------- +class SyncScreenCaptureListener : public BnScreenCaptureListener { +public: + status_t onScreenCaptureComplete(const ScreenCaptureResults& captureResults) override; + ScreenCaptureResults waitForResults(); + +private: + std::promise<ScreenCaptureResults> resultsPromise; +}; + class ScreenshotClient { public: static status_t captureDisplay(const DisplayCaptureArgs& captureArgs, - const sp<IScreenCaptureListener>& captureListener); + ScreenCaptureResults& captureResults); static status_t captureDisplay(uint64_t displayOrLayerStack, - const sp<IScreenCaptureListener>& captureListener); + ScreenCaptureResults& captureResults); static status_t captureLayers(const LayerCaptureArgs& captureArgs, - const sp<IScreenCaptureListener>& captureListener); + ScreenCaptureResults& captureResults); }; // --------------------------------------------------------------------------- diff --git a/libs/gui/include/gui/SyncScreenCaptureListener.h b/libs/gui/include/gui/SyncScreenCaptureListener.h deleted file mode 100644 index 2857996c23..0000000000 --- a/libs/gui/include/gui/SyncScreenCaptureListener.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include <gui/SurfaceComposerClient.h> -#include <future> - -namespace android { - -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; -}; - -} // namespace android
\ No newline at end of file diff --git a/libs/gui/tests/BLASTBufferQueue_test.cpp b/libs/gui/tests/BLASTBufferQueue_test.cpp index da0d5f85bb..4a186b1e97 100644 --- a/libs/gui/tests/BLASTBufferQueue_test.cpp +++ b/libs/gui/tests/BLASTBufferQueue_test.cpp @@ -25,7 +25,6 @@ #include <gui/IGraphicBufferProducer.h> #include <gui/IProducerListener.h> #include <gui/SurfaceComposerClient.h> -#include <gui/SyncScreenCaptureListener.h> #include <private/gui/ComposerService.h> #include <ui/DisplayConfig.h> #include <ui/GraphicBuffer.h> diff --git a/libs/gui/tests/Surface_test.cpp b/libs/gui/tests/Surface_test.cpp index dbede46e9f..aedba2aebd 100644 --- a/libs/gui/tests/Surface_test.cpp +++ b/libs/gui/tests/Surface_test.cpp @@ -28,7 +28,6 @@ #include <gui/ISurfaceComposer.h> #include <gui/Surface.h> #include <gui/SurfaceComposerClient.h> -#include <gui/SyncScreenCaptureListener.h> #include <inttypes.h> #include <private/gui/ComposerService.h> #include <ui/BufferQueueDefs.h> diff --git a/services/surfaceflinger/RegionSamplingThread.cpp b/services/surfaceflinger/RegionSamplingThread.cpp index 4dc20c44b8..a2fc6925b8 100644 --- a/services/surfaceflinger/RegionSamplingThread.cpp +++ b/services/surfaceflinger/RegionSamplingThread.cpp @@ -29,7 +29,6 @@ #include <compositionengine/impl/OutputCompositionState.h> #include <cutils/properties.h> #include <gui/IRegionSamplingListener.h> -#include <gui/SyncScreenCaptureListener.h> #include <ui/DisplayStatInfo.h> #include <utils/Trace.h> @@ -447,6 +446,22 @@ void RegionSamplingThread::captureSample() { PIXEL_FORMAT_RGBA_8888, 1, usage, "RegionSamplingThread"); } + 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 */, captureListener); diff --git a/services/surfaceflinger/tests/utils/ScreenshotUtils.h b/services/surfaceflinger/tests/utils/ScreenshotUtils.h index ca3551ed6c..1d94f21fb2 100644 --- a/services/surfaceflinger/tests/utils/ScreenshotUtils.h +++ b/services/surfaceflinger/tests/utils/ScreenshotUtils.h @@ -15,16 +15,32 @@ */ #pragma once -#include <gui/SyncScreenCaptureListener.h> #include <ui/Rect.h> #include <utils/String8.h> #include <functional> +#include <future> #include "TransactionUtils.h" namespace android { namespace { +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; +}; + // A ScreenCapture is a screenshot from SurfaceFlinger that can be used to check // individual pixel values for testing purposes. class ScreenCapture : public RefBase { |