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

Commit 6643cd81 authored by Rashed Abdel-Tawab's avatar Rashed Abdel-Tawab Committed by Lloyd Pique
Browse files

CompositionEngine: fix HWC transform calculation

Use the correct display transform in calculateOutputRelativeBufferTransform().
When SF_PRIMARY_DISPLAY_ORIENTATION is set, DisplayDevice only updates the
logical to physical transform; OutputCompositionState.orientation doesn't
change.

Test: - OutputLayerTest.displayInstallOrientationBufferTransformSetTo90
      - Run "dumpsys SurfaceFlinger" on a device with SF_PRIMARY_DISPLAY_ORIENTATION
        set to 90 and verify that the HWC transform is 0 (identity)
      - screencap
Change-Id: I079b5ea22de8d47a7fb7233d01decfbd4b578be8
parent 8a5092d0
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -231,7 +231,7 @@ uint32_t OutputLayer::calculateOutputRelativeBufferTransform() const {
     * (NOTE: the matrices are multiplied in reverse order)
     * (NOTE: the matrices are multiplied in reverse order)
     */
     */
    const ui::Transform& layerTransform = layerState.geomLayerTransform;
    const ui::Transform& layerTransform = layerState.geomLayerTransform;
    const ui::Transform displayTransform{outputState.orientation};
    const ui::Transform displayTransform{outputState.transform};
    const ui::Transform bufferTransform{layerState.geomBufferTransform};
    const ui::Transform bufferTransform{layerState.geomBufferTransform};
    ui::Transform transform(displayTransform * layerTransform * bufferTransform);
    ui::Transform transform(displayTransform * layerTransform * bufferTransform);


+17 −0
Original line number Original line Diff line number Diff line
@@ -364,6 +364,7 @@ TEST_F(OutputLayerTest, calculateOutputRelativeBufferTransformTestsNeeded) {
        mLayerFEState.geomLayerTransform.set(entry.layer, 1920, 1080);
        mLayerFEState.geomLayerTransform.set(entry.layer, 1920, 1080);
        mLayerFEState.geomBufferTransform = entry.buffer;
        mLayerFEState.geomBufferTransform = entry.buffer;
        mOutputState.orientation = entry.display;
        mOutputState.orientation = entry.display;
        mOutputState.transform = ui::Transform{entry.display};


        auto actual = mOutputLayer.calculateOutputRelativeBufferTransform();
        auto actual = mOutputLayer.calculateOutputRelativeBufferTransform();
        EXPECT_EQ(entry.expected, actual) << "entry " << i;
        EXPECT_EQ(entry.expected, actual) << "entry " << i;
@@ -422,6 +423,7 @@ TEST_F(OutputLayerTest,
        mLayerFEState.geomLayerTransform = ui::Transform{entry.layer};
        mLayerFEState.geomLayerTransform = ui::Transform{entry.layer};
        mLayerFEState.geomBufferTransform = entry.buffer;
        mLayerFEState.geomBufferTransform = entry.buffer;
        mOutputState.orientation = entry.display;
        mOutputState.orientation = entry.display;
        mOutputState.transform = ui::Transform{entry.display};


        auto actual = mOutputLayer.calculateOutputRelativeBufferTransform();
        auto actual = mOutputLayer.calculateOutputRelativeBufferTransform();
        EXPECT_EQ(entry.expected, actual) << "entry " << i;
        EXPECT_EQ(entry.expected, actual) << "entry " << i;
@@ -764,6 +766,21 @@ TEST_F(OutputLayerWriteStateToHWCTest, canSetAllState) {
    mOutputLayer.writeStateToHWC(true);
    mOutputLayer.writeStateToHWC(true);
}
}


TEST_F(OutputLayerTest, displayInstallOrientationBufferTransformSetTo90) {
    mLayerFEState.geomBufferUsesDisplayInverseTransform = false;
    mLayerFEState.geomLayerTransform = ui::Transform{TR_IDENT};
    // This test simulates a scenario where displayInstallOrientation is set to
    // ROT_90. This only has an effect on the transform; orientation stays 0 (see
    // DisplayDevice::setProjection).
    mOutputState.orientation = TR_IDENT;
    mOutputState.transform = ui::Transform{TR_ROT_90};
    // Buffers are pre-rotated based on the transform hint (ROT_90); their
    // geomBufferTransform is set to the inverse transform.
    mLayerFEState.geomBufferTransform = TR_ROT_270;

    EXPECT_EQ(TR_IDENT, mOutputLayer.calculateOutputRelativeBufferTransform());
}

TEST_F(OutputLayerWriteStateToHWCTest, canSetPerFrameStateForSolidColor) {
TEST_F(OutputLayerWriteStateToHWCTest, canSetPerFrameStateForSolidColor) {
    mLayerFEState.compositionType = Hwc2::IComposerClient::Composition::SOLID_COLOR;
    mLayerFEState.compositionType = Hwc2::IComposerClient::Composition::SOLID_COLOR;