am 20fca75f: am b7702c5c: Merge "BufferQueueProducer: Throttle EGL frame production." into lmp-mr1-dev

* commit '20fca75fbd9141ebae6c9a28f5c09a837eb9caad':
  BufferQueueProducer: Throttle EGL frame production.
This commit is contained in:
Jesse Hall 2014-10-08 17:04:38 +00:00 committed by Android Git Automerger
commit 3dbf96cf06
2 changed files with 17 additions and 1 deletions

View File

@ -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

View File

@ -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();