summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorEric Penner <epenner@google.com>2014-09-30 11:28:30 -0700
committerEric Penner <epenner@google.com>2014-10-03 14:57:09 -0700
commit99a0afbaee9eddabc2b544e3a5c432901c1d498c (patch)
treeeb2add5f603b0709134e855f35d2a8016bcfc642 /libs
parent6c925ede620f4080227bb1fe8a41e4b4502348f8 (diff)
downloadframeworks_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.cpp12
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();