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

Commit 35f0dda2 authored by Robert Carr's avatar Robert Carr
Browse files

SurfaceFlinger: Factor transformToDisplayInverse in-to buffer rejection

With transform to display inverse, like other transforms, we have a buffer
of one size rotated to fit geometry of another size. We haven't needed this
in the past because the only user of TransformToDisplayInverse was also using
NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW.

Bug: 74400997
Test: Manual
Change-Id: I118e802ff6ce6aca152620bde5d6d7ba890ecaa5
parent 2da6d849
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -426,9 +426,11 @@ Region BufferLayer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime
    bool queuedBuffer = false;
    LayerRejecter r(mDrawingState, getCurrentState(), recomputeVisibleRegions,
                    getProducerStickyTransform() != 0, mName.string(), mOverrideScalingMode,
                    mFreezeGeometryUpdates);
                    getTransformToDisplayInverse(),  mFreezeGeometryUpdates);

    status_t updateResult = mConsumer->updateTexImage(&r, mFlinger->mPrimaryDispSync, &mAutoRefresh,
                                                      &queuedBuffer, mLastFrameNumberReceived);

    if (updateResult == BufferQueue::PRESENT_LATER) {
        // Producer doesn't want buffer to be displayed yet.  Signal a
        // layer update so we check again at the next opportunity.
+9 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ LayerRejecter::LayerRejecter(Layer::State& front,
                             bool stickySet,
                             const char* name,
                             int32_t overrideScalingMode,
                             bool transformToDisplayInverse,
                             bool& freezePositionUpdates)
  : mFront(front),
    mCurrent(current),
@@ -38,6 +39,7 @@ LayerRejecter::LayerRejecter(Layer::State& front,
    mStickyTransformSet(stickySet),
    mName(name),
    mOverrideScalingMode(overrideScalingMode),
    mTransformToDisplayInverse(transformToDisplayInverse),
    mFreezeGeometryUpdates(freezePositionUpdates) {}

bool LayerRejecter::reject(const sp<GraphicBuffer>& buf, const BufferItem& item) {
@@ -54,6 +56,13 @@ bool LayerRejecter::reject(const sp<GraphicBuffer>& buf, const BufferItem& item)
        swap(bufWidth, bufHeight);
    }

    if (mTransformToDisplayInverse) {
        uint32_t invTransform = DisplayDevice::getPrimaryDisplayOrientationTransform();
        if (invTransform & Transform::ROT_90) {
            swap(bufWidth, bufHeight);
        }
    }

    int actualScalingMode = mOverrideScalingMode >= 0 ? mOverrideScalingMode : item.mScalingMode;
    bool isFixedSize = actualScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE;
    if (mFront.active != mFront.requested) {
+2 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ namespace android {
                      bool stickySet,
                      const char *name,
                      int32_t overrideScalingMode,
                      bool transformToDisplayInverse,
                      bool &freezePositionUpdates);

        virtual bool reject(const sp<GraphicBuffer> &buf, const BufferItem &item);
@@ -40,6 +41,7 @@ namespace android {
        bool mStickyTransformSet;
        const char *mName;
        int32_t mOverrideScalingMode;
        bool mTransformToDisplayInverse;
        bool &mFreezeGeometryUpdates;
    };
}  // namespace android