Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 74e53776 authored by Kevin DuBois's avatar Kevin DuBois
Browse files

[SurfaceFlinger] add setDisplayContentSamplingEnabled i/f

Add interface to ISurfaceComposer that can enable or disable
the graphics.composer's collection of the displayed content
statistics.

Bug: 116028618
Test: Boot
Test: ran test client against prototype, see enable/disable working.
Test: Ran new tests './libgui_test --gtest_filter="DisplayedContentSamp*"'
Test: on hwc with and without new function hook.
Change-Id: Ifb487e2bfbd8e0db6178ccbf762aa968c34576b9
parent face1763
Loading
Loading
Loading
Loading
+51 −0
Original line number Diff line number Diff line
@@ -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
@@ -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);
        }
+8 −0
Original line number Diff line number Diff line
@@ -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,
+9 −0
Original line number Diff line number Diff line
@@ -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;
};

// ----------------------------------------------------------------------------
@@ -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,
+2 −0
Original line number Diff line number Diff line
@@ -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();
+44 −5
Original line number Diff line number Diff line
@@ -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;
@@ -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