am b7702c5c
: Merge "BufferQueueProducer: Throttle EGL frame production." into lmp-mr1-dev
* commit 'b7702c5ce7f010fa5f19646fd79f28ff04e7014b': BufferQueueProducer: Throttle EGL frame production.
This commit is contained in:
commit
20fca75fbd
@ -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
|
||||
|
@ -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() {}
|
||||
|
||||
@ -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…
Reference in New Issue
Block a user