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

Commit c3574f7b authored by Robert Carr's avatar Robert Carr
Browse files

Add setOverrideScalingMode to SurfaceControl

Provide an interface for the window manager to override
the client specified scaling mode. This makes it possible
for the window manager to force windows to be scaleable
for animations, etc, even when a resize is pending.

Bug: 27891386
Change-Id: Ic4aae9917bd6869ee0dbb425979b4e21c68342a3
parent 47babb84
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -138,6 +138,8 @@ public:
    status_t    setLayerStack(const sp<IBinder>& id, uint32_t layerStack);
    status_t    deferTransactionUntil(const sp<IBinder>& id,
            const sp<IBinder>& handle, uint64_t frameNumber);
    status_t    setOverrideScalingMode(const sp<IBinder>& id,
            int32_t overrideScalingMode);
    status_t    destroySurface(const sp<IBinder>& id);

    status_t clearLayerFrameStats(const sp<IBinder>& token) const;
+5 −0
Original line number Diff line number Diff line
@@ -77,6 +77,11 @@ public:
    // identified by handle reaches the given frameNumber
    status_t deferTransactionUntil(sp<IBinder> handle, uint64_t frameNumber);

    // Set an override scaling mode as documented in <system/window.h>
    // the override scaling mode will take precedence over any client
    // specified scaling mode. -1 will clear the override scaling mode.
    status_t setOverrideScalingMode(int32_t overrideScalingMode);

    static status_t writeSurfaceToParcel(
            const sp<SurfaceControl>& control, Parcel* parcel);

+5 −2
Original line number Diff line number Diff line
@@ -53,7 +53,8 @@ struct layer_state_t {
        eLayerStackChanged          = 0x00000080,
        eCropChanged                = 0x00000100,
        eDeferTransaction           = 0x00000200,
        eFinalCropChanged           = 0x00000400
        eFinalCropChanged           = 0x00000400,
        eOverrideScalingModeChanged = 0x00000800
    };

    layer_state_t()
@@ -61,7 +62,8 @@ struct layer_state_t {
            x(0), y(0), z(0), w(0), h(0), layerStack(0),
            alpha(0), flags(0), mask(0),
            reserved(0), crop(Rect::INVALID_RECT),
            finalCrop(Rect::INVALID_RECT), frameNumber(0)
            finalCrop(Rect::INVALID_RECT), frameNumber(0),
            overrideScalingMode(-1)
    {
        matrix.dsdx = matrix.dtdy = 1.0f;
        matrix.dsdy = matrix.dtdx = 0.0f;
@@ -93,6 +95,7 @@ struct layer_state_t {
            Rect            finalCrop;
            sp<IBinder>     handle;
            uint64_t        frameNumber;
            int32_t         overrideScalingMode;
            // non POD must be last. see write/read
            Region          transparentRegion;
};
+2 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ status_t layer_state_t::write(Parcel& output) const
    output.write(finalCrop);
    output.writeStrongBinder(handle);
    output.writeUint64(frameNumber);
    output.writeInt32(overrideScalingMode);
    output.write(transparentRegion);
    return NO_ERROR;
}
@@ -68,6 +69,7 @@ status_t layer_state_t::read(const Parcel& input)
    input.read(finalCrop);
    handle = input.readStrongBinder();
    frameNumber = input.readUint64();
    overrideScalingMode = input.readInt32();
    input.read(transparentRegion);
    return NO_ERROR;
}
+35 −0
Original line number Diff line number Diff line
@@ -163,6 +163,8 @@ public:
    status_t deferTransactionUntil(const sp<SurfaceComposerClient>& client,
            const sp<IBinder>& id, const sp<IBinder>& handle,
            uint64_t frameNumber);
    status_t setOverrideScalingMode(const sp<SurfaceComposerClient>& client,
            const sp<IBinder>& id, int32_t overrideScalingMode);

    void setDisplaySurface(const sp<IBinder>& token,
            const sp<IGraphicBufferProducer>& bufferProducer);
@@ -414,6 +416,33 @@ status_t Composer::deferTransactionUntil(
    return NO_ERROR;
}

status_t Composer::setOverrideScalingMode(
        const sp<SurfaceComposerClient>& client,
        const sp<IBinder>& id, int32_t overrideScalingMode) {
    Mutex::Autolock lock(mLock);
    layer_state_t* s = getLayerStateLocked(client, id);
    if (!s) {
        return BAD_INDEX;
    }

    switch (overrideScalingMode) {
        case NATIVE_WINDOW_SCALING_MODE_FREEZE:
        case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW:
        case NATIVE_WINDOW_SCALING_MODE_SCALE_CROP:
        case NATIVE_WINDOW_SCALING_MODE_NO_SCALE_CROP:
        case -1:
            break;
        default:
            ALOGE("unknown scaling mode: %d",
                    overrideScalingMode);
            return BAD_VALUE;
    }

    s->what |= layer_state_t::eOverrideScalingModeChanged;
    s->overrideScalingMode = overrideScalingMode;
    return NO_ERROR;
}

// ---------------------------------------------------------------------------

DisplayState& Composer::getDisplayStateLocked(const sp<IBinder>& token) {
@@ -650,6 +679,12 @@ status_t SurfaceComposerClient::deferTransactionUntil(const sp<IBinder>& id,
    return getComposer().deferTransactionUntil(this, id, handle, frameNumber);
}

status_t SurfaceComposerClient::setOverrideScalingMode(
        const sp<IBinder>& id, int32_t overrideScalingMode) {
    return getComposer().setOverrideScalingMode(
            this, id, overrideScalingMode);
}

// ----------------------------------------------------------------------------

void SurfaceComposerClient::setDisplaySurface(const sp<IBinder>& token,
Loading