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

Commit d40bea8d authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix wrong framebufferspace computation"

parents 7f23d3b8 209ae617
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);
    }