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>
This commit is contained in:
Ruchi Kandoi 2014-04-24 16:42:35 -07:00
parent 5d112a7dd6
commit f52b3c88f1
3 changed files with 35 additions and 1 deletions

View File

@ -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);

View File

@ -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

View File

@ -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;