diff options
| author | 2022-04-29 17:11:45 +0000 | |
|---|---|---|
| committer | 2022-04-29 17:11:45 +0000 | |
| commit | f2a5d5eb3c1636b95e701b6f35dcdd28444032ce (patch) | |
| tree | 7089a90a6c0bbd1cedd997a8f99e28a63bbf862c | |
| parent | 70059e270159e943537b4102975d1c51cb3c5001 (diff) | |
| parent | f7f5aac06830d17a2c1337e0095fb9ddaf8a0314 (diff) | |
Merge "Propagate HDR information to screenshot animation." into tm-dev am: f7f5aac068
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/native/+/17988540
Change-Id: Ifed4349de7c5129e1e93876527f65bb5270cd1f4
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
| -rw-r--r-- | libs/gui/ScreenCaptureResults.cpp | 2 | ||||
| -rw-r--r-- | libs/gui/include/gui/ScreenCaptureResults.h | 1 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 1 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/ScreenCapture_test.cpp | 46 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/TransactionTestHarnesses.h | 3 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/utils/ScreenshotUtils.h | 12 |
6 files changed, 58 insertions, 7 deletions
diff --git a/libs/gui/ScreenCaptureResults.cpp b/libs/gui/ScreenCaptureResults.cpp index e91f74f3d3..fe387064bc 100644 --- a/libs/gui/ScreenCaptureResults.cpp +++ b/libs/gui/ScreenCaptureResults.cpp @@ -36,6 +36,7 @@ status_t ScreenCaptureResults::writeToParcel(android::Parcel* parcel) const { } SAFE_PARCEL(parcel->writeBool, capturedSecureLayers); + SAFE_PARCEL(parcel->writeBool, capturedHdrLayers); SAFE_PARCEL(parcel->writeUint32, static_cast<uint32_t>(capturedDataspace)); SAFE_PARCEL(parcel->writeInt32, result); return NO_ERROR; @@ -57,6 +58,7 @@ status_t ScreenCaptureResults::readFromParcel(const android::Parcel* parcel) { } SAFE_PARCEL(parcel->readBool, &capturedSecureLayers); + SAFE_PARCEL(parcel->readBool, &capturedHdrLayers); uint32_t dataspace = 0; SAFE_PARCEL(parcel->readUint32, &dataspace); capturedDataspace = static_cast<ui::Dataspace>(dataspace); diff --git a/libs/gui/include/gui/ScreenCaptureResults.h b/libs/gui/include/gui/ScreenCaptureResults.h index 99c35c1a3d..724c11c881 100644 --- a/libs/gui/include/gui/ScreenCaptureResults.h +++ b/libs/gui/include/gui/ScreenCaptureResults.h @@ -33,6 +33,7 @@ public: sp<GraphicBuffer> buffer; sp<Fence> fence = Fence::NO_FENCE; bool capturedSecureLayers{false}; + bool capturedHdrLayers{false}; ui::Dataspace capturedDataspace{ui::Dataspace::V0_SRGB}; status_t result = OK; }; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 282f0b9515..e72e21ceb3 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -6804,6 +6804,7 @@ std::shared_future<renderengine::RenderEngineResult> SurfaceFlinger::renderScree if (regionSampling) { settings.backgroundBlurRadius = 0; } + captureResults.capturedHdrLayers |= isHdrDataspace(settings.sourceDataspace); } clientCompositionLayers.insert(clientCompositionLayers.end(), diff --git a/services/surfaceflinger/tests/ScreenCapture_test.cpp b/services/surfaceflinger/tests/ScreenCapture_test.cpp index f9b31853fc..6a7d8b8ca5 100644 --- a/services/surfaceflinger/tests/ScreenCapture_test.cpp +++ b/services/surfaceflinger/tests/ScreenCapture_test.cpp @@ -112,7 +112,7 @@ TEST_F(ScreenCaptureTest, SetFlagsSecureEUidSystem) { args.captureSecureLayers = true; ASSERT_EQ(NO_ERROR, ScreenCapture::captureDisplay(args, mCaptureResults)); ASSERT_TRUE(mCaptureResults.capturedSecureLayers); - ScreenCapture sc(mCaptureResults.buffer); + ScreenCapture sc(mCaptureResults.buffer, mCaptureResults.capturedHdrLayers); sc.expectColor(Rect(0, 0, 32, 32), Color::RED); } @@ -147,7 +147,7 @@ TEST_F(ScreenCaptureTest, CaptureChildSetParentFlagsSecureEUidSystem) { args.captureSecureLayers = true; ASSERT_EQ(NO_ERROR, ScreenCapture::captureDisplay(args, mCaptureResults)); ASSERT_TRUE(mCaptureResults.capturedSecureLayers); - ScreenCapture sc(mCaptureResults.buffer); + ScreenCapture sc(mCaptureResults.buffer, mCaptureResults.capturedHdrLayers); sc.expectColor(Rect(0, 0, 10, 10), Color::BLUE); } @@ -374,7 +374,7 @@ TEST_F(ScreenCaptureTest, CaptureBufferLayerWithoutBufferFails) { ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(child, Color::RED, 32, 32)); SurfaceComposerClient::Transaction().apply(true); ASSERT_EQ(NO_ERROR, ScreenCapture::captureLayers(args, captureResults)); - ScreenCapture sc(captureResults.buffer); + ScreenCapture sc(captureResults.buffer, captureResults.capturedHdrLayers); sc.expectColor(Rect(0, 0, 9, 9), Color::RED); } @@ -860,6 +860,46 @@ TEST_F(ScreenCaptureTest, CaptureOffscreen) { mCapture->expectColor(Rect(0, 0, 32, 32), Color::RED); } +TEST_F(ScreenCaptureTest, CaptureNonHdrLayer) { + sp<SurfaceControl> layer; + ASSERT_NO_FATAL_FAILURE(layer = createLayer("test layer", 32, 32, + ISurfaceComposerClient::eFXSurfaceBufferState, + mBGSurfaceControl.get())); + ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLACK, 32, 32)); + Transaction() + .show(layer) + .setLayer(layer, INT32_MAX) + .setDataspace(layer, ui::Dataspace::V0_SRGB) + .apply(); + + LayerCaptureArgs captureArgs; + captureArgs.layerHandle = layer->getHandle(); + + ScreenCapture::captureLayers(&mCapture, captureArgs); + mCapture->expectColor(Rect(0, 0, 32, 32), Color::BLACK); + ASSERT_FALSE(mCapture->capturedHdrLayers()); +} + +TEST_F(ScreenCaptureTest, CaptureHdrLayer) { + sp<SurfaceControl> layer; + ASSERT_NO_FATAL_FAILURE(layer = createLayer("test layer", 32, 32, + ISurfaceComposerClient::eFXSurfaceBufferState, + mBGSurfaceControl.get())); + ASSERT_NO_FATAL_FAILURE(fillBufferStateLayerColor(layer, Color::BLACK, 32, 32)); + Transaction() + .show(layer) + .setLayer(layer, INT32_MAX) + .setDataspace(layer, ui::Dataspace::BT2020_ITU_PQ) + .apply(); + + LayerCaptureArgs captureArgs; + captureArgs.layerHandle = layer->getHandle(); + + ScreenCapture::captureLayers(&mCapture, captureArgs); + mCapture->expectColor(Rect(0, 0, 32, 32), Color::BLACK); + ASSERT_TRUE(mCapture->capturedHdrLayers()); +} + // In the following tests we verify successful skipping of a parent layer, // so we use the same verification logic and only change how we mutate // the parent layer to verify that various properties are ignored. diff --git a/services/surfaceflinger/tests/TransactionTestHarnesses.h b/services/surfaceflinger/tests/TransactionTestHarnesses.h index 60cffb19df..8ce63bc64c 100644 --- a/services/surfaceflinger/tests/TransactionTestHarnesses.h +++ b/services/surfaceflinger/tests/TransactionTestHarnesses.h @@ -79,7 +79,8 @@ public: BufferItem item; itemConsumer->acquireBuffer(&item, 0, true); - auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer); + constexpr bool kContainsHdr = false; + auto sc = std::make_unique<ScreenCapture>(item.mGraphicBuffer, kContainsHdr); itemConsumer->releaseBuffer(item); SurfaceComposerClient::destroyDisplay(vDisplay); return sc; diff --git a/services/surfaceflinger/tests/utils/ScreenshotUtils.h b/services/surfaceflinger/tests/utils/ScreenshotUtils.h index ee7e92cbf6..f879430db0 100644 --- a/services/surfaceflinger/tests/utils/ScreenshotUtils.h +++ b/services/surfaceflinger/tests/utils/ScreenshotUtils.h @@ -60,7 +60,8 @@ public: DisplayCaptureArgs& captureArgs) { ScreenCaptureResults captureResults; ASSERT_EQ(NO_ERROR, captureDisplay(captureArgs, captureResults)); - *sc = std::make_unique<ScreenCapture>(captureResults.buffer); + *sc = std::make_unique<ScreenCapture>(captureResults.buffer, + captureResults.capturedHdrLayers); } static status_t captureLayers(LayerCaptureArgs& captureArgs, @@ -81,9 +82,12 @@ public: static void captureLayers(std::unique_ptr<ScreenCapture>* sc, LayerCaptureArgs& captureArgs) { ScreenCaptureResults captureResults; ASSERT_EQ(NO_ERROR, captureLayers(captureArgs, captureResults)); - *sc = std::make_unique<ScreenCapture>(captureResults.buffer); + *sc = std::make_unique<ScreenCapture>(captureResults.buffer, + captureResults.capturedHdrLayers); } + bool capturedHdrLayers() const { return mContainsHdr; } + void expectColor(const Rect& rect, const Color& color, uint8_t tolerance = 0) { ASSERT_NE(nullptr, mOutBuffer); ASSERT_NE(nullptr, mPixels); @@ -181,7 +185,8 @@ public: EXPECT_EQ(height, mOutBuffer->getHeight()); } - explicit ScreenCapture(const sp<GraphicBuffer>& outBuffer) : mOutBuffer(outBuffer) { + explicit ScreenCapture(const sp<GraphicBuffer>& outBuffer, bool containsHdr) + : mOutBuffer(outBuffer), mContainsHdr(containsHdr) { if (mOutBuffer) { mOutBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN, reinterpret_cast<void**>(&mPixels)); } @@ -193,6 +198,7 @@ public: private: sp<GraphicBuffer> mOutBuffer; + bool mContainsHdr = mContainsHdr; uint8_t* mPixels = nullptr; }; } // namespace |