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

Commit f0bc2f1d authored by Mathias Agopian's avatar Mathias Agopian
Browse files

use in/out structures for queueBuffer() IPC

Change-Id: Ie125df2444b62a9a2200586a717dca268852afc9
parent cac72cdb
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -125,9 +125,9 @@ public:
    // nanoseconds, and must be monotonically increasing. Its other semantics
    // (zero point, etc) are client-dependent and should be documented by the
    // client.
    virtual status_t queueBuffer(int buf, int64_t timestamp,
            const Rect& crop, int scalingMode, uint32_t transform,
            uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform);
    virtual status_t queueBuffer(int buf,
            const QueueBufferInput& input, QueueBufferOutput* output);

    virtual void cancelBuffer(int buf);

    // setSynchronousMode set whether dequeueBuffer is synchronous or
+44 −3
Original line number Diff line number Diff line
@@ -82,9 +82,50 @@ protected:
    // outWidth, outHeight and outTransform are filled with the default width
    // and height of the window and current transform applied to buffers,
    // respectively.
    virtual status_t queueBuffer(int slot, int64_t timestamp,
            const Rect& crop, int scalingMode, uint32_t transform,
            uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) = 0;

    // QueueBufferInput must be a POD structure
    struct QueueBufferInput {
        inline QueueBufferInput(int64_t timestamp,
                const Rect& crop, int scalingMode, uint32_t transform)
        : timestamp(timestamp), crop(crop), scalingMode(scalingMode),
          transform(transform) { }
        inline void deflate(int64_t* outTimestamp, Rect* outCrop,
                int* outScalingMode, uint32_t* outTransform) const {
            *outTimestamp = timestamp;
            *outCrop = crop;
            *outScalingMode = scalingMode;
            *outTransform = transform;
        }
    private:
        int64_t timestamp;
        Rect crop;
        int scalingMode;
        uint32_t transform;
    };

    // QueueBufferOutput must be a POD structure
    struct QueueBufferOutput {
        inline QueueBufferOutput() { }
        inline void deflate(uint32_t* outWidth,
                uint32_t* outHeight, uint32_t* outTransformHint) const {
            *outWidth = width;
            *outHeight = height;
            *outTransformHint = transformHint;
        }
        inline void inflate(uint32_t inWidth, uint32_t inHeight,
                uint32_t inTransformHint) {
            width = inWidth;
            height = inHeight;
            transformHint = inTransformHint;
        }
    private:
        uint32_t width;
        uint32_t height;
        uint32_t transformHint;
    };

    virtual status_t queueBuffer(int slot,
            const QueueBufferInput& input, QueueBufferOutput* output) = 0;

    // cancelBuffer indicates that the client does not wish to fill in the
    // buffer associated with slot and transfers ownership of the slot back to
+12 −9
Original line number Diff line number Diff line
@@ -526,9 +526,8 @@ status_t BufferQueue::setSynchronousMode(bool enabled) {
    return err;
}

status_t BufferQueue::queueBuffer(int buf, int64_t timestamp,
        const Rect& crop, int scalingMode, uint32_t transform,
        uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) {
status_t BufferQueue::queueBuffer(int buf,
        const QueueBufferInput& input, QueueBufferOutput* output) {
    ATRACE_CALL();
    ATRACE_BUFFER_INDEX(buf);

@@ -581,6 +580,15 @@ status_t BufferQueue::queueBuffer(int buf, int64_t timestamp,
            }
        }

        int scalingMode;

        input.deflate(
                &mSlots[buf].mTimestamp,
                &mSlots[buf].mCrop,
                &scalingMode,
                &mSlots[buf].mTransform);


        switch (scalingMode) {
            case NATIVE_WINDOW_SCALING_MODE_FREEZE:
            case NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW:
@@ -592,19 +600,14 @@ status_t BufferQueue::queueBuffer(int buf, int64_t timestamp,
        }

        mSlots[buf].mBufferState = BufferSlot::QUEUED;
        mSlots[buf].mCrop = crop;
        mSlots[buf].mTransform = transform;
        mSlots[buf].mScalingMode = scalingMode;
        mSlots[buf].mTimestamp = timestamp;
        mFrameCounter++;
        mSlots[buf].mFrameNumber = mFrameCounter;

        mBufferHasBeenQueued = true;
        mDequeueCondition.broadcast();

        *outWidth = mDefaultWidth;
        *outHeight = mDefaultHeight;
        *outTransform = mTransformHint;
        output->inflate(mDefaultWidth, mDefaultHeight, mDefaultHeight);

        ATRACE_INT(mConsumerName.string(), mQueue.size());
    } // scope for the lock
+11 −21
Original line number Diff line number Diff line
@@ -98,23 +98,17 @@ public:
        return result;
    }

    virtual status_t queueBuffer(int buf, int64_t timestamp,
            const Rect& crop, int scalingMode, uint32_t transform,
            uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) {
    virtual status_t queueBuffer(int buf,
            const QueueBufferInput& input, QueueBufferOutput* output) {
        Parcel data, reply;
        data.writeInterfaceToken(ISurfaceTexture::getInterfaceDescriptor());
        data.writeInt32(buf);
        data.writeInt64(timestamp);
        memcpy(data.writeInplace(sizeof(Rect)), &crop, sizeof(Rect));
        data.writeInt32(scalingMode);
        data.writeInt32(transform);
        memcpy(data.writeInplace(sizeof(input)), &input, sizeof(input));
        status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
        if (result != NO_ERROR) {
            return result;
        }
        *outWidth = reply.readInt32();
        *outHeight = reply.readInt32();
        *outTransform = reply.readInt32();
        memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output));
        result = reply.readInt32();
        return result;
    }
@@ -222,17 +216,13 @@ status_t BnSurfaceTexture::onTransact(
        case QUEUE_BUFFER: {
            CHECK_INTERFACE(ISurfaceTexture, data, reply);
            int buf = data.readInt32();
            int64_t timestamp = data.readInt64();
            Rect crop( *reinterpret_cast<Rect const *>(data.readInplace(sizeof(Rect))) );
            int scalingMode = data.readInt32();
            uint32_t transform = data.readInt32();
            uint32_t outWidth, outHeight, outTransform;
            status_t result = queueBuffer(buf, timestamp,
                    crop, scalingMode, transform,
                    &outWidth, &outHeight, &outTransform);
            reply->writeInt32(outWidth);
            reply->writeInt32(outHeight);
            reply->writeInt32(outTransform);
            QueueBufferInput const* const input =
                    reinterpret_cast<QueueBufferInput const *>(
                            data.readInplace(sizeof(QueueBufferInput)));
            QueueBufferOutput* const output =
                    reinterpret_cast<QueueBufferOutput *>(
                            reply->writeInplace(sizeof(QueueBufferOutput)));
            status_t result = queueBuffer(buf, *input, output);
            reply->writeInt32(result);
            return NO_ERROR;
        } break;
+6 −3
Original line number Diff line number Diff line
@@ -230,12 +230,15 @@ int SurfaceTextureClient::queueBuffer(android_native_buffer_t* buffer) {
    if (i < 0) {
        return i;
    }
    status_t err = mSurfaceTexture->queueBuffer(i, timestamp,
            mCrop, mScalingMode, mTransform,
            &mDefaultWidth, &mDefaultHeight, &mTransformHint);

    ISurfaceTexture::QueueBufferOutput output;
    ISurfaceTexture::QueueBufferInput input(timestamp,
            mCrop, mScalingMode, mTransform);
    status_t err = mSurfaceTexture->queueBuffer(i, input, &output);
    if (err != OK)  {
        ALOGE("queueBuffer: error queuing buffer to SurfaceTexture, %d", err);
    }
    output.deflate(&mDefaultWidth, &mDefaultHeight, &mTransformHint);
    return err;
}