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

Commit 327d609d authored by Dominik Laskowski's avatar Dominik Laskowski
Browse files

SF: Deduplicate FakeDisplayInjector

Also, parametrize to inject secondary internal display.

Bug: 241285876
Test: libsurfaceflinger_unittest
Change-Id: I63d21c2216a3ab864b040bdb2c9e8fba0768b66a
parent 87717eaf
Loading
Loading
Loading
Loading
+0 −45
Original line number Diff line number Diff line
@@ -120,51 +120,6 @@ void DisplayTransactionTest::injectFakeNativeWindowSurfaceFactory() {
    });
}

sp<DisplayDevice> DisplayTransactionTest::injectDefaultInternalDisplay(
        std::function<void(FakeDisplayDeviceInjector&)> injectExtra) {
    constexpr PhysicalDisplayId DEFAULT_DISPLAY_ID = PhysicalDisplayId::fromPort(255u);
    constexpr int DEFAULT_DISPLAY_WIDTH = 1080;
    constexpr int DEFAULT_DISPLAY_HEIGHT = 1920;
    constexpr HWDisplayId DEFAULT_DISPLAY_HWC_DISPLAY_ID = 0;

    // The DisplayDevice is required to have a framebuffer (behind the
    // ANativeWindow interface) which uses the actual hardware display
    // size.
    EXPECT_CALL(*mNativeWindow, query(NATIVE_WINDOW_WIDTH, _))
            .WillRepeatedly(DoAll(SetArgPointee<1>(DEFAULT_DISPLAY_WIDTH), Return(0)));
    EXPECT_CALL(*mNativeWindow, query(NATIVE_WINDOW_HEIGHT, _))
            .WillRepeatedly(DoAll(SetArgPointee<1>(DEFAULT_DISPLAY_HEIGHT), Return(0)));
    EXPECT_CALL(*mNativeWindow, perform(NATIVE_WINDOW_SET_BUFFERS_FORMAT));
    EXPECT_CALL(*mNativeWindow, perform(NATIVE_WINDOW_API_CONNECT));
    EXPECT_CALL(*mNativeWindow, perform(NATIVE_WINDOW_SET_USAGE64));
    EXPECT_CALL(*mNativeWindow, perform(NATIVE_WINDOW_API_DISCONNECT)).Times(AnyNumber());

    auto compositionDisplay =
            compositionengine::impl::createDisplay(mFlinger.getCompositionEngine(),
                                                   compositionengine::DisplayCreationArgsBuilder()
                                                           .setId(DEFAULT_DISPLAY_ID)
                                                           .setPixels({DEFAULT_DISPLAY_WIDTH,
                                                                       DEFAULT_DISPLAY_HEIGHT})
                                                           .setPowerAdvisor(&mPowerAdvisor)
                                                           .build());

    constexpr bool kIsPrimary = true;
    auto injector = FakeDisplayDeviceInjector(mFlinger, compositionDisplay,
                                              ui::DisplayConnectionType::Internal,
                                              DEFAULT_DISPLAY_HWC_DISPLAY_ID, kIsPrimary);

    injector.setNativeWindow(mNativeWindow);
    if (injectExtra) {
        injectExtra(injector);
    }

    auto displayDevice = injector.inject();

    Mock::VerifyAndClear(mNativeWindow.get());

    return displayDevice;
}

bool DisplayTransactionTest::hasPhysicalHwcDisplay(HWDisplayId hwcDisplayId) const {
    const auto& map = mFlinger.hwcPhysicalDisplayIdMap();

+7 −1
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@
#include <renderengine/mock/RenderEngine.h>
#include <ui/DebugUtils.h>

#include "FakeDisplayInjector.h"
#include "TestableScheduler.h"
#include "TestableSurfaceFlinger.h"
#include "mock/DisplayHardware/MockComposer.h"
@@ -88,8 +89,11 @@ public:
    void injectMockComposer(int virtualDisplayCount);
    void injectFakeBufferQueueFactory();
    void injectFakeNativeWindowSurfaceFactory();

    sp<DisplayDevice> injectDefaultInternalDisplay(
            std::function<void(TestableSurfaceFlinger::FakeDisplayDeviceInjector&)>);
            std::function<void(TestableSurfaceFlinger::FakeDisplayDeviceInjector&)> injectExtra) {
        return mFakeDisplayInjector.injectInternalDisplay(injectExtra);
    }

    // --------------------------------------------------------------------
    // Postcondition helpers
@@ -114,6 +118,8 @@ public:
    sp<GraphicBuffer> mBuffer = sp<GraphicBuffer>::make();
    Hwc2::mock::PowerAdvisor mPowerAdvisor;

    FakeDisplayInjector mFakeDisplayInjector{mFlinger, mPowerAdvisor, mNativeWindow};

    // These mocks are created by the test, but are destroyed by SurfaceFlinger
    // by virtue of being stored into a std::unique_ptr. However we still need
    // to keep a reference to them for use in setting up call expectations.
+31 −25
Original line number Diff line number Diff line
@@ -27,49 +27,54 @@ namespace android {
using FakeDisplayDeviceInjector = TestableSurfaceFlinger::FakeDisplayDeviceInjector;
using android::hardware::graphics::composer::hal::HWDisplayId;
using android::Hwc2::mock::PowerAdvisor;

struct FakeDisplayInjectorArgs {
    uint8_t port = 255u;
    HWDisplayId hwcDisplayId = 0;
    bool isPrimary = true;
};

class FakeDisplayInjector {
public:
    FakeDisplayInjector(TestableSurfaceFlinger& flinger, Hwc2::mock::PowerAdvisor& powerAdvisor,
                        sp<mock::NativeWindow> nativeWindow)
          : mFlinger(flinger), mPowerAdvisor(powerAdvisor), mNativeWindow(nativeWindow) {}

    sp<DisplayDevice> injectInternalDisplay(
            const std::function<void(FakeDisplayDeviceInjector&)>& injectExtra,
            FakeDisplayInjectorArgs args = {}) {
        using testing::_;
        using testing::AnyNumber;
        using testing::DoAll;
        using testing::Mock;
using testing::ResultOf;
        using testing::Return;
        using testing::SetArgPointee;

class FakeDisplayInjector {
public:
    sp<DisplayDevice> injectDefaultInternalDisplay(
            const std::function<void(FakeDisplayDeviceInjector&)>& injectExtra,
            TestableSurfaceFlinger& flinger, uint8_t port = 255u) const {
        constexpr int DEFAULT_DISPLAY_WIDTH = 1080;
        constexpr int DEFAULT_DISPLAY_HEIGHT = 1920;
        constexpr HWDisplayId DEFAULT_DISPLAY_HWC_DISPLAY_ID = 0;

        const PhysicalDisplayId physicalDisplayId = PhysicalDisplayId::fromPort(port);
        constexpr ui::Size kResolution = {1080, 1920};

        // The DisplayDevice is required to have a framebuffer (behind the
        // ANativeWindow interface) which uses the actual hardware display
        // size.
        EXPECT_CALL(*mNativeWindow, query(NATIVE_WINDOW_WIDTH, _))
                .WillRepeatedly(DoAll(SetArgPointee<1>(DEFAULT_DISPLAY_WIDTH), Return(0)));
                .WillRepeatedly(DoAll(SetArgPointee<1>(kResolution.getWidth()), Return(0)));
        EXPECT_CALL(*mNativeWindow, query(NATIVE_WINDOW_HEIGHT, _))
                .WillRepeatedly(DoAll(SetArgPointee<1>(DEFAULT_DISPLAY_HEIGHT), Return(0)));
                .WillRepeatedly(DoAll(SetArgPointee<1>(kResolution.getHeight()), Return(0)));
        EXPECT_CALL(*mNativeWindow, perform(NATIVE_WINDOW_SET_BUFFERS_FORMAT));
        EXPECT_CALL(*mNativeWindow, perform(NATIVE_WINDOW_API_CONNECT));
        EXPECT_CALL(*mNativeWindow, perform(NATIVE_WINDOW_SET_USAGE64));
        EXPECT_CALL(*mNativeWindow, perform(NATIVE_WINDOW_API_DISCONNECT)).Times(AnyNumber());

        auto compositionDisplay = compositionengine::impl::
                createDisplay(flinger.getCompositionEngine(),
                createDisplay(mFlinger.getCompositionEngine(),
                              compositionengine::DisplayCreationArgsBuilder()
                                      .setId(physicalDisplayId)
                                      .setPixels({DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT})
                                      .setPowerAdvisor(mPowerAdvisor)
                                      .setId(PhysicalDisplayId::fromPort(args.port))
                                      .setPixels(kResolution)
                                      .setPowerAdvisor(&mPowerAdvisor)
                                      .build());

        constexpr bool kIsPrimary = true;
        auto injector = FakeDisplayDeviceInjector(flinger, compositionDisplay,
        auto injector = FakeDisplayDeviceInjector(mFlinger, compositionDisplay,
                                                  ui::DisplayConnectionType::Internal,
                                                  DEFAULT_DISPLAY_HWC_DISPLAY_ID, kIsPrimary);
                                                  args.hwcDisplayId, args.isPrimary);

        injector.setNativeWindow(mNativeWindow);
        if (injectExtra) {
@@ -83,8 +88,9 @@ public:
        return displayDevice;
    }

    sp<mock::NativeWindow> mNativeWindow = sp<mock::NativeWindow>::make();
    PowerAdvisor* mPowerAdvisor = new PowerAdvisor();
    TestableSurfaceFlinger& mFlinger;
    Hwc2::mock::PowerAdvisor& mPowerAdvisor;
    sp<mock::NativeWindow> mNativeWindow;
};

} // namespace android
+20 −17
Original line number Diff line number Diff line
@@ -76,9 +76,12 @@ protected:
    ConnectionHandle mConnectionHandle;
    MockEventThread* mEventThread;
    sp<MockEventThreadConnection> mEventThreadConnection;
    FakeDisplayInjector mFakeDisplayInjector;

    TestableSurfaceFlinger mFlinger;
    Hwc2::mock::PowerAdvisor mPowerAdvisor;
    sp<android::mock::NativeWindow> mNativeWindow = sp<android::mock::NativeWindow>::make();

    FakeDisplayInjector mFakeDisplayInjector{mFlinger, mPowerAdvisor, mNativeWindow};
};

SchedulerTest::SchedulerTest() {
@@ -226,11 +229,10 @@ MATCHER(Is120Hz, "") {
}

TEST_F(SchedulerTest, chooseRefreshRateForContentSelectsMaxRefreshRate) {
    auto display = mFakeDisplayInjector.injectDefaultInternalDisplay(
            [&](FakeDisplayDeviceInjector& injector) {
    auto display =
            mFakeDisplayInjector.injectInternalDisplay([&](FakeDisplayDeviceInjector& injector) {
                injector.setDisplayModes(makeModes(kMode60_1, kMode120_1), kMode60_1->getId());
            },
            mFlinger);
            });

    mScheduler->registerDisplay(display);
    mScheduler->setRefreshRateConfigs(display->holdRefreshRateConfigs());
@@ -255,11 +257,11 @@ TEST_F(SchedulerTest, chooseRefreshRateForContentSelectsMaxRefreshRate) {
}

TEST_F(SchedulerTest, getBestDisplayMode_singleDisplay) {
    auto display = mFakeDisplayInjector.injectDefaultInternalDisplay(
            [&](FakeDisplayDeviceInjector& injector) {
    auto display =
            mFakeDisplayInjector.injectInternalDisplay([&](FakeDisplayDeviceInjector& injector) {
                injector.setDisplayModes(makeModes(kMode60_1, kMode120_1), kMode60_1->getId());
            },
            mFlinger);
            });

    mScheduler->registerDisplay(display);

    std::vector<RefreshRateConfigs::LayerRequirement> layers =
@@ -293,16 +295,16 @@ TEST_F(SchedulerTest, getBestDisplayMode_singleDisplay) {
}

TEST_F(SchedulerTest, getBestDisplayModes_multipleDisplays) {
    auto display1 = mFakeDisplayInjector.injectDefaultInternalDisplay(
            [&](FakeDisplayDeviceInjector& injector) {
    auto display1 =
            mFakeDisplayInjector.injectInternalDisplay([&](FakeDisplayDeviceInjector& injector) {
                injector.setDisplayModes(makeModes(kMode60_1, kMode120_1), kMode60_1->getId());
            },
            mFlinger);
    auto display2 = mFakeDisplayInjector.injectDefaultInternalDisplay(
            });
    auto display2 = mFakeDisplayInjector.injectInternalDisplay(
            [&](FakeDisplayDeviceInjector& injector) {
                injector.setDisplayModes(makeModes(kMode60_2, kMode120_2), kMode60_2->getId());
            },
            mFlinger, /* port */ 253u);
            {.port = 253u, .hwcDisplayId = 42, .isPrimary = false});

    mScheduler->registerDisplay(display1);
    mScheduler->registerDisplay(display2);

@@ -354,11 +356,12 @@ TEST_F(SchedulerTest, getBestDisplayModes_multipleDisplays) {

    // Filters out the 120Hz as it's not present on the display3, even with touch active
    // we select 60Hz here.
    auto display3 = mFakeDisplayInjector.injectDefaultInternalDisplay(
    auto display3 = mFakeDisplayInjector.injectInternalDisplay(
            [&](FakeDisplayDeviceInjector& injector) {
                injector.setDisplayModes(makeModes(kMode60_3), kMode60_3->getId());
            },
            mFlinger, /* port */ 252u);
            {.port = 252u, .hwcDisplayId = 41, .isPrimary = false});

    mScheduler->registerDisplay(display3);

    expectedDisplays = {display1, display2, display3};