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

Commit e35878ce authored by Ady Abraham's avatar Ady Abraham Committed by Android (Google) Code Review
Browse files

Merge "SurfaceFlinger: tune LayerHistory to be less aggressive" into qt-r1-dev

parents 38172ad8 cab4c2f2
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -129,8 +129,8 @@ class LayerInfo {


    private:
    private:
        std::deque<nsecs_t> mElements;
        std::deque<nsecs_t> mElements;
        static constexpr size_t HISTORY_SIZE = 10;
        static constexpr size_t HISTORY_SIZE = 90;
        static constexpr std::chrono::nanoseconds HISTORY_TIME = 500ms;
        static constexpr std::chrono::nanoseconds HISTORY_TIME = 1s;
    };
    };


public:
public:
+34 −26
Original line number Original line Diff line number Diff line
@@ -27,6 +27,15 @@ protected:


    static constexpr float MIN_REFRESH_RATE = 30.f;
    static constexpr float MIN_REFRESH_RATE = 30.f;
    static constexpr float MAX_REFRESH_RATE = 90.f;
    static constexpr float MAX_REFRESH_RATE = 90.f;
    static constexpr auto RELEVANT_FRAME_THRESHOLD = 90u;
    static constexpr uint64_t THIRTY_FPS_INTERVAL = 33'333'333;

    void forceRelevancy(const std::unique_ptr<LayerHistory::LayerHandle>& testLayer) {
        mLayerHistory->setVisibility(testLayer, true);
        for (auto i = 0u; i < RELEVANT_FRAME_THRESHOLD; i++) {
            mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
        }
    };
};
};


LayerHistoryTest::LayerHistoryTest() {
LayerHistoryTest::LayerHistoryTest() {
@@ -39,24 +48,18 @@ TEST_F(LayerHistoryTest, oneLayer) {
    std::unique_ptr<LayerHistory::LayerHandle> testLayer =
    std::unique_ptr<LayerHistory::LayerHandle> testLayer =
            mLayerHistory->createLayer("TestLayer", MIN_REFRESH_RATE, MAX_REFRESH_RATE);
            mLayerHistory->createLayer("TestLayer", MIN_REFRESH_RATE, MAX_REFRESH_RATE);
    mLayerHistory->setVisibility(testLayer, true);
    mLayerHistory->setVisibility(testLayer, true);

    for (auto i = 0u; i < RELEVANT_FRAME_THRESHOLD; i++) {
    mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
    EXPECT_FLOAT_EQ(0.f, mLayerHistory->getDesiredRefreshRateAndHDR().first);

    mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
    mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
    mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
    // This is still 0, because the layer is not considered recently active if it
    // has been present in less than 10 frames.
        EXPECT_FLOAT_EQ(0.f, mLayerHistory->getDesiredRefreshRateAndHDR().first);
        EXPECT_FLOAT_EQ(0.f, mLayerHistory->getDesiredRefreshRateAndHDR().first);
        mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
        mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
    mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
    }
    mLayerHistory->insert(testLayer, 0, false /*isHDR*/);

    mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
    // Add a few more. This time we should get MAX refresh rate as the layer
    mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
    // becomes relevant
    mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
    static constexpr auto A_FEW = 10;
    // This should be MAX_REFRESH_RATE as we have more than 10 samples
    for (auto i = 0u; i < A_FEW; i++) {
        EXPECT_FLOAT_EQ(MAX_REFRESH_RATE, mLayerHistory->getDesiredRefreshRateAndHDR().first);
        EXPECT_FLOAT_EQ(MAX_REFRESH_RATE, mLayerHistory->getDesiredRefreshRateAndHDR().first);
        mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
    }
}
}


TEST_F(LayerHistoryTest, oneHDRLayer) {
TEST_F(LayerHistoryTest, oneHDRLayer) {
@@ -79,8 +82,9 @@ TEST_F(LayerHistoryTest, explicitTimestamp) {
    mLayerHistory->setVisibility(test30FpsLayer, true);
    mLayerHistory->setVisibility(test30FpsLayer, true);


    nsecs_t startTime = systemTime();
    nsecs_t startTime = systemTime();
    for (int i = 0; i < 31; i++) {
    for (int i = 0; i < RELEVANT_FRAME_THRESHOLD; i++) {
        mLayerHistory->insert(test30FpsLayer, startTime + (i * 33333333), false /*isHDR*/);
        mLayerHistory->insert(test30FpsLayer, startTime + (i * THIRTY_FPS_INTERVAL),
                              false /*isHDR*/);
    }
    }


    EXPECT_FLOAT_EQ(30.f, mLayerHistory->getDesiredRefreshRateAndHDR().first);
    EXPECT_FLOAT_EQ(30.f, mLayerHistory->getDesiredRefreshRateAndHDR().first);
@@ -98,19 +102,21 @@ TEST_F(LayerHistoryTest, multipleLayers) {
    mLayerHistory->setVisibility(testLayer2, true);
    mLayerHistory->setVisibility(testLayer2, true);


    nsecs_t startTime = systemTime();
    nsecs_t startTime = systemTime();
    for (int i = 0; i < 10; i++) {
    for (int i = 0; i < RELEVANT_FRAME_THRESHOLD; i++) {
        mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
        mLayerHistory->insert(testLayer, 0, false /*isHDR*/);
    }
    }
    EXPECT_FLOAT_EQ(MAX_REFRESH_RATE, mLayerHistory->getDesiredRefreshRateAndHDR().first);
    EXPECT_FLOAT_EQ(MAX_REFRESH_RATE, mLayerHistory->getDesiredRefreshRateAndHDR().first);


    startTime = systemTime();
    startTime = systemTime();
    for (int i = 0; i < 10; i++) {
    for (int i = 0; i < RELEVANT_FRAME_THRESHOLD; i++) {
        mLayerHistory->insert(test30FpsLayer, startTime + (i * 33333333), false /*isHDR*/);
        mLayerHistory->insert(test30FpsLayer, startTime + (i * THIRTY_FPS_INTERVAL),
                              false /*isHDR*/);
    }
    }
    EXPECT_FLOAT_EQ(MAX_REFRESH_RATE, mLayerHistory->getDesiredRefreshRateAndHDR().first);
    EXPECT_FLOAT_EQ(MAX_REFRESH_RATE, mLayerHistory->getDesiredRefreshRateAndHDR().first);


    for (int i = 10; i < 30; i++) {
    for (int i = 10; i < RELEVANT_FRAME_THRESHOLD; i++) {
        mLayerHistory->insert(test30FpsLayer, startTime + (i * 33333333), false /*isHDR*/);
        mLayerHistory->insert(test30FpsLayer, startTime + (i * THIRTY_FPS_INTERVAL),
                              false /*isHDR*/);
    }
    }
    EXPECT_FLOAT_EQ(MAX_REFRESH_RATE, mLayerHistory->getDesiredRefreshRateAndHDR().first);
    EXPECT_FLOAT_EQ(MAX_REFRESH_RATE, mLayerHistory->getDesiredRefreshRateAndHDR().first);


@@ -122,8 +128,10 @@ TEST_F(LayerHistoryTest, multipleLayers) {
    EXPECT_FLOAT_EQ(MAX_REFRESH_RATE, mLayerHistory->getDesiredRefreshRateAndHDR().first);
    EXPECT_FLOAT_EQ(MAX_REFRESH_RATE, mLayerHistory->getDesiredRefreshRateAndHDR().first);
    // After 1200 ms frames become obsolete.
    // After 1200 ms frames become obsolete.
    std::this_thread::sleep_for(std::chrono::milliseconds(1500));
    std::this_thread::sleep_for(std::chrono::milliseconds(1500));
    // Insert the 31st frame.

    mLayerHistory->insert(test30FpsLayer, startTime + (30 * 33333333), false /*isHDR*/);
    mLayerHistory->insert(test30FpsLayer,
                          startTime + (RELEVANT_FRAME_THRESHOLD * THIRTY_FPS_INTERVAL),
                          false /*isHDR*/);
    EXPECT_FLOAT_EQ(30.f, mLayerHistory->getDesiredRefreshRateAndHDR().first);
    EXPECT_FLOAT_EQ(30.f, mLayerHistory->getDesiredRefreshRateAndHDR().first);
}
}