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:
parent
5d112a7dd6
commit
f52b3c88f1
@ -61,7 +61,10 @@ class DispSyncThread: public Thread {
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
DispSyncThread():
|
DispSyncThread():
|
||||||
|
mLowPowerMode(false),
|
||||||
mStop(false),
|
mStop(false),
|
||||||
|
mLastVsyncSent(false),
|
||||||
|
mLastBufferFull(false),
|
||||||
mPeriod(0),
|
mPeriod(0),
|
||||||
mPhase(0),
|
mPhase(0),
|
||||||
mWakeupLatency(0) {
|
mWakeupLatency(0) {
|
||||||
@ -145,7 +148,18 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (callbackInvocations.size() > 0) {
|
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();
|
return !mEventListeners.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool mLowPowerMode;
|
||||||
private:
|
private:
|
||||||
|
|
||||||
struct EventListener {
|
struct EventListener {
|
||||||
@ -272,6 +287,8 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool mStop;
|
bool mStop;
|
||||||
|
bool mLastVsyncSent;
|
||||||
|
bool mLastBufferFull;
|
||||||
|
|
||||||
nsecs_t mPeriod;
|
nsecs_t mPeriod;
|
||||||
nsecs_t mPhase;
|
nsecs_t mPhase;
|
||||||
@ -395,6 +412,10 @@ status_t DispSync::addEventListener(nsecs_t phase,
|
|||||||
return mThread->addEventListener(phase, callback);
|
return mThread->addEventListener(phase, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DispSync::setLowPowerMode(bool enabled) {
|
||||||
|
mThread->mLowPowerMode = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
status_t DispSync::removeEventListener(const sp<Callback>& callback) {
|
status_t DispSync::removeEventListener(const sp<Callback>& callback) {
|
||||||
Mutex::Autolock lock(mMutex);
|
Mutex::Autolock lock(mMutex);
|
||||||
return mThread->removeEventListener(callback);
|
return mThread->removeEventListener(callback);
|
||||||
|
@ -88,6 +88,9 @@ public:
|
|||||||
// turned on. It should NOT be used after that.
|
// turned on. It should NOT be used after that.
|
||||||
void setPeriod(nsecs_t period);
|
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
|
// addEventListener registers a callback to be called repeatedly at the
|
||||||
// given phase offset from the hardware vsync events. The callback is
|
// given phase offset from the hardware vsync events. The callback is
|
||||||
// called from a separate thread and it should return reasonably quickly
|
// called from a separate thread and it should return reasonably quickly
|
||||||
|
@ -2643,6 +2643,16 @@ status_t SurfaceFlinger::onTransact(
|
|||||||
repaintEverything();
|
repaintEverything();
|
||||||
return NO_ERROR;
|
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;
|
return err;
|
||||||
|
Loading…
Reference in New Issue
Block a user