Loading include/gui/IGraphicBufferProducer.h +12 −4 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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; Loading Loading @@ -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 Loading @@ -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) { Loading @@ -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}; Loading libs/gui/IGraphicBufferProducer.cpp +75 −25 Original line number Original line Diff line number Diff line Loading @@ -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; } } Loading Loading @@ -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; } } Loading Loading @@ -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; } } Loading Loading @@ -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; } } Loading Loading @@ -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; } } Loading Loading @@ -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; } } Loading Loading @@ -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 services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp +4 −11 Original line number Original line 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) { 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; } } Loading Loading @@ -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() { Loading Loading
include/gui/IGraphicBufferProducer.h +12 −4 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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; Loading Loading @@ -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 Loading @@ -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) { Loading @@ -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}; Loading
libs/gui/IGraphicBufferProducer.cpp +75 −25 Original line number Original line Diff line number Diff line Loading @@ -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; } } Loading Loading @@ -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; } } Loading Loading @@ -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; } } Loading Loading @@ -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; } } Loading Loading @@ -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; } } Loading Loading @@ -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; } } Loading Loading @@ -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
services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp +4 −11 Original line number Original line 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) { 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; } } Loading Loading @@ -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() { Loading