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

Commit 10ec9947 authored by Brian C. Anderson's avatar Brian C. Anderson Committed by Android (Google) Code Review
Browse files

Merge "BQ: Make QueueBufferOutput implement Flattenable"

parents 8487e531 baaad32c
Loading
Loading
Loading
Loading
+12 −4
Original line number Original line Diff line number Diff line
@@ -295,6 +295,7 @@ public:
    struct QueueBufferInput : public Flattenable<QueueBufferInput> {
    struct QueueBufferInput : public Flattenable<QueueBufferInput> {
        friend class Flattenable<QueueBufferInput>;
        friend class Flattenable<QueueBufferInput>;
        explicit inline QueueBufferInput(const Parcel& parcel);
        explicit inline QueueBufferInput(const Parcel& parcel);

        // timestamp - a monotonically increasing value in nanoseconds
        // timestamp - a monotonically increasing value in nanoseconds
        // isAutoTimestamp - if the timestamp was synthesized at queue time
        // isAutoTimestamp - if the timestamp was synthesized at queue time
        // dataSpace - description of the contents, interpretation depends on format
        // dataSpace - description of the contents, interpretation depends on format
@@ -313,11 +314,12 @@ public:
                  dataSpace(_dataSpace), crop(_crop), scalingMode(_scalingMode),
                  dataSpace(_dataSpace), crop(_crop), scalingMode(_scalingMode),
                  transform(_transform), stickyTransform(_sticky), fence(_fence),
                  transform(_transform), stickyTransform(_sticky), fence(_fence),
                  surfaceDamage() { }
                  surfaceDamage() { }

        inline void deflate(int64_t* outTimestamp, bool* outIsAutoTimestamp,
        inline void deflate(int64_t* outTimestamp, bool* outIsAutoTimestamp,
                android_dataspace* outDataSpace,
                android_dataspace* outDataSpace,
                Rect* outCrop, int* outScalingMode,
                Rect* outCrop, int* outScalingMode,
                uint32_t* outTransform, sp<Fence>* outFence,
                uint32_t* outTransform, sp<Fence>* outFence,
                uint32_t* outStickyTransform = NULL) const {
                uint32_t* outStickyTransform = nullptr) const {
            *outTimestamp = timestamp;
            *outTimestamp = timestamp;
            *outIsAutoTimestamp = bool(isAutoTimestamp);
            *outIsAutoTimestamp = bool(isAutoTimestamp);
            *outDataSpace = dataSpace;
            *outDataSpace = dataSpace;
@@ -351,8 +353,7 @@ public:
        Region surfaceDamage;
        Region surfaceDamage;
    };
    };


    // QueueBufferOutput must be a POD structure
    struct QueueBufferOutput : public Flattenable<QueueBufferOutput> {
    struct QueueBufferOutput {
        // outWidth - filled with default width applied to the buffer
        // outWidth - filled with default width applied to the buffer
        // outHeight - filled with default height applied to the buffer
        // outHeight - filled with default height applied to the buffer
        // outTransformHint - filled with default transform applied to the buffer
        // outTransformHint - filled with default transform applied to the buffer
@@ -369,6 +370,7 @@ public:
            *outNumPendingBuffers = numPendingBuffers;
            *outNumPendingBuffers = numPendingBuffers;
            *outNextFrameNumber = nextFrameNumber;
            *outNextFrameNumber = nextFrameNumber;
        }
        }

        inline void inflate(uint32_t inWidth, uint32_t inHeight,
        inline void inflate(uint32_t inWidth, uint32_t inHeight,
                uint32_t inTransformHint, uint32_t inNumPendingBuffers,
                uint32_t inTransformHint, uint32_t inNumPendingBuffers,
                uint64_t inNextFrameNumber) {
                uint64_t inNextFrameNumber) {
@@ -378,7 +380,13 @@ public:
            numPendingBuffers = inNumPendingBuffers;
            numPendingBuffers = inNumPendingBuffers;
            nextFrameNumber = inNextFrameNumber;
            nextFrameNumber = inNextFrameNumber;
        }
        }
    private:

        // Flattenable protocol
        size_t getFlattenedSize() const;
        size_t getFdCount() const;
        status_t flatten(void*& buffer, size_t& size, int*& fds, size_t& count) const;
        status_t unflatten(void const*& buffer, size_t& size, int const*& fds, size_t& count);

        uint32_t width{0};
        uint32_t width{0};
        uint32_t height{0};
        uint32_t height{0};
        uint32_t transformHint{0};
        uint32_t transformHint{0};
+75 −25
Original line number Original line Diff line number Diff line
@@ -120,25 +120,25 @@ public:
    virtual status_t dequeueBuffer(int *buf, sp<Fence>* fence, uint32_t width,
    virtual status_t dequeueBuffer(int *buf, sp<Fence>* fence, uint32_t width,
            uint32_t height, PixelFormat format, uint32_t usage) {
            uint32_t height, PixelFormat format, uint32_t usage) {
        Parcel data, reply;
        Parcel data, reply;

        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
        data.writeUint32(width);
        data.writeUint32(width);
        data.writeUint32(height);
        data.writeUint32(height);
        data.writeInt32(static_cast<int32_t>(format));
        data.writeInt32(static_cast<int32_t>(format));
        data.writeUint32(usage);
        data.writeUint32(usage);

        status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
        status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply);
        if (result != NO_ERROR) {
        if (result != NO_ERROR) {
            return result;
            return result;
        }
        }

        *buf = reply.readInt32();
        *buf = reply.readInt32();
        bool nonNull = reply.readInt32();
        if (nonNull) {
        *fence = new Fence();
        *fence = new Fence();
        result = reply.read(**fence);
        result = reply.read(**fence);
        if (result != NO_ERROR) {
        if (result != NO_ERROR) {
            fence->clear();
            fence->clear();
            return result;
            return result;
        }
        }
        }
        result = reply.readInt32();
        result = reply.readInt32();
        return result;
        return result;
    }
    }
@@ -211,14 +211,21 @@ public:
    virtual status_t queueBuffer(int buf,
    virtual status_t queueBuffer(int buf,
            const QueueBufferInput& input, QueueBufferOutput* output) {
            const QueueBufferInput& input, QueueBufferOutput* output) {
        Parcel data, reply;
        Parcel data, reply;

        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
        data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor());
        data.writeInt32(buf);
        data.writeInt32(buf);
        data.write(input);
        data.write(input);

        status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
        status_t result = remote()->transact(QUEUE_BUFFER, data, &reply);
        if (result != NO_ERROR) {
        if (result != NO_ERROR) {
            return result;
            return result;
        }
        }
        memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output));

        result = reply.read(*output);
        if (result != NO_ERROR) {
            return result;
        }

        result = reply.readInt32();
        result = reply.readInt32();
        return result;
        return result;
    }
    }
@@ -265,7 +272,7 @@ public:
        if (result != NO_ERROR) {
        if (result != NO_ERROR) {
            return result;
            return result;
        }
        }
        memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output));
        reply.read(*output);
        result = reply.readInt32();
        result = reply.readInt32();
        return result;
        return result;
    }
    }
@@ -522,15 +529,14 @@ status_t BnGraphicBufferProducer::onTransact(
            uint32_t height = data.readUint32();
            uint32_t height = data.readUint32();
            PixelFormat format = static_cast<PixelFormat>(data.readInt32());
            PixelFormat format = static_cast<PixelFormat>(data.readInt32());
            uint32_t usage = data.readUint32();
            uint32_t usage = data.readUint32();

            int buf = 0;
            int buf = 0;
            sp<Fence> fence;
            sp<Fence> fence = Fence::NO_FENCE;
            int result = dequeueBuffer(&buf, &fence, width, height, format,
            int result = dequeueBuffer(&buf, &fence, width, height, format,
                    usage);
                    usage);

            reply->writeInt32(buf);
            reply->writeInt32(buf);
            reply->writeInt32(fence != NULL);
            if (fence != NULL) {
            reply->write(*fence);
            reply->write(*fence);
            }
            reply->writeInt32(result);
            reply->writeInt32(result);
            return NO_ERROR;
            return NO_ERROR;
        }
        }
@@ -575,11 +581,11 @@ status_t BnGraphicBufferProducer::onTransact(
            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
            CHECK_INTERFACE(IGraphicBufferProducer, data, reply);
            int buf = data.readInt32();
            int buf = data.readInt32();
            QueueBufferInput input(data);
            QueueBufferInput input(data);
            QueueBufferOutput* const output =

                    reinterpret_cast<QueueBufferOutput *>(
            QueueBufferOutput output;
                            reply->writeInplace(sizeof(QueueBufferOutput)));
            status_t result = queueBuffer(buf, input, &output);
            memset(output, 0, sizeof(QueueBufferOutput));

            status_t result = queueBuffer(buf, input, output);
            reply->write(output);
            reply->writeInt32(result);
            reply->writeInt32(result);
            return NO_ERROR;
            return NO_ERROR;
        }
        }
@@ -611,11 +617,9 @@ status_t BnGraphicBufferProducer::onTransact(
            }
            }
            int api = data.readInt32();
            int api = data.readInt32();
            bool producerControlledByApp = data.readInt32();
            bool producerControlledByApp = data.readInt32();
            QueueBufferOutput* const output =
            QueueBufferOutput output;
                    reinterpret_cast<QueueBufferOutput *>(
            status_t res = connect(listener, api, producerControlledByApp, &output);
                            reply->writeInplace(sizeof(QueueBufferOutput)));
            reply->write(output);
            memset(output, 0, sizeof(QueueBufferOutput));
            status_t res = connect(listener, api, producerControlledByApp, output);
            reply->writeInt32(res);
            reply->writeInt32(res);
            return NO_ERROR;
            return NO_ERROR;
        }
        }
@@ -832,4 +836,50 @@ status_t IGraphicBufferProducer::QueueBufferInput::unflatten(
    return surfaceDamage.unflatten(buffer, size);
    return surfaceDamage.unflatten(buffer, size);
}
}


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

size_t IGraphicBufferProducer::QueueBufferOutput::getFlattenedSize() const {
    size_t size = sizeof(width)
                + sizeof(height)
                + sizeof(transformHint)
                + sizeof(numPendingBuffers)
                + sizeof(nextFrameNumber);
    return size;
}

size_t IGraphicBufferProducer::QueueBufferOutput::getFdCount() const {
    return 0;
}

status_t IGraphicBufferProducer::QueueBufferOutput::flatten(
        void*& buffer, size_t& size, int*& /*fds*/, size_t& /*count*/) const
{
    if (size < getFlattenedSize()) {
        return NO_MEMORY;
    }
    FlattenableUtils::write(buffer, size, width);
    FlattenableUtils::write(buffer, size, height);
    FlattenableUtils::write(buffer, size, transformHint);
    FlattenableUtils::write(buffer, size, numPendingBuffers);
    FlattenableUtils::write(buffer, size, nextFrameNumber);

    return NO_ERROR;
}

status_t IGraphicBufferProducer::QueueBufferOutput::unflatten(
        void const*& buffer, size_t& size,
        int const*& /*fds*/, size_t& /*count*/)
{
    if (size < getFlattenedSize()) {
        return NO_MEMORY;
    }
    FlattenableUtils::read(buffer, size, width);
    FlattenableUtils::read(buffer, size, height);
    FlattenableUtils::read(buffer, size, transformHint);
    FlattenableUtils::read(buffer, size, numPendingBuffers);
    FlattenableUtils::read(buffer, size, nextFrameNumber);

    return NO_ERROR;
}

}; // namespace android
}; // namespace android
+4 −11
Original line number Original line Diff line number Diff line
@@ -303,13 +303,8 @@ void VirtualDisplaySurface::dumpAsString(String8& /* result */) const {
}
}


void VirtualDisplaySurface::resizeBuffers(const uint32_t w, const uint32_t h) {
void VirtualDisplaySurface::resizeBuffers(const uint32_t w, const uint32_t h) {
    uint32_t tmpW, tmpH, transformHint, numPendingBuffers;
    mQueueBufferOutput.width = w;
    uint64_t nextFrameNumber;
    mQueueBufferOutput.height = h;
    mQueueBufferOutput.deflate(&tmpW, &tmpH, &transformHint, &numPendingBuffers,
            &nextFrameNumber);
    mQueueBufferOutput.inflate(w, h, transformHint, numPendingBuffers,
            nextFrameNumber);

    mSinkBufferWidth = w;
    mSinkBufferWidth = w;
    mSinkBufferHeight = h;
    mSinkBufferHeight = h;
}
}
@@ -618,10 +613,8 @@ status_t VirtualDisplaySurface::getUniqueId(uint64_t* /*outId*/) const {


void VirtualDisplaySurface::updateQueueBufferOutput(
void VirtualDisplaySurface::updateQueueBufferOutput(
        const QueueBufferOutput& qbo) {
        const QueueBufferOutput& qbo) {
    uint32_t w, h, transformHint, numPendingBuffers;
    mQueueBufferOutput = qbo;
    uint64_t nextFrameNumber;
    mQueueBufferOutput.transformHint = 0;
    qbo.deflate(&w, &h, &transformHint, &numPendingBuffers, &nextFrameNumber);
    mQueueBufferOutput.inflate(w, h, 0, numPendingBuffers, nextFrameNumber);
}
}


void VirtualDisplaySurface::resetPerFrameState() {
void VirtualDisplaySurface::resetPerFrameState() {