summaryrefslogtreecommitdiffstats
path: root/services/surfaceflinger/EventThread.cpp
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2012-04-10 21:04:02 -0700
committerMathias Agopian <mathias@google.com>2012-04-11 15:31:40 -0700
commit22ffb117b0c2a906bd04aef9738a52223cdd1dce (patch)
tree5d5b8915428be715ec6db9ace523f78668f4f50e /services/surfaceflinger/EventThread.cpp
parentb60314a12f3336b27d73920805ab07cbc498d857 (diff)
downloadframeworks_native-22ffb117b0c2a906bd04aef9738a52223cdd1dce.zip
frameworks_native-22ffb117b0c2a906bd04aef9738a52223cdd1dce.tar.gz
frameworks_native-22ffb117b0c2a906bd04aef9738a52223cdd1dce.tar.bz2
make sure to disable VSYNC while screen is off
Change-Id: If1894c43b0a39a2851e1280a35ae77bccd6d9abd
Diffstat (limited to 'services/surfaceflinger/EventThread.cpp')
-rw-r--r--services/surfaceflinger/EventThread.cpp56
1 files changed, 39 insertions, 17 deletions
diff --git a/services/surfaceflinger/EventThread.cpp b/services/surfaceflinger/EventThread.cpp
index 5813eef..d86c280 100644
--- a/services/surfaceflinger/EventThread.cpp
+++ b/services/surfaceflinger/EventThread.cpp
@@ -41,6 +41,7 @@ EventThread::EventThread(const sp<SurfaceFlinger>& flinger)
mHw(flinger->graphicPlane(0).editDisplayHardware()),
mLastVSyncTimestamp(0),
mVSyncTimestamp(0),
+ mUseSoftwareVSync(false),
mDeliveredEvents(0),
mDebugVsyncEnabled(false)
{
@@ -55,16 +56,6 @@ sp<EventThread::Connection> EventThread::createEventConnection() const {
return new Connection(const_cast<EventThread*>(this));
}
-nsecs_t EventThread::getLastVSyncTimestamp() const {
- Mutex::Autolock _l(mLock);
- return mLastVSyncTimestamp;
-}
-
-nsecs_t EventThread::getVSyncPeriod() const {
- return mHw.getRefreshPeriod();
-
-}
-
status_t EventThread::registerDisplayEventConnection(
const sp<EventThread::Connection>& connection) {
Mutex::Autolock _l(mLock);
@@ -108,6 +99,24 @@ void EventThread::requestNextVsync(
}
}
+void EventThread::onScreenReleased() {
+ Mutex::Autolock _l(mLock);
+ // wait for an eventual pending vsync to be serviced
+ if (!mUseSoftwareVSync) {
+ while (mVSyncTimestamp) {
+ mCondition.wait(mLock);
+ }
+ }
+ // disable reliance on h/w vsync
+ mUseSoftwareVSync = true;
+}
+
+void EventThread::onScreenAcquired() {
+ Mutex::Autolock _l(mLock);
+ mUseSoftwareVSync = false;
+}
+
+
void EventThread::onVSyncReceived(int, nsecs_t timestamp) {
Mutex::Autolock _l(mLock);
mVSyncTimestamp = timestamp;
@@ -121,7 +130,6 @@ bool EventThread::threadLoop() {
Vector< wp<EventThread::Connection> > displayEventConnections;
do {
-
Mutex::Autolock _l(mLock);
do {
// latch VSYNC event if any
@@ -145,7 +153,7 @@ bool EventThread::threadLoop() {
if (!waitForNextVsync) {
// we received a VSYNC but we have no clients
// don't report it, and disable VSYNC events
- disableVSync();
+ disableVSyncLocked();
} else {
// report VSYNC event
break;
@@ -157,12 +165,21 @@ bool EventThread::threadLoop() {
// disable VSYNC events then.
if (waitForNextVsync) {
// enable
- enableVSync();
+ enableVSyncLocked();
}
}
// wait for something to happen
- mCondition.wait(mLock);
+ if (mUseSoftwareVSync == true) {
+ // h/w vsync cannot be used (screen is off), so we use
+ // a timeout instead. it doesn't matter how imprecise this
+ // is, we just need to make sure to serve the clients
+ if (mCondition.waitRelative(mLock, ms2ns(16)) == TIMED_OUT) {
+ mVSyncTimestamp = systemTime(SYSTEM_TIME_MONOTONIC);
+ }
+ } else {
+ mCondition.wait(mLock);
+ }
} while(true);
// process vsync event
@@ -233,12 +250,15 @@ bool EventThread::threadLoop() {
return true;
}
-void EventThread::enableVSync() {
- mHw.getHwComposer().eventControl(HWComposer::EVENT_VSYNC, true);
+void EventThread::enableVSyncLocked() {
+ if (!mUseSoftwareVSync) {
+ // never enable h/w VSYNC when screen is off
+ mHw.getHwComposer().eventControl(HWComposer::EVENT_VSYNC, true);
+ }
mDebugVsyncEnabled = true;
}
-void EventThread::disableVSync() {
+void EventThread::disableVSyncLocked() {
mHw.getHwComposer().eventControl(HWComposer::EVENT_VSYNC, false);
mDebugVsyncEnabled = false;
}
@@ -252,6 +272,8 @@ void EventThread::dump(String8& result, char* buffer, size_t SIZE) const {
Mutex::Autolock _l(mLock);
result.appendFormat("VSYNC state: %s\n",
mDebugVsyncEnabled?"enabled":"disabled");
+ result.appendFormat(" soft-vsync: %s\n",
+ mUseSoftwareVSync?"enabled":"disabled");
result.appendFormat(" numListeners=%u,\n events-delivered: %u\n",
mDisplayEventConnections.size(), mDeliveredEvents);
for (size_t i=0 ; i<mDisplayEventConnections.size() ; i++) {