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

Commit 209ae617 authored by Marin Shalamanov's avatar Marin Shalamanov
Browse files

Fix wrong framebufferspace computation

When the framebuffer size is 1/2 of the display
we were multiplying with 2 instead of dividing
when computing the content.

Bug: 161793589
Bug: 168788659
Test: atest OutputTest
Change-Id: I3bba764e87a1a5e9c4491d9f2f117b6c1f51371d
parent 384914ae
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -148,7 +148,7 @@ void Output::setProjection(ui::Rotation orientation, const Rect& layerStackSpace
    LOG_FATAL_IF(outputState.framebufferSpace.bounds == Rect::INVALID_RECT,
                 "The framebuffer bounds are unknown.");
    const auto scale =
            getScale(outputState.framebufferSpace.bounds, outputState.displaySpace.bounds);
            getScale(outputState.displaySpace.bounds, outputState.framebufferSpace.bounds);
    outputState.framebufferSpace.content = outputState.displaySpace.content.scale(scale.x, scale.y);

    // Compute layerStackSpace
+65 −3
Original line number Diff line number Diff line
@@ -235,16 +235,75 @@ TEST_F(OutputTest, setCompositionEnabledSetsDisabledAndDirtiesEntireOutput) {
 * Output::setProjection()
 */

TEST_F(OutputTest, setProjectionTriviallyWorks) {
TEST_F(OutputTest, setProjectionWorks) {
    const Rect displayRect{0, 0, 1000, 2000};
    mOutput->editState().displaySpace.bounds = displayRect;
    mOutput->editState().framebufferSpace.bounds = displayRect;

    const ui::Rotation orientation = ui::ROTATION_90;
    const Rect frame{1, 2, 3, 4};
    const Rect viewport{5, 6, 7, 8};
    const Rect frame{50, 60, 100, 100};
    const Rect viewport{10, 20, 30, 40};

    mOutput->setProjection(orientation, viewport, frame);

    EXPECT_EQ(orientation, mOutput->getState().displaySpace.orientation);
    EXPECT_EQ(frame, mOutput->getState().orientedDisplaySpace.content);
    EXPECT_EQ(viewport, mOutput->getState().layerStackSpace.content);

    const auto state = mOutput->getState();
    EXPECT_EQ(ui::ROTATION_0, state.layerStackSpace.orientation);
    EXPECT_EQ(viewport, state.layerStackSpace.content);
    EXPECT_EQ(viewport, state.layerStackSpace.bounds);

    EXPECT_EQ(ui::ROTATION_0, state.orientedDisplaySpace.orientation);
    EXPECT_EQ(frame, state.orientedDisplaySpace.content);
    EXPECT_EQ(Rect(0, 0, 2000, 1000), state.orientedDisplaySpace.bounds);

    EXPECT_EQ(displayRect, state.displaySpace.bounds);
    EXPECT_EQ(Rect(900, 50, 940, 100), state.displaySpace.content);
    EXPECT_EQ(orientation, state.displaySpace.orientation);

    EXPECT_EQ(displayRect, state.framebufferSpace.bounds);
    EXPECT_EQ(Rect(900, 50, 940, 100), state.framebufferSpace.content);
    EXPECT_EQ(orientation, state.framebufferSpace.orientation);

    EXPECT_EQ(state.displaySpace.content, state.transform.transform(state.layerStackSpace.content));
}

TEST_F(OutputTest, setProjectionWithSmallFramebufferWorks) {
    const Rect displayRect{0, 0, 1000, 2000};
    const Rect framebufferRect{0, 0, 500, 1000};
    mOutput->editState().displaySpace.bounds = displayRect;
    mOutput->editState().framebufferSpace.bounds = framebufferRect;

    const ui::Rotation orientation = ui::ROTATION_90;
    const Rect frame{50, 60, 100, 100};
    const Rect viewport{10, 20, 30, 40};

    mOutput->setProjection(orientation, viewport, frame);

    EXPECT_EQ(orientation, mOutput->getState().displaySpace.orientation);
    EXPECT_EQ(frame, mOutput->getState().orientedDisplaySpace.content);
    EXPECT_EQ(viewport, mOutput->getState().layerStackSpace.content);

    const auto state = mOutput->getState();
    EXPECT_EQ(ui::ROTATION_0, state.layerStackSpace.orientation);
    EXPECT_EQ(viewport, state.layerStackSpace.content);
    EXPECT_EQ(viewport, state.layerStackSpace.bounds);

    EXPECT_EQ(ui::ROTATION_0, state.orientedDisplaySpace.orientation);
    EXPECT_EQ(frame, state.orientedDisplaySpace.content);
    EXPECT_EQ(Rect(0, 0, 2000, 1000), state.orientedDisplaySpace.bounds);

    EXPECT_EQ(displayRect, state.displaySpace.bounds);
    EXPECT_EQ(Rect(900, 50, 940, 100), state.displaySpace.content);
    EXPECT_EQ(orientation, state.displaySpace.orientation);

    EXPECT_EQ(framebufferRect, state.framebufferSpace.bounds);
    EXPECT_EQ(Rect(450, 25, 470, 50), state.framebufferSpace.content);
    EXPECT_EQ(orientation, state.framebufferSpace.orientation);

    EXPECT_EQ(state.displaySpace.content, state.transform.transform(state.layerStackSpace.content));
}

/*
@@ -275,12 +334,15 @@ TEST_F(OutputTest, setDisplaySpaceSizeUpdatesOutputStateAndDirtiesEntireOutput)
    EXPECT_EQ(ui::ROTATION_0, state.layerStackSpace.orientation);
    EXPECT_EQ(Rect(0, 0, 2000, 1000), state.layerStackSpace.content);
    EXPECT_EQ(Rect(0, 0, 2000, 1000), state.layerStackSpace.bounds);

    EXPECT_EQ(ui::ROTATION_0, state.orientedDisplaySpace.orientation);
    EXPECT_EQ(Rect(0, 0, 900, 450), state.orientedDisplaySpace.content);
    EXPECT_EQ(Rect(0, 0, 1000, 500), state.orientedDisplaySpace.bounds);

    EXPECT_EQ(displayRect, state.displaySpace.bounds);
    EXPECT_EQ(Rect(0, 0, 450, 900), state.displaySpace.content);
    EXPECT_EQ(ui::ROTATION_90, state.displaySpace.orientation);

    EXPECT_EQ(displayRect, state.framebufferSpace.bounds);
    EXPECT_EQ(Rect(0, 0, 450, 900), state.framebufferSpace.content);
    EXPECT_EQ(ui::ROTATION_90, state.framebufferSpace.orientation);
+9 −9
Original line number Diff line number Diff line
@@ -1448,7 +1448,7 @@ public:
        });
    }

    ui::Size SwapWH(const ui::Size size) const { return ui::Size(size.height, size.width); }
    ui::Size swapWH(const ui::Size size) const { return ui::Size(size.height, size.width); }

    void setProjectionForRotation0() {
        // A logical rotation of 0 uses the SurfaceFlinger display size
@@ -1459,8 +1459,8 @@ public:
    void setProjectionForRotation90() {
        // A logical rotation of 90 uses the SurfaceFlinger display size with
        // the width/height swapped.
        mDisplayDevice->setProjection(ui::ROTATION_90, Rect(SwapWH(mFlingerDisplaySize)),
                                      Rect(SwapWH(mFlingerDisplaySize)));
        mDisplayDevice->setProjection(ui::ROTATION_90, Rect(swapWH(mFlingerDisplaySize)),
                                      Rect(swapWH(mFlingerDisplaySize)));
    }

    void setProjectionForRotation180() {
@@ -1472,8 +1472,8 @@ public:
    void setProjectionForRotation270() {
        // A logical rotation of 270 uses the SurfaceFlinger display size with
        // the width/height swapped.
        mDisplayDevice->setProjection(ui::ROTATION_270, Rect(SwapWH(mFlingerDisplaySize)),
                                      Rect(SwapWH(mFlingerDisplaySize)));
        mDisplayDevice->setProjection(ui::ROTATION_270, Rect(swapWH(mFlingerDisplaySize)),
                                      Rect(swapWH(mFlingerDisplaySize)));
    }

    void expectStateForHardwareTransform0() {
@@ -1497,9 +1497,9 @@ public:
        EXPECT_EQ(Rect(mHardwareDisplaySize), compositionState.displaySpace.content);
        // For 90, the orientedDisplaySpaceRect and layerStackSpaceRect have the hardware display
        // size width and height swapped
        EXPECT_EQ(Rect(SwapWH(mHardwareDisplaySize)),
        EXPECT_EQ(Rect(swapWH(mHardwareDisplaySize)),
                  compositionState.orientedDisplaySpace.content);
        EXPECT_EQ(Rect(SwapWH(mHardwareDisplaySize)), compositionState.layerStackSpace.content);
        EXPECT_EQ(Rect(swapWH(mHardwareDisplaySize)), compositionState.layerStackSpace.content);
        EXPECT_EQ(false, compositionState.needsFiltering);
    }

@@ -1523,9 +1523,9 @@ public:
        EXPECT_EQ(Rect(mHardwareDisplaySize), compositionState.displaySpace.content);
        // For 270, the orientedDisplaySpaceRect and layerStackSpaceRect have the hardware display
        // size width and height swapped
        EXPECT_EQ(Rect(SwapWH(mHardwareDisplaySize)),
        EXPECT_EQ(Rect(swapWH(mHardwareDisplaySize)),
                  compositionState.orientedDisplaySpace.content);
        EXPECT_EQ(Rect(SwapWH(mHardwareDisplaySize)), compositionState.layerStackSpace.content);
        EXPECT_EQ(Rect(swapWH(mHardwareDisplaySize)), compositionState.layerStackSpace.content);
        EXPECT_EQ(false, compositionState.needsFiltering);
    }