Loading include/gui/IGraphicBufferProducer.h +12 −4 Original line number Diff line number Diff line Loading @@ -295,6 +295,7 @@ public: struct QueueBufferInput : public Flattenable<QueueBufferInput> { friend class Flattenable<QueueBufferInput>; explicit inline QueueBufferInput(const Parcel& parcel); // timestamp - a monotonically increasing value in nanoseconds // isAutoTimestamp - if the timestamp was synthesized at queue time // dataSpace - description of the contents, interpretation depends on format Loading @@ -313,11 +314,12 @@ public: dataSpace(_dataSpace), crop(_crop), scalingMode(_scalingMode), transform(_transform), stickyTransform(_sticky), fence(_fence), surfaceDamage() { } inline void deflate(int64_t* outTimestamp, bool* outIsAutoTimestamp, android_dataspace* outDataSpace, Rect* outCrop, int* outScalingMode, uint32_t* outTransform, sp<Fence>* outFence, uint32_t* outStickyTransform = NULL) const { uint32_t* outStickyTransform = nullptr) const { *outTimestamp = timestamp; *outIsAutoTimestamp = bool(isAutoTimestamp); *outDataSpace = dataSpace; Loading Loading @@ -351,8 +353,7 @@ public: Region surfaceDamage; }; // QueueBufferOutput must be a POD structure struct QueueBufferOutput { struct QueueBufferOutput : public Flattenable<QueueBufferOutput> { // outWidth - filled with default width applied to the buffer // outHeight - filled with default height applied to the buffer // outTransformHint - filled with default transform applied to the buffer Loading @@ -369,6 +370,7 @@ public: *outNumPendingBuffers = numPendingBuffers; *outNextFrameNumber = nextFrameNumber; } inline void inflate(uint32_t inWidth, uint32_t inHeight, uint32_t inTransformHint, uint32_t inNumPendingBuffers, uint64_t inNextFrameNumber) { Loading @@ -378,7 +380,13 @@ public: numPendingBuffers = inNumPendingBuffers; 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 height{0}; uint32_t transformHint{0}; Loading libs/gui/IGraphicBufferProducer.cpp +75 −25 Original line number Diff line number Diff line Loading @@ -120,25 +120,25 @@ public: virtual status_t dequeueBuffer(int *buf, sp<Fence>* fence, uint32_t width, uint32_t height, PixelFormat format, uint32_t usage) { Parcel data, reply; data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); data.writeUint32(width); data.writeUint32(height); data.writeInt32(static_cast<int32_t>(format)); data.writeUint32(usage); status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply); if (result != NO_ERROR) { return result; } *buf = reply.readInt32(); bool nonNull = reply.readInt32(); if (nonNull) { *fence = new Fence(); result = reply.read(**fence); if (result != NO_ERROR) { fence->clear(); return result; } } result = reply.readInt32(); return result; } Loading Loading @@ -211,14 +211,21 @@ public: virtual status_t queueBuffer(int buf, const QueueBufferInput& input, QueueBufferOutput* output) { Parcel data, reply; data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); data.writeInt32(buf); data.write(input); status_t result = remote()->transact(QUEUE_BUFFER, data, &reply); if (result != NO_ERROR) { return result; } memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); result = reply.read(*output); if (result != NO_ERROR) { return result; } result = reply.readInt32(); return result; } Loading Loading @@ -265,7 +272,7 @@ public: if (result != NO_ERROR) { return result; } memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); reply.read(*output); result = reply.readInt32(); return result; } Loading Loading @@ -522,15 +529,14 @@ status_t BnGraphicBufferProducer::onTransact( uint32_t height = data.readUint32(); PixelFormat format = static_cast<PixelFormat>(data.readInt32()); uint32_t usage = data.readUint32(); int buf = 0; sp<Fence> fence; sp<Fence> fence = Fence::NO_FENCE; int result = dequeueBuffer(&buf, &fence, width, height, format, usage); reply->writeInt32(buf); reply->writeInt32(fence != NULL); if (fence != NULL) { reply->write(*fence); } reply->writeInt32(result); return NO_ERROR; } Loading Loading @@ -575,11 +581,11 @@ status_t BnGraphicBufferProducer::onTransact( CHECK_INTERFACE(IGraphicBufferProducer, data, reply); int buf = data.readInt32(); QueueBufferInput input(data); QueueBufferOutput* const output = reinterpret_cast<QueueBufferOutput *>( reply->writeInplace(sizeof(QueueBufferOutput))); memset(output, 0, sizeof(QueueBufferOutput)); status_t result = queueBuffer(buf, input, output); QueueBufferOutput output; status_t result = queueBuffer(buf, input, &output); reply->write(output); reply->writeInt32(result); return NO_ERROR; } Loading Loading @@ -611,11 +617,9 @@ status_t BnGraphicBufferProducer::onTransact( } int api = data.readInt32(); bool producerControlledByApp = data.readInt32(); QueueBufferOutput* const output = reinterpret_cast<QueueBufferOutput *>( reply->writeInplace(sizeof(QueueBufferOutput))); memset(output, 0, sizeof(QueueBufferOutput)); status_t res = connect(listener, api, producerControlledByApp, output); QueueBufferOutput output; status_t res = connect(listener, api, producerControlledByApp, &output); reply->write(output); reply->writeInt32(res); return NO_ERROR; } Loading Loading @@ -832,4 +836,50 @@ status_t IGraphicBufferProducer::QueueBufferInput::unflatten( 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 services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp +4 −11 Original line number Diff line number Diff line Loading @@ -303,13 +303,8 @@ void VirtualDisplaySurface::dumpAsString(String8& /* result */) const { } void VirtualDisplaySurface::resizeBuffers(const uint32_t w, const uint32_t h) { uint32_t tmpW, tmpH, transformHint, numPendingBuffers; uint64_t nextFrameNumber; mQueueBufferOutput.deflate(&tmpW, &tmpH, &transformHint, &numPendingBuffers, &nextFrameNumber); mQueueBufferOutput.inflate(w, h, transformHint, numPendingBuffers, nextFrameNumber); mQueueBufferOutput.width = w; mQueueBufferOutput.height = h; mSinkBufferWidth = w; mSinkBufferHeight = h; } Loading Loading @@ -618,10 +613,8 @@ status_t VirtualDisplaySurface::getUniqueId(uint64_t* /*outId*/) const { void VirtualDisplaySurface::updateQueueBufferOutput( const QueueBufferOutput& qbo) { uint32_t w, h, transformHint, numPendingBuffers; uint64_t nextFrameNumber; qbo.deflate(&w, &h, &transformHint, &numPendingBuffers, &nextFrameNumber); mQueueBufferOutput.inflate(w, h, 0, numPendingBuffers, nextFrameNumber); mQueueBufferOutput = qbo; mQueueBufferOutput.transformHint = 0; } void VirtualDisplaySurface::resetPerFrameState() { Loading Loading
include/gui/IGraphicBufferProducer.h +12 −4 Original line number Diff line number Diff line Loading @@ -295,6 +295,7 @@ public: struct QueueBufferInput : public Flattenable<QueueBufferInput> { friend class Flattenable<QueueBufferInput>; explicit inline QueueBufferInput(const Parcel& parcel); // timestamp - a monotonically increasing value in nanoseconds // isAutoTimestamp - if the timestamp was synthesized at queue time // dataSpace - description of the contents, interpretation depends on format Loading @@ -313,11 +314,12 @@ public: dataSpace(_dataSpace), crop(_crop), scalingMode(_scalingMode), transform(_transform), stickyTransform(_sticky), fence(_fence), surfaceDamage() { } inline void deflate(int64_t* outTimestamp, bool* outIsAutoTimestamp, android_dataspace* outDataSpace, Rect* outCrop, int* outScalingMode, uint32_t* outTransform, sp<Fence>* outFence, uint32_t* outStickyTransform = NULL) const { uint32_t* outStickyTransform = nullptr) const { *outTimestamp = timestamp; *outIsAutoTimestamp = bool(isAutoTimestamp); *outDataSpace = dataSpace; Loading Loading @@ -351,8 +353,7 @@ public: Region surfaceDamage; }; // QueueBufferOutput must be a POD structure struct QueueBufferOutput { struct QueueBufferOutput : public Flattenable<QueueBufferOutput> { // outWidth - filled with default width applied to the buffer // outHeight - filled with default height applied to the buffer // outTransformHint - filled with default transform applied to the buffer Loading @@ -369,6 +370,7 @@ public: *outNumPendingBuffers = numPendingBuffers; *outNextFrameNumber = nextFrameNumber; } inline void inflate(uint32_t inWidth, uint32_t inHeight, uint32_t inTransformHint, uint32_t inNumPendingBuffers, uint64_t inNextFrameNumber) { Loading @@ -378,7 +380,13 @@ public: numPendingBuffers = inNumPendingBuffers; 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 height{0}; uint32_t transformHint{0}; Loading
libs/gui/IGraphicBufferProducer.cpp +75 −25 Original line number Diff line number Diff line Loading @@ -120,25 +120,25 @@ public: virtual status_t dequeueBuffer(int *buf, sp<Fence>* fence, uint32_t width, uint32_t height, PixelFormat format, uint32_t usage) { Parcel data, reply; data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); data.writeUint32(width); data.writeUint32(height); data.writeInt32(static_cast<int32_t>(format)); data.writeUint32(usage); status_t result = remote()->transact(DEQUEUE_BUFFER, data, &reply); if (result != NO_ERROR) { return result; } *buf = reply.readInt32(); bool nonNull = reply.readInt32(); if (nonNull) { *fence = new Fence(); result = reply.read(**fence); if (result != NO_ERROR) { fence->clear(); return result; } } result = reply.readInt32(); return result; } Loading Loading @@ -211,14 +211,21 @@ public: virtual status_t queueBuffer(int buf, const QueueBufferInput& input, QueueBufferOutput* output) { Parcel data, reply; data.writeInterfaceToken(IGraphicBufferProducer::getInterfaceDescriptor()); data.writeInt32(buf); data.write(input); status_t result = remote()->transact(QUEUE_BUFFER, data, &reply); if (result != NO_ERROR) { return result; } memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); result = reply.read(*output); if (result != NO_ERROR) { return result; } result = reply.readInt32(); return result; } Loading Loading @@ -265,7 +272,7 @@ public: if (result != NO_ERROR) { return result; } memcpy(output, reply.readInplace(sizeof(*output)), sizeof(*output)); reply.read(*output); result = reply.readInt32(); return result; } Loading Loading @@ -522,15 +529,14 @@ status_t BnGraphicBufferProducer::onTransact( uint32_t height = data.readUint32(); PixelFormat format = static_cast<PixelFormat>(data.readInt32()); uint32_t usage = data.readUint32(); int buf = 0; sp<Fence> fence; sp<Fence> fence = Fence::NO_FENCE; int result = dequeueBuffer(&buf, &fence, width, height, format, usage); reply->writeInt32(buf); reply->writeInt32(fence != NULL); if (fence != NULL) { reply->write(*fence); } reply->writeInt32(result); return NO_ERROR; } Loading Loading @@ -575,11 +581,11 @@ status_t BnGraphicBufferProducer::onTransact( CHECK_INTERFACE(IGraphicBufferProducer, data, reply); int buf = data.readInt32(); QueueBufferInput input(data); QueueBufferOutput* const output = reinterpret_cast<QueueBufferOutput *>( reply->writeInplace(sizeof(QueueBufferOutput))); memset(output, 0, sizeof(QueueBufferOutput)); status_t result = queueBuffer(buf, input, output); QueueBufferOutput output; status_t result = queueBuffer(buf, input, &output); reply->write(output); reply->writeInt32(result); return NO_ERROR; } Loading Loading @@ -611,11 +617,9 @@ status_t BnGraphicBufferProducer::onTransact( } int api = data.readInt32(); bool producerControlledByApp = data.readInt32(); QueueBufferOutput* const output = reinterpret_cast<QueueBufferOutput *>( reply->writeInplace(sizeof(QueueBufferOutput))); memset(output, 0, sizeof(QueueBufferOutput)); status_t res = connect(listener, api, producerControlledByApp, output); QueueBufferOutput output; status_t res = connect(listener, api, producerControlledByApp, &output); reply->write(output); reply->writeInt32(res); return NO_ERROR; } Loading Loading @@ -832,4 +836,50 @@ status_t IGraphicBufferProducer::QueueBufferInput::unflatten( 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
services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp +4 −11 Original line number Diff line number Diff line Loading @@ -303,13 +303,8 @@ void VirtualDisplaySurface::dumpAsString(String8& /* result */) const { } void VirtualDisplaySurface::resizeBuffers(const uint32_t w, const uint32_t h) { uint32_t tmpW, tmpH, transformHint, numPendingBuffers; uint64_t nextFrameNumber; mQueueBufferOutput.deflate(&tmpW, &tmpH, &transformHint, &numPendingBuffers, &nextFrameNumber); mQueueBufferOutput.inflate(w, h, transformHint, numPendingBuffers, nextFrameNumber); mQueueBufferOutput.width = w; mQueueBufferOutput.height = h; mSinkBufferWidth = w; mSinkBufferHeight = h; } Loading Loading @@ -618,10 +613,8 @@ status_t VirtualDisplaySurface::getUniqueId(uint64_t* /*outId*/) const { void VirtualDisplaySurface::updateQueueBufferOutput( const QueueBufferOutput& qbo) { uint32_t w, h, transformHint, numPendingBuffers; uint64_t nextFrameNumber; qbo.deflate(&w, &h, &transformHint, &numPendingBuffers, &nextFrameNumber); mQueueBufferOutput.inflate(w, h, 0, numPendingBuffers, nextFrameNumber); mQueueBufferOutput = qbo; mQueueBufferOutput.transformHint = 0; } void VirtualDisplaySurface::resetPerFrameState() { Loading