Loading include/gui/BufferQueueProducer.h +2 −0 Original line number Diff line number Diff line Loading @@ -195,6 +195,8 @@ private: // most updates). String8 mConsumerName; uint32_t mStickyTransform; }; // class BufferQueueProducer } // namespace android Loading include/gui/IGraphicBufferProducer.h +11 −4 Original line number Diff line number Diff line Loading @@ -273,15 +273,18 @@ public: // async - if the buffer is queued in asynchronous mode // fence - a fence that the consumer must wait on before reading the buffer, // set this to Fence::NO_FENCE if the buffer is ready immediately // sticky - the sticky transform set in Surface (only used by the LEGACY // camera mode). inline QueueBufferInput(int64_t timestamp, bool isAutoTimestamp, const Rect& crop, int scalingMode, uint32_t transform, bool async, const sp<Fence>& fence) const sp<Fence>& fence, uint32_t sticky = 0) : timestamp(timestamp), isAutoTimestamp(isAutoTimestamp), crop(crop), scalingMode(scalingMode), transform(transform), async(async), fence(fence) { } scalingMode(scalingMode), transform(transform), stickyTransform(sticky), async(async), fence(fence) { } inline void deflate(int64_t* outTimestamp, bool* outIsAutoTimestamp, Rect* outCrop, int* outScalingMode, uint32_t* outTransform, bool* outAsync, sp<Fence>* outFence) const { bool* outAsync, sp<Fence>* outFence, uint32_t* outStickyTransform = NULL) const { *outTimestamp = timestamp; *outIsAutoTimestamp = bool(isAutoTimestamp); *outCrop = crop; Loading @@ -289,6 +292,9 @@ public: *outTransform = transform; *outAsync = bool(async); *outFence = fence; if (outStickyTransform != NULL) { *outStickyTransform = stickyTransform; } } // Flattenable protocol Loading @@ -303,6 +309,7 @@ public: Rect crop; int scalingMode; uint32_t transform; uint32_t stickyTransform; int async; sp<Fence> fence; }; Loading include/gui/Surface.h +8 −0 Original line number Diff line number Diff line Loading @@ -138,6 +138,7 @@ private: int dispatchSetBuffersFormat(va_list args); int dispatchSetScalingMode(va_list args); int dispatchSetBuffersTransform(va_list args); int dispatchSetBuffersStickyTransform(va_list args); int dispatchSetBuffersTimestamp(va_list args); int dispatchSetCrop(va_list args); int dispatchSetPostTransformCrop(va_list args); Loading @@ -163,6 +164,7 @@ protected: virtual int setBuffersFormat(int format); virtual int setScalingMode(int mode); virtual int setBuffersTransform(int transform); virtual int setBuffersStickyTransform(int transform); virtual int setBuffersTimestamp(int64_t timestamp); virtual int setCrop(Rect const* rect); virtual int setUsage(uint32_t reqUsage); Loading Loading @@ -231,6 +233,12 @@ private: // buffer that gets queued. It is set by calling setTransform. uint32_t mTransform; // mStickyTransform is a transform that is applied on top of mTransform // in each buffer that is queued. This is typically used to force the // compositor to apply a transform, and will prevent the transform hint // from being set by the compositor. uint32_t mStickyTransform; // mDefaultWidth is default width of the buffers, regardless of the // native_window_set_buffers_dimensions call. uint32_t mDefaultWidth; Loading libs/gui/BufferQueueProducer.cpp +9 −2 Original line number Diff line number Diff line Loading @@ -37,7 +37,8 @@ namespace android { BufferQueueProducer::BufferQueueProducer(const sp<BufferQueueCore>& core) : mCore(core), mSlots(core->mSlots), mConsumerName() {} mConsumerName(), mStickyTransform(0) {} BufferQueueProducer::~BufferQueueProducer() {} Loading Loading @@ -509,10 +510,11 @@ status_t BufferQueueProducer::queueBuffer(int slot, Rect crop; int scalingMode; uint32_t transform; uint32_t stickyTransform; bool async; sp<Fence> fence; input.deflate(×tamp, &isAutoTimestamp, &crop, &scalingMode, &transform, &async, &fence); &async, &fence, &stickyTransform); if (fence == NULL) { BQ_LOGE("queueBuffer: fence is NULL"); Loading Loading @@ -601,6 +603,8 @@ status_t BufferQueueProducer::queueBuffer(int slot, item.mFence = fence; item.mIsDroppable = mCore->mDequeueBufferCannotBlock || async; mStickyTransform = stickyTransform; if (mCore->mQueue.empty()) { // When the queue is empty, we can ignore mDequeueBufferCannotBlock // and simply queue this buffer Loading Loading @@ -701,6 +705,9 @@ int BufferQueueProducer::query(int what, int *outValue) { case NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS: value = mCore->getMinUndequeuedBufferCountLocked(false); break; case NATIVE_WINDOW_STICKY_TRANSFORM: value = static_cast<int>(mStickyTransform); break; case NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND: value = (mCore->mQueue.size() > 1); break; Loading libs/gui/IGraphicBufferProducer.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -435,6 +435,7 @@ size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const { + sizeof(crop) + sizeof(scalingMode) + sizeof(transform) + sizeof(stickyTransform) + sizeof(async) + fence->getFlattenedSize(); } Loading @@ -454,6 +455,7 @@ status_t IGraphicBufferProducer::QueueBufferInput::flatten( FlattenableUtils::write(buffer, size, crop); FlattenableUtils::write(buffer, size, scalingMode); FlattenableUtils::write(buffer, size, transform); FlattenableUtils::write(buffer, size, stickyTransform); FlattenableUtils::write(buffer, size, async); return fence->flatten(buffer, size, fds, count); } Loading @@ -467,6 +469,7 @@ status_t IGraphicBufferProducer::QueueBufferInput::unflatten( + sizeof(crop) + sizeof(scalingMode) + sizeof(transform) + sizeof(stickyTransform) + sizeof(async); if (size < minNeeded) { Loading @@ -478,6 +481,7 @@ status_t IGraphicBufferProducer::QueueBufferInput::unflatten( FlattenableUtils::read(buffer, size, crop); FlattenableUtils::read(buffer, size, scalingMode); FlattenableUtils::read(buffer, size, transform); FlattenableUtils::read(buffer, size, stickyTransform); FlattenableUtils::read(buffer, size, async); fence = new Fence(); Loading Loading
include/gui/BufferQueueProducer.h +2 −0 Original line number Diff line number Diff line Loading @@ -195,6 +195,8 @@ private: // most updates). String8 mConsumerName; uint32_t mStickyTransform; }; // class BufferQueueProducer } // namespace android Loading
include/gui/IGraphicBufferProducer.h +11 −4 Original line number Diff line number Diff line Loading @@ -273,15 +273,18 @@ public: // async - if the buffer is queued in asynchronous mode // fence - a fence that the consumer must wait on before reading the buffer, // set this to Fence::NO_FENCE if the buffer is ready immediately // sticky - the sticky transform set in Surface (only used by the LEGACY // camera mode). inline QueueBufferInput(int64_t timestamp, bool isAutoTimestamp, const Rect& crop, int scalingMode, uint32_t transform, bool async, const sp<Fence>& fence) const sp<Fence>& fence, uint32_t sticky = 0) : timestamp(timestamp), isAutoTimestamp(isAutoTimestamp), crop(crop), scalingMode(scalingMode), transform(transform), async(async), fence(fence) { } scalingMode(scalingMode), transform(transform), stickyTransform(sticky), async(async), fence(fence) { } inline void deflate(int64_t* outTimestamp, bool* outIsAutoTimestamp, Rect* outCrop, int* outScalingMode, uint32_t* outTransform, bool* outAsync, sp<Fence>* outFence) const { bool* outAsync, sp<Fence>* outFence, uint32_t* outStickyTransform = NULL) const { *outTimestamp = timestamp; *outIsAutoTimestamp = bool(isAutoTimestamp); *outCrop = crop; Loading @@ -289,6 +292,9 @@ public: *outTransform = transform; *outAsync = bool(async); *outFence = fence; if (outStickyTransform != NULL) { *outStickyTransform = stickyTransform; } } // Flattenable protocol Loading @@ -303,6 +309,7 @@ public: Rect crop; int scalingMode; uint32_t transform; uint32_t stickyTransform; int async; sp<Fence> fence; }; Loading
include/gui/Surface.h +8 −0 Original line number Diff line number Diff line Loading @@ -138,6 +138,7 @@ private: int dispatchSetBuffersFormat(va_list args); int dispatchSetScalingMode(va_list args); int dispatchSetBuffersTransform(va_list args); int dispatchSetBuffersStickyTransform(va_list args); int dispatchSetBuffersTimestamp(va_list args); int dispatchSetCrop(va_list args); int dispatchSetPostTransformCrop(va_list args); Loading @@ -163,6 +164,7 @@ protected: virtual int setBuffersFormat(int format); virtual int setScalingMode(int mode); virtual int setBuffersTransform(int transform); virtual int setBuffersStickyTransform(int transform); virtual int setBuffersTimestamp(int64_t timestamp); virtual int setCrop(Rect const* rect); virtual int setUsage(uint32_t reqUsage); Loading Loading @@ -231,6 +233,12 @@ private: // buffer that gets queued. It is set by calling setTransform. uint32_t mTransform; // mStickyTransform is a transform that is applied on top of mTransform // in each buffer that is queued. This is typically used to force the // compositor to apply a transform, and will prevent the transform hint // from being set by the compositor. uint32_t mStickyTransform; // mDefaultWidth is default width of the buffers, regardless of the // native_window_set_buffers_dimensions call. uint32_t mDefaultWidth; Loading
libs/gui/BufferQueueProducer.cpp +9 −2 Original line number Diff line number Diff line Loading @@ -37,7 +37,8 @@ namespace android { BufferQueueProducer::BufferQueueProducer(const sp<BufferQueueCore>& core) : mCore(core), mSlots(core->mSlots), mConsumerName() {} mConsumerName(), mStickyTransform(0) {} BufferQueueProducer::~BufferQueueProducer() {} Loading Loading @@ -509,10 +510,11 @@ status_t BufferQueueProducer::queueBuffer(int slot, Rect crop; int scalingMode; uint32_t transform; uint32_t stickyTransform; bool async; sp<Fence> fence; input.deflate(×tamp, &isAutoTimestamp, &crop, &scalingMode, &transform, &async, &fence); &async, &fence, &stickyTransform); if (fence == NULL) { BQ_LOGE("queueBuffer: fence is NULL"); Loading Loading @@ -601,6 +603,8 @@ status_t BufferQueueProducer::queueBuffer(int slot, item.mFence = fence; item.mIsDroppable = mCore->mDequeueBufferCannotBlock || async; mStickyTransform = stickyTransform; if (mCore->mQueue.empty()) { // When the queue is empty, we can ignore mDequeueBufferCannotBlock // and simply queue this buffer Loading Loading @@ -701,6 +705,9 @@ int BufferQueueProducer::query(int what, int *outValue) { case NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS: value = mCore->getMinUndequeuedBufferCountLocked(false); break; case NATIVE_WINDOW_STICKY_TRANSFORM: value = static_cast<int>(mStickyTransform); break; case NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND: value = (mCore->mQueue.size() > 1); break; Loading
libs/gui/IGraphicBufferProducer.cpp +4 −0 Original line number Diff line number Diff line Loading @@ -435,6 +435,7 @@ size_t IGraphicBufferProducer::QueueBufferInput::getFlattenedSize() const { + sizeof(crop) + sizeof(scalingMode) + sizeof(transform) + sizeof(stickyTransform) + sizeof(async) + fence->getFlattenedSize(); } Loading @@ -454,6 +455,7 @@ status_t IGraphicBufferProducer::QueueBufferInput::flatten( FlattenableUtils::write(buffer, size, crop); FlattenableUtils::write(buffer, size, scalingMode); FlattenableUtils::write(buffer, size, transform); FlattenableUtils::write(buffer, size, stickyTransform); FlattenableUtils::write(buffer, size, async); return fence->flatten(buffer, size, fds, count); } Loading @@ -467,6 +469,7 @@ status_t IGraphicBufferProducer::QueueBufferInput::unflatten( + sizeof(crop) + sizeof(scalingMode) + sizeof(transform) + sizeof(stickyTransform) + sizeof(async); if (size < minNeeded) { Loading @@ -478,6 +481,7 @@ status_t IGraphicBufferProducer::QueueBufferInput::unflatten( FlattenableUtils::read(buffer, size, crop); FlattenableUtils::read(buffer, size, scalingMode); FlattenableUtils::read(buffer, size, transform); FlattenableUtils::read(buffer, size, stickyTransform); FlattenableUtils::read(buffer, size, async); fence = new Fence(); Loading