Loading include/gui/BufferQueueProducer.h +6 −0 Original line number Diff line number Diff line Loading @@ -197,6 +197,12 @@ private: uint32_t mStickyTransform; // This saves the fence from the last queueBuffer, such that the // next queueBuffer call can throttle buffer production. The prior // queueBuffer's fence is not nessessarily available elsewhere, // since the previous buffer might have already been acquired. sp<Fence> mLastQueueBufferFence; }; // class BufferQueueProducer } // namespace android Loading libs/gui/BufferQueueProducer.cpp +11 −1 Original line number Diff line number Diff line Loading @@ -38,7 +38,8 @@ BufferQueueProducer::BufferQueueProducer(const sp<BufferQueueCore>& core) : mCore(core), mSlots(core->mSlots), mConsumerName(), mStickyTransform(0) {} mStickyTransform(0), mLastQueueBufferFence(Fence::NO_FENCE) {} BufferQueueProducer::~BufferQueueProducer() {} Loading Loading @@ -644,6 +645,15 @@ status_t BufferQueueProducer::queueBuffer(int slot, ATRACE_INT(mCore->mConsumerName.string(), mCore->mQueue.size()); } // Autolock scope // Wait without lock held if (mCore->mConnectedApi == NATIVE_WINDOW_API_EGL) { // Waiting here allows for two full buffers to be queued but not a // third. In the event that frames take varying time, this makes a // small trade-off in favor of latency rather than throughput. mLastQueueBufferFence->waitForever("Throttling EGL Production"); mLastQueueBufferFence = fence; } // Call back without lock held if (listener != NULL) { listener->onFrameAvailable(); Loading Loading
include/gui/BufferQueueProducer.h +6 −0 Original line number Diff line number Diff line Loading @@ -197,6 +197,12 @@ private: uint32_t mStickyTransform; // This saves the fence from the last queueBuffer, such that the // next queueBuffer call can throttle buffer production. The prior // queueBuffer's fence is not nessessarily available elsewhere, // since the previous buffer might have already been acquired. sp<Fence> mLastQueueBufferFence; }; // class BufferQueueProducer } // namespace android Loading
libs/gui/BufferQueueProducer.cpp +11 −1 Original line number Diff line number Diff line Loading @@ -38,7 +38,8 @@ BufferQueueProducer::BufferQueueProducer(const sp<BufferQueueCore>& core) : mCore(core), mSlots(core->mSlots), mConsumerName(), mStickyTransform(0) {} mStickyTransform(0), mLastQueueBufferFence(Fence::NO_FENCE) {} BufferQueueProducer::~BufferQueueProducer() {} Loading Loading @@ -644,6 +645,15 @@ status_t BufferQueueProducer::queueBuffer(int slot, ATRACE_INT(mCore->mConsumerName.string(), mCore->mQueue.size()); } // Autolock scope // Wait without lock held if (mCore->mConnectedApi == NATIVE_WINDOW_API_EGL) { // Waiting here allows for two full buffers to be queued but not a // third. In the event that frames take varying time, this makes a // small trade-off in favor of latency rather than throughput. mLastQueueBufferFence->waitForever("Throttling EGL Production"); mLastQueueBufferFence = fence; } // Call back without lock held if (listener != NULL) { listener->onFrameAvailable(); Loading