diff options
| author | 2016-11-30 21:26:39 +0000 | |
|---|---|---|
| committer | 2016-11-30 21:26:39 +0000 | |
| commit | 10ec9947b83cfc7c04a4a30a4ade2900ce73842a (patch) | |
| tree | 63ed3aea32c53ac7ef478d0ef36d980db99bcd45 | |
| parent | 8487e531d529bd6cc1dfd40d187f8312317fb4d8 (diff) | |
| parent | baaad32cd582bcc09db89135715717234ea398ea (diff) | |
Merge "BQ: Make QueueBufferOutput implement Flattenable"
| -rw-r--r-- | include/gui/IGraphicBufferProducer.h | 16 | ||||
| -rw-r--r-- | libs/gui/IGraphicBufferProducer.cpp | 100 | ||||
| -rw-r--r-- | services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp | 15 |
3 files changed, 91 insertions, 40 deletions
diff --git a/include/gui/IGraphicBufferProducer.h b/include/gui/IGraphicBufferProducer.h index 982cc9d620..20cffe059b 100644 --- a/include/gui/IGraphicBufferProducer.h +++ b/include/gui/IGraphicBufferProducer.h @@ -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 @@ -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; @@ -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 @@ -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) { @@ -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}; diff --git a/libs/gui/IGraphicBufferProducer.cpp b/libs/gui/IGraphicBufferProducer.cpp index 846c205c00..89f852c36b 100644 --- a/libs/gui/IGraphicBufferProducer.cpp +++ b/libs/gui/IGraphicBufferProducer.cpp @@ -120,24 +120,24 @@ 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; - } + *fence = new Fence(); + result = reply.read(**fence); + if (result != NO_ERROR) { + fence->clear(); + return result; } result = reply.readInt32(); return result; @@ -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; } @@ -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; } @@ -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->write(*fence); reply->writeInt32(result); return NO_ERROR; } @@ -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; } @@ -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; } @@ -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 diff --git a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp index 2190466ad9..69902e2ba2 100644 --- a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp +++ b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp @@ -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; } @@ -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() { |