Loading libs/gui/ScreenCaptureResults.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading libs/gui/include/gui/ScreenCaptureResults.h +1 −0 Original line number Diff line number Diff line Loading @@ -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; }; Loading services/surfaceflinger/SurfaceFlinger.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -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(), Loading services/surfaceflinger/tests/ScreenCapture_test.cpp +43 −3 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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); } Loading Loading @@ -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); } Loading Loading @@ -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. Loading services/surfaceflinger/tests/TransactionTestHarnesses.h +2 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading
libs/gui/ScreenCaptureResults.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading
libs/gui/include/gui/ScreenCaptureResults.h +1 −0 Original line number Diff line number Diff line Loading @@ -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; }; Loading
services/surfaceflinger/SurfaceFlinger.cpp +1 −0 Original line number Diff line number Diff line Loading @@ -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(), Loading
services/surfaceflinger/tests/ScreenCapture_test.cpp +43 −3 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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); } Loading Loading @@ -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); } Loading Loading @@ -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. Loading
services/surfaceflinger/tests/TransactionTestHarnesses.h +2 −1 Original line number Diff line number Diff line Loading @@ -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; Loading