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

Commit 1681d959 authored by Ruben Brunk's avatar Ruben Brunk
Browse files

Add sticky transform to surfaceflinger.

Bug: 15116722

- Adds a sticky transform field that can be set from a
  SurfaceFlinger client Surface.  This transform is
  added to any transform applied to the Surface.

Change-Id: Idaa4311dfd027b2d2b8ea5e2c6cba2da5779d753
parent f3381cf1
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -195,6 +195,8 @@ private:
    // most updates).
    String8 mConsumerName;

    uint32_t mStickyTransform;

}; // class BufferQueueProducer

} // namespace android
+11 −4
Original line number Diff line number Diff line
@@ -273,15 +273,18 @@ public:
        // async - if the buffer is queued in asynchronous mode
        // fence - a fence that the consumer must wait on before reading the buffer,
        //         set this to Fence::NO_FENCE if the buffer is ready immediately
        // sticky - the sticky transform set in Surface (only used by the LEGACY
        //          camera mode).
        inline QueueBufferInput(int64_t timestamp, bool isAutoTimestamp,
                const Rect& crop, int scalingMode, uint32_t transform, bool async,
                const sp<Fence>& fence)
                const sp<Fence>& fence, uint32_t sticky = 0)
        : timestamp(timestamp), isAutoTimestamp(isAutoTimestamp), crop(crop),
          scalingMode(scalingMode), transform(transform), async(async),
          fence(fence) { }
          scalingMode(scalingMode), transform(transform), stickyTransform(sticky),
          async(async), fence(fence) { }
        inline void deflate(int64_t* outTimestamp, bool* outIsAutoTimestamp,
                Rect* outCrop, int* outScalingMode, uint32_t* outTransform,
                bool* outAsync, sp<Fence>* outFence) const {
                bool* outAsync, sp<Fence>* outFence,
                uint32_t* outStickyTransform = NULL) const {
            *outTimestamp = timestamp;
            *outIsAutoTimestamp = bool(isAutoTimestamp);
            *outCrop = crop;
@@ -289,6 +292,9 @@ public:
            *outTransform = transform;
            *outAsync = bool(async);
            *outFence = fence;
            if (outStickyTransform != NULL) {
                *outStickyTransform = stickyTransform;
            }
        }

        // Flattenable protocol
@@ -303,6 +309,7 @@ public:
        Rect crop;
        int scalingMode;
        uint32_t transform;
        uint32_t stickyTransform;
        int async;
        sp<Fence> fence;
    };
+8 −0
Original line number Diff line number Diff line
@@ -138,6 +138,7 @@ private:
    int dispatchSetBuffersFormat(va_list args);
    int dispatchSetScalingMode(va_list args);
    int dispatchSetBuffersTransform(va_list args);
    int dispatchSetBuffersStickyTransform(va_list args);
    int dispatchSetBuffersTimestamp(va_list args);
    int dispatchSetCrop(va_list args);
    int dispatchSetPostTransformCrop(va_list args);
@@ -163,6 +164,7 @@ protected:
    virtual int setBuffersFormat(int format);
    virtual int setScalingMode(int mode);
    virtual int setBuffersTransform(int transform);
    virtual int setBuffersStickyTransform(int transform);
    virtual int setBuffersTimestamp(int64_t timestamp);
    virtual int setCrop(Rect const* rect);
    virtual int setUsage(uint32_t reqUsage);
@@ -231,6 +233,12 @@ private:
    // buffer that gets queued. It is set by calling setTransform.
    uint32_t mTransform;

    // mStickyTransform is a transform that is applied on top of mTransform
    // in each buffer that is queued.  This is typically used to force the
    // compositor to apply a transform, and will prevent the transform hint
    // from being set by the compositor.
    uint32_t mStickyTransform;

     // mDefaultWidth is default width of the buffers, regardless of the
     // native_window_set_buffers_dimensions call.
     uint32_t mDefaultWidth;
+9 −2
Original line number Diff line number Diff line
@@ -37,7 +37,8 @@ namespace android {
BufferQueueProducer::BufferQueueProducer(const sp<BufferQueueCore>& core) :
    mCore(core),
    mSlots(core->mSlots),
    mConsumerName() {}
    mConsumerName(),
    mStickyTransform(0) {}

BufferQueueProducer::~BufferQueueProducer() {}

@@ -509,10 +510,11 @@ status_t BufferQueueProducer::queueBuffer(int slot,
    Rect crop;
    int scalingMode;
    uint32_t transform;
    uint32_t stickyTransform;
    bool async;
    sp<Fence> fence;
    input.deflate(&timestamp, &isAutoTimestamp, &crop, &scalingMode, &transform,
            &async, &fence);
            &async, &fence, &stickyTransform);

    if (fence == NULL) {
        BQ_LOGE("queueBuffer: fence is NULL");
@@ -601,6 +603,8 @@ status_t BufferQueueProducer::queueBuffer(int slot,
        item.mFence = fence;
        item.mIsDroppable = mCore->mDequeueBufferCannotBlock || async;

        mStickyTransform = stickyTransform;

        if (mCore->mQueue.empty()) {
            // When the queue is empty, we can ignore mDequeueBufferCannotBlock
            // and simply queue this buffer
@@ -701,6 +705,9 @@ int BufferQueueProducer::query(int what, int *outValue) {
        case NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS:
            value = mCore->getMinUndequeuedBufferCountLocked(false);
            break;
        case NATIVE_WINDOW_STICKY_TRANSFORM:
            value = static_cast<int>(mStickyTransform);
            break;
        case NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND:
            value = (mCore->mQueue.size() > 1);
            break;
+4 −0
Original line number Diff line number Diff line
@@ -435,6 +435,7 @@ size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const {
         + sizeof(crop)
         + sizeof(scalingMode)
         + sizeof(transform)
         + sizeof(stickyTransform)
         + sizeof(async)
         + fence->getFlattenedSize();
}
@@ -454,6 +455,7 @@ status_t IGraphicBufferProducer::QueueBufferInput::flatten(
    FlattenableUtils::write(buffer, size, crop);
    FlattenableUtils::write(buffer, size, scalingMode);
    FlattenableUtils::write(buffer, size, transform);
    FlattenableUtils::write(buffer, size, stickyTransform);
    FlattenableUtils::write(buffer, size, async);
    return fence->flatten(buffer, size, fds, count);
}
@@ -467,6 +469,7 @@ status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
            + sizeof(crop)
            + sizeof(scalingMode)
            + sizeof(transform)
            + sizeof(stickyTransform)
            + sizeof(async);

    if (size < minNeeded) {
@@ -478,6 +481,7 @@ status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
    FlattenableUtils::read(buffer, size, crop);
    FlattenableUtils::read(buffer, size, scalingMode);
    FlattenableUtils::read(buffer, size, transform);
    FlattenableUtils::read(buffer, size, stickyTransform);
    FlattenableUtils::read(buffer, size, async);

    fence = new Fence();
Loading