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

Commit 367c5684 authored by Robert Carr's avatar Robert Carr
Browse files

SurfaceControl: Add getTransformToDisplayInverse

For seamless rotation, the window manager needs
access to this flag, as it will apply the inverse
display transform itself to all other windows.

Bug: 28823590
Change-Id: Ifeee1078a9cb4cd01c8052570c137c6228b2f13d
parent 99e27f0b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -77,6 +77,9 @@ public:
     * Requires ACCESS_SURFACE_FLINGER permission
     */
    virtual status_t getLayerFrameStats(const sp<IBinder>& handle, FrameStats* outStats) const = 0;

    virtual status_t getTransformToDisplayInverse(const sp<IBinder>& handle,
            bool* outTransformToDisplayInverse) const = 0;
};

// ----------------------------------------------------------------------------
+3 −0
Original line number Diff line number Diff line
@@ -147,6 +147,9 @@ public:
    status_t clearLayerFrameStats(const sp<IBinder>& token) const;
    status_t getLayerFrameStats(const sp<IBinder>& token, FrameStats* outStats) const;

    status_t getTransformToDisplayInverse(const sp<IBinder>& token,
            bool* outTransformToDisplayInverse) const;

    static status_t clearAnimationFrameStats();
    static status_t getAnimationFrameStats(FrameStats* outStats);

+2 −0
Original line number Diff line number Diff line
@@ -97,6 +97,8 @@ public:
    status_t clearLayerFrameStats() const;
    status_t getLayerFrameStats(FrameStats* outStats) const;

    status_t getTransformToDisplayInverse(bool* outTransformToDisplayInverse) const;

private:
    // can't be copied
    SurfaceControl& operator = (SurfaceControl& rhs);
+50 −1
Original line number Diff line number Diff line
@@ -41,7 +41,8 @@ enum {
    CREATE_SURFACE = IBinder::FIRST_CALL_TRANSACTION,
    DESTROY_SURFACE,
    CLEAR_LAYER_FRAME_STATS,
    GET_LAYER_FRAME_STATS
    GET_LAYER_FRAME_STATS,
    GET_TRANSFORM_TO_DISPLAY_INVERSE
};

class BpSurfaceComposerClient : public BpInterface<ISurfaceComposerClient>
@@ -94,6 +95,35 @@ public:
        reply.read(*outStats);
        return reply.readInt32();
    }

    virtual status_t getTransformToDisplayInverse(const sp<IBinder>& handle,
            bool* outTransformToDisplayInverse) const {
        Parcel data, reply;
        status_t result =
                data.writeInterfaceToken(ISurfaceComposerClient::getInterfaceDescriptor());
        if (result != NO_ERROR) {
            return result;
        }
        result = data.writeStrongBinder(handle);
        if (result != NO_ERROR) {
            return result;
        }
        result = remote()->transact(GET_TRANSFORM_TO_DISPLAY_INVERSE, data, &reply);
        if (result != NO_ERROR) {
            return result;
        }
        int transformInverse;
        result = reply.readInt32(&transformInverse);
        if (result != NO_ERROR) {
            return result;
        }
        *outTransformToDisplayInverse = transformInverse != 0 ? true : false;
        status_t result2 = reply.readInt32(&result);
        if (result2 != NO_ERROR) {
            return result2;
        }
        return result;
    }
};

// Out-of-line virtual method definition to trigger vtable emission in this
@@ -145,6 +175,25 @@ status_t BnSurfaceComposerClient::onTransact(
            reply->writeInt32(result);
            return NO_ERROR;
        }
        case GET_TRANSFORM_TO_DISPLAY_INVERSE: {
            CHECK_INTERFACE(ISurfaceComposerClient, data, reply);
            sp<IBinder> handle;
            status_t result = data.readStrongBinder(&handle);
            if (result != NO_ERROR) {
                return result;
            }
            bool transformInverse = false;
            result = getTransformToDisplayInverse(handle, &transformInverse);
            if (result != NO_ERROR) {
                return result;
            }
            result = reply->writeInt32(transformInverse ? 1 : 0);
            if (result != NO_ERROR) {
                return result;
            }
            result = reply->writeInt32(NO_ERROR);
            return result;
        }
        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
+8 −0
Original line number Diff line number Diff line
@@ -612,6 +612,14 @@ status_t SurfaceComposerClient::getLayerFrameStats(const sp<IBinder>& token,
    return mClient->getLayerFrameStats(token, outStats);
}

status_t SurfaceComposerClient::getTransformToDisplayInverse(const sp<IBinder>& token,
        bool* outTransformToDisplayInverse) const {
    if (mStatus != NO_ERROR) {
        return mStatus;
    }
    return mClient->getTransformToDisplayInverse(token, outTransformToDisplayInverse);
}

inline Composer& SurfaceComposerClient::getComposer() {
    return mComposer;
}
Loading