diff options
author | Eric Penner <epenner@google.com> | 2014-09-30 11:28:30 -0700 |
---|---|---|
committer | Eric Penner <epenner@google.com> | 2014-10-03 14:57:09 -0700 |
commit | 99a0afbaee9eddabc2b544e3a5c432901c1d498c (patch) | |
tree | eb2add5f603b0709134e855f35d2a8016bcfc642 /libs | |
parent | 6c925ede620f4080227bb1fe8a41e4b4502348f8 (diff) | |
download | frameworks_native-99a0afbaee9eddabc2b544e3a5c432901c1d498c.zip frameworks_native-99a0afbaee9eddabc2b544e3a5c432901c1d498c.tar.gz frameworks_native-99a0afbaee9eddabc2b544e3a5c432901c1d498c.tar.bz2 |
BufferQueueProducer: Throttle EGL frame production.
Throttling was previously controlled by a combination of the
driver and the number of buffers in the queue. This patch makes
a more consistent trade-off, which allows two GPU frames pending
but not three. More buffering could improve throughput in the
case of varying frame times, but this also increases latency.
Bug: 17502897
Change-Id: I4ee68019ca94c635294c5959931a555a6c4ef2df
Diffstat (limited to 'libs')
-rw-r--r-- | libs/gui/BufferQueueProducer.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp index a53775f..03bd4fd 100644 --- a/libs/gui/BufferQueueProducer.cpp +++ b/libs/gui/BufferQueueProducer.cpp @@ -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(); |