diff options
author | Ruchi Kandoi <kandoiruchi@google.com> | 2014-04-24 16:42:35 -0700 |
---|---|---|
committer | Ruchi Kandoi <kandoiruchi@google.com> | 2014-05-01 18:29:33 +0000 |
commit | f52b3c88f18c0546526996c839fbce74172e11c7 (patch) | |
tree | 5f958cf34171b4e7bde22a933112fee4739a3e2b | |
parent | 5d112a7dd60801b9993778624bcf9092a596ad62 (diff) | |
download | frameworks_native-f52b3c88f18c0546526996c839fbce74172e11c7.zip frameworks_native-f52b3c88f18c0546526996c839fbce74172e11c7.tar.gz frameworks_native-f52b3c88f18c0546526996c839fbce74172e11c7.tar.bz2 |
SurfaceFlinger: Adds the functionality to reduce refresh rate to half of
the default.
Feature added for the low power mode.
Change-Id: I2849e5ea335c0d2509fea1c315392bce7f20451d
Signed-off-by: Ruchi Kandoi <kandoiruchi@google.com>
-rw-r--r-- | services/surfaceflinger/DispSync.cpp | 23 | ||||
-rw-r--r-- | services/surfaceflinger/DispSync.h | 3 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 10 |
3 files changed, 35 insertions, 1 deletions
diff --git a/services/surfaceflinger/DispSync.cpp b/services/surfaceflinger/DispSync.cpp index 602f20a..a00ccdb 100644 --- a/services/surfaceflinger/DispSync.cpp +++ b/services/surfaceflinger/DispSync.cpp @@ -61,7 +61,10 @@ class DispSyncThread: public Thread { public: DispSyncThread(): + mLowPowerMode(false), mStop(false), + mLastVsyncSent(false), + mLastBufferFull(false), mPeriod(0), mPhase(0), mWakeupLatency(0) { @@ -145,7 +148,18 @@ public: } if (callbackInvocations.size() > 0) { - fireCallbackInvocations(callbackInvocations); + if (mLowPowerMode) { + if (!mLastVsyncSent || !mLastBufferFull) { + fireCallbackInvocations(callbackInvocations); + mLastVsyncSent = true; + } else + mLastVsyncSent = false; + } else { + fireCallbackInvocations(callbackInvocations); + } + mLastBufferFull = true; + } else { + mLastBufferFull = false; } } @@ -200,6 +214,7 @@ public: return !mEventListeners.empty(); } + bool mLowPowerMode; private: struct EventListener { @@ -272,6 +287,8 @@ private: } bool mStop; + bool mLastVsyncSent; + bool mLastBufferFull; nsecs_t mPeriod; nsecs_t mPhase; @@ -395,6 +412,10 @@ status_t DispSync::addEventListener(nsecs_t phase, return mThread->addEventListener(phase, callback); } +void DispSync::setLowPowerMode(bool enabled) { + mThread->mLowPowerMode = enabled; +} + status_t DispSync::removeEventListener(const sp<Callback>& callback) { Mutex::Autolock lock(mMutex); return mThread->removeEventListener(callback); diff --git a/services/surfaceflinger/DispSync.h b/services/surfaceflinger/DispSync.h index c4280aa..c2ae135 100644 --- a/services/surfaceflinger/DispSync.h +++ b/services/surfaceflinger/DispSync.h @@ -88,6 +88,9 @@ public: // turned on. It should NOT be used after that. void setPeriod(nsecs_t period); + // Setting the low power mode reduces the frame rate to half of the default + void setLowPowerMode(bool enabled); + // addEventListener registers a callback to be called repeatedly at the // given phase offset from the hardware vsync events. The callback is // called from a separate thread and it should return reasonably quickly diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index a346520..0142992 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2643,6 +2643,16 @@ status_t SurfaceFlinger::onTransact( repaintEverything(); return NO_ERROR; } + // This is an experimental interface + // Needs to be shifted to proper binder interface when we productize + case 1016: { + mPrimaryDispSync.setLowPowerMode(true); + return NO_ERROR; + } + case 1017: { + mPrimaryDispSync.setLowPowerMode(false); + return NO_ERROR; + } } } return err; |