Loading libs/gui/ISurfaceComposer.cpp +51 −0 Original line number Diff line number Diff line Loading @@ -636,6 +636,21 @@ public: *outComponentMask = static_cast<uint8_t>(value); return error; } virtual status_t setDisplayContentSamplingEnabled(const sp<IBinder>& display, bool enable, uint8_t componentMask, uint64_t maxFrames) const { Parcel data, reply; data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); data.writeStrongBinder(display); data.writeBool(enable); data.writeByte(static_cast<int8_t>(componentMask)); data.writeUint64(maxFrames); status_t result = remote()->transact(BnSurfaceComposer::SET_DISPLAY_CONTENT_SAMPLING_ENABLED, data, &reply); return result; } }; // Out-of-line virtual method definition to trigger vtable emission in this Loading Loading @@ -1004,6 +1019,42 @@ status_t BnSurfaceComposer::onTransact( } return result; } case SET_DISPLAY_CONTENT_SAMPLING_ENABLED: { CHECK_INTERFACE(ISurfaceComposer, data, reply); sp<IBinder> display = nullptr; bool enable = false; int8_t componentMask = 0; uint64_t maxFrames = 0; status_t result = data.readStrongBinder(&display); if (result != NO_ERROR) { ALOGE("setDisplayContentSamplingEnabled failure in reading Display token: %d", result); return result; } result = data.readBool(&enable); if (result != NO_ERROR) { ALOGE("setDisplayContentSamplingEnabled failure in reading enable: %d", result); return result; } result = data.readByte(static_cast<int8_t*>(&componentMask)); if (result != NO_ERROR) { ALOGE("setDisplayContentSamplingEnabled failure in reading component mask: %d", result); return result; } result = data.readUint64(&maxFrames); if (result != NO_ERROR) { ALOGE("setDisplayContentSamplingEnabled failure in reading max frames: %d", result); return result; } return setDisplayContentSamplingEnabled(display, enable, static_cast<uint8_t>(componentMask), maxFrames); } default: { return BBinder::onTransact(code, data, reply, flags); } Loading libs/gui/SurfaceComposerClient.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -1098,6 +1098,14 @@ status_t SurfaceComposerClient::getDisplayedContentSamplingAttributes(const sp<I outComponentMask); } status_t SurfaceComposerClient::setDisplayContentSamplingEnabled(const sp<IBinder>& display, bool enable, uint8_t componentMask, uint64_t maxFrames) { return ComposerService::getComposerService()->setDisplayContentSamplingEnabled(display, enable, componentMask, maxFrames); } // ---------------------------------------------------------------------------- status_t ScreenshotClient::capture(const sp<IBinder>& display, const ui::Dataspace reqDataSpace, Loading libs/gui/include/gui/ISurfaceComposer.h +9 −0 Original line number Diff line number Diff line Loading @@ -300,6 +300,14 @@ public: ui::PixelFormat* outFormat, ui::Dataspace* outDataspace, uint8_t* outComponentMask) const = 0; /* Turns on the color sampling engine on the display. * * Requires the ACCESS_SURFACE_FLINGER permission. */ virtual status_t setDisplayContentSamplingEnabled(const sp<IBinder>& display, bool enable, uint8_t componentMask, uint64_t maxFrames) const = 0; }; // ---------------------------------------------------------------------------- Loading Loading @@ -340,6 +348,7 @@ public: GET_COMPOSITION_PREFERENCE, GET_COLOR_MANAGEMENT, GET_DISPLAYED_CONTENT_SAMPLING_ATTRIBUTES, SET_DISPLAY_CONTENT_SAMPLING_ENABLED, }; virtual status_t onTransact(uint32_t code, const Parcel& data, Loading libs/gui/include/gui/SurfaceComposerClient.h +2 −0 Original line number Diff line number Diff line Loading @@ -386,6 +386,8 @@ public: ui::PixelFormat* outFormat, ui::Dataspace* outDataspace, uint8_t* outComponentMask); static status_t setDisplayContentSamplingEnabled(const sp<IBinder>& display, bool enable, uint8_t componentMask, uint64_t maxFrames); private: virtual void onFirstRef(); Loading libs/gui/tests/DisplayedContentSampling_test.cpp +44 −5 Original line number Diff line number Diff line Loading @@ -36,7 +36,12 @@ protected: ASSERT_TRUE(mDisplayToken); } bool shouldSkipTest(status_t status) { bool shouldSkipTest() { ui::PixelFormat format; ui::Dataspace dataspace; status_t status = mComposerClient->getDisplayedContentSamplingAttributes(mDisplayToken, &format, &dataspace, &componentMask); if (status == PERMISSION_DENIED) { SUCCEED() << "permissions denial, skipping test"; return true; Loading @@ -50,19 +55,53 @@ protected: sp<SurfaceComposerClient> mComposerClient; sp<IBinder> mDisplayToken; uint8_t componentMask = 0; }; TEST_F(DisplayedContentSamplingTest, GetDisplayedContentSamplingAttributesAreSane) { // tradefed infrastructure does not support use of GTEST_SKIP if (shouldSkipTest()) return; ui::PixelFormat format; ui::Dataspace dataspace; uint8_t componentMask = 0; status_t status = mComposerClient->getDisplayedContentSamplingAttributes(mDisplayToken, &format, &dataspace, &componentMask); if (shouldSkipTest(status)) { return; } EXPECT_EQ(OK, status); EXPECT_LE(componentMask, INVALID_MASK); } TEST_F(DisplayedContentSamplingTest, EnableWithInvalidMaskReturnsBadValue) { if (shouldSkipTest()) return; status_t status = mComposerClient->setDisplayContentSamplingEnabled(mDisplayToken, true, INVALID_MASK, 0); EXPECT_EQ(BAD_VALUE, status); } TEST_F(DisplayedContentSamplingTest, EnableAndDisableSucceed) { if (shouldSkipTest()) return; status_t status = mComposerClient->setDisplayContentSamplingEnabled(mDisplayToken, true, componentMask, 10); EXPECT_EQ(OK, status); status = mComposerClient->setDisplayContentSamplingEnabled(mDisplayToken, false, componentMask, 0); EXPECT_EQ(OK, status); } TEST_F(DisplayedContentSamplingTest, SelectivelyDisableComponentOk) { if (shouldSkipTest()) return; status_t status = mComposerClient->setDisplayContentSamplingEnabled(mDisplayToken, true, componentMask, 0); EXPECT_EQ(OK, status); // Clear the lowest bit. componentMask &= (componentMask - 1); status = mComposerClient->setDisplayContentSamplingEnabled(mDisplayToken, false, componentMask, 0); EXPECT_EQ(OK, status); } } // namespace android Loading
libs/gui/ISurfaceComposer.cpp +51 −0 Original line number Diff line number Diff line Loading @@ -636,6 +636,21 @@ public: *outComponentMask = static_cast<uint8_t>(value); return error; } virtual status_t setDisplayContentSamplingEnabled(const sp<IBinder>& display, bool enable, uint8_t componentMask, uint64_t maxFrames) const { Parcel data, reply; data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); data.writeStrongBinder(display); data.writeBool(enable); data.writeByte(static_cast<int8_t>(componentMask)); data.writeUint64(maxFrames); status_t result = remote()->transact(BnSurfaceComposer::SET_DISPLAY_CONTENT_SAMPLING_ENABLED, data, &reply); return result; } }; // Out-of-line virtual method definition to trigger vtable emission in this Loading Loading @@ -1004,6 +1019,42 @@ status_t BnSurfaceComposer::onTransact( } return result; } case SET_DISPLAY_CONTENT_SAMPLING_ENABLED: { CHECK_INTERFACE(ISurfaceComposer, data, reply); sp<IBinder> display = nullptr; bool enable = false; int8_t componentMask = 0; uint64_t maxFrames = 0; status_t result = data.readStrongBinder(&display); if (result != NO_ERROR) { ALOGE("setDisplayContentSamplingEnabled failure in reading Display token: %d", result); return result; } result = data.readBool(&enable); if (result != NO_ERROR) { ALOGE("setDisplayContentSamplingEnabled failure in reading enable: %d", result); return result; } result = data.readByte(static_cast<int8_t*>(&componentMask)); if (result != NO_ERROR) { ALOGE("setDisplayContentSamplingEnabled failure in reading component mask: %d", result); return result; } result = data.readUint64(&maxFrames); if (result != NO_ERROR) { ALOGE("setDisplayContentSamplingEnabled failure in reading max frames: %d", result); return result; } return setDisplayContentSamplingEnabled(display, enable, static_cast<uint8_t>(componentMask), maxFrames); } default: { return BBinder::onTransact(code, data, reply, flags); } Loading
libs/gui/SurfaceComposerClient.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -1098,6 +1098,14 @@ status_t SurfaceComposerClient::getDisplayedContentSamplingAttributes(const sp<I outComponentMask); } status_t SurfaceComposerClient::setDisplayContentSamplingEnabled(const sp<IBinder>& display, bool enable, uint8_t componentMask, uint64_t maxFrames) { return ComposerService::getComposerService()->setDisplayContentSamplingEnabled(display, enable, componentMask, maxFrames); } // ---------------------------------------------------------------------------- status_t ScreenshotClient::capture(const sp<IBinder>& display, const ui::Dataspace reqDataSpace, Loading
libs/gui/include/gui/ISurfaceComposer.h +9 −0 Original line number Diff line number Diff line Loading @@ -300,6 +300,14 @@ public: ui::PixelFormat* outFormat, ui::Dataspace* outDataspace, uint8_t* outComponentMask) const = 0; /* Turns on the color sampling engine on the display. * * Requires the ACCESS_SURFACE_FLINGER permission. */ virtual status_t setDisplayContentSamplingEnabled(const sp<IBinder>& display, bool enable, uint8_t componentMask, uint64_t maxFrames) const = 0; }; // ---------------------------------------------------------------------------- Loading Loading @@ -340,6 +348,7 @@ public: GET_COMPOSITION_PREFERENCE, GET_COLOR_MANAGEMENT, GET_DISPLAYED_CONTENT_SAMPLING_ATTRIBUTES, SET_DISPLAY_CONTENT_SAMPLING_ENABLED, }; virtual status_t onTransact(uint32_t code, const Parcel& data, Loading
libs/gui/include/gui/SurfaceComposerClient.h +2 −0 Original line number Diff line number Diff line Loading @@ -386,6 +386,8 @@ public: ui::PixelFormat* outFormat, ui::Dataspace* outDataspace, uint8_t* outComponentMask); static status_t setDisplayContentSamplingEnabled(const sp<IBinder>& display, bool enable, uint8_t componentMask, uint64_t maxFrames); private: virtual void onFirstRef(); Loading
libs/gui/tests/DisplayedContentSampling_test.cpp +44 −5 Original line number Diff line number Diff line Loading @@ -36,7 +36,12 @@ protected: ASSERT_TRUE(mDisplayToken); } bool shouldSkipTest(status_t status) { bool shouldSkipTest() { ui::PixelFormat format; ui::Dataspace dataspace; status_t status = mComposerClient->getDisplayedContentSamplingAttributes(mDisplayToken, &format, &dataspace, &componentMask); if (status == PERMISSION_DENIED) { SUCCEED() << "permissions denial, skipping test"; return true; Loading @@ -50,19 +55,53 @@ protected: sp<SurfaceComposerClient> mComposerClient; sp<IBinder> mDisplayToken; uint8_t componentMask = 0; }; TEST_F(DisplayedContentSamplingTest, GetDisplayedContentSamplingAttributesAreSane) { // tradefed infrastructure does not support use of GTEST_SKIP if (shouldSkipTest()) return; ui::PixelFormat format; ui::Dataspace dataspace; uint8_t componentMask = 0; status_t status = mComposerClient->getDisplayedContentSamplingAttributes(mDisplayToken, &format, &dataspace, &componentMask); if (shouldSkipTest(status)) { return; } EXPECT_EQ(OK, status); EXPECT_LE(componentMask, INVALID_MASK); } TEST_F(DisplayedContentSamplingTest, EnableWithInvalidMaskReturnsBadValue) { if (shouldSkipTest()) return; status_t status = mComposerClient->setDisplayContentSamplingEnabled(mDisplayToken, true, INVALID_MASK, 0); EXPECT_EQ(BAD_VALUE, status); } TEST_F(DisplayedContentSamplingTest, EnableAndDisableSucceed) { if (shouldSkipTest()) return; status_t status = mComposerClient->setDisplayContentSamplingEnabled(mDisplayToken, true, componentMask, 10); EXPECT_EQ(OK, status); status = mComposerClient->setDisplayContentSamplingEnabled(mDisplayToken, false, componentMask, 0); EXPECT_EQ(OK, status); } TEST_F(DisplayedContentSamplingTest, SelectivelyDisableComponentOk) { if (shouldSkipTest()) return; status_t status = mComposerClient->setDisplayContentSamplingEnabled(mDisplayToken, true, componentMask, 0); EXPECT_EQ(OK, status); // Clear the lowest bit. componentMask &= (componentMask - 1); status = mComposerClient->setDisplayContentSamplingEnabled(mDisplayToken, false, componentMask, 0); EXPECT_EQ(OK, status); } } // namespace android