EventThread: wake for two frames after vsync request by default
The common case seems to be that many frames are rendered in a row
before the system quiesces, but EventThread assumes that only a single
frame will be rendered after a call to requestNextVsync. This patch
moves requestNextVsync to wake for two frames by default, allowing it to
skip the EventThread wakeup when there's a pending wakeup for that
EventThread already.
Test: no EventThread wakeups from requestNextVsync in BouncyBall
bug: 169368457
Change-Id: I5cb880dad27062e158de640540a73cba59b223e5
diff --git a/services/surfaceflinger/Scheduler/EventThread.cpp b/services/surfaceflinger/Scheduler/EventThread.cpp
index 3307388..bf2a509 100644
--- a/services/surfaceflinger/Scheduler/EventThread.cpp
+++ b/services/surfaceflinger/Scheduler/EventThread.cpp
@@ -62,6 +62,8 @@
return "VSyncRequest::None";
case VSyncRequest::Single:
return "VSyncRequest::Single";
+ case VSyncRequest::SingleSuppressCallback:
+ return "VSyncRequest::SingleSuppressCallback";
default:
return StringPrintf("VSyncRequest::Periodic{period=%d}", vsyncPeriod(request));
}
@@ -267,6 +269,8 @@
if (connection->vsyncRequest == VSyncRequest::None) {
connection->vsyncRequest = VSyncRequest::Single;
mCondition.notify_all();
+ } else if (connection->vsyncRequest == VSyncRequest::SingleSuppressCallback) {
+ connection->vsyncRequest = VSyncRequest::Single;
}
}
@@ -451,8 +455,11 @@
switch (connection->vsyncRequest) {
case VSyncRequest::None:
return false;
- case VSyncRequest::Single:
+ case VSyncRequest::SingleSuppressCallback:
connection->vsyncRequest = VSyncRequest::None;
+ return false;
+ case VSyncRequest::Single:
+ connection->vsyncRequest = VSyncRequest::SingleSuppressCallback;
return true;
case VSyncRequest::Periodic:
return true;