summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Matthew Bouyack <mbouyack@google.com> 2017-05-12 12:49:32 -0700
committer Matthew Bouyack <mbouyack@google.com> 2017-05-12 13:56:21 -0700
commit4de4ee3cb3ccb3bcf4ea507f7bd6e02ab29aeb75 (patch)
treeb9baced46475cfbe4d0c16d378032d6121a806a4
parent46d455b3abaa2c7a54c8d4e3b3cd5a03fe59ac2f (diff)
Fixes vsync behavior in power mode transitions.
Calling EventThread::onScreenAcquired enables hardware vsync and calling EventThread::onScreenReleased disables hardware vsync. The power modes 'NORMAL' and 'DOZE' should have hardware vsync enabled while power modes 'OFF' and 'DOZE_SUSPEND' should have hardware vsync disabled. This change correctly handles the transitions from 'OFF' to 'DOZE_SUSPEND' and from either 'OFF' or 'DOZE_SUSPEND' to 'NORMAL'. Previously these cases were handled incorrectly. Note that redundant calls to onScreenAcquired or onScreenReleased are safe. Fixes bug: 38232221 Change-Id: I7b00f97a67b157366364b3d26fe94533da07c263
-rw-r--r--services/surfaceflinger/SurfaceFlinger.cpp7
-rw-r--r--services/surfaceflinger/SurfaceFlinger_hwc1.cpp7
2 files changed, 10 insertions, 4 deletions
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 78aa673842..448f12ac95 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -2619,7 +2619,8 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
if (currentMode == HWC_POWER_MODE_OFF) {
// Turn on the display
getHwComposer().setPowerMode(type, mode);
- if (type == DisplayDevice::DISPLAY_PRIMARY) {
+ if (type == DisplayDevice::DISPLAY_PRIMARY &&
+ mode != HWC_POWER_MODE_DOZE_SUSPEND) {
// FIXME: eventthread only knows about the main display right now
mEventThread->onScreenAcquired();
resyncToHardwareVsync(true);
@@ -2651,7 +2652,8 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
getHwComposer().setPowerMode(type, mode);
mVisibleRegionsDirty = true;
// from this point on, SF will stop drawing on this display
- } else if (mode == HWC_POWER_MODE_DOZE) {
+ } else if (mode == HWC_POWER_MODE_DOZE ||
+ mode == HWC_POWER_MODE_NORMAL) {
// Update display while dozing
getHwComposer().setPowerMode(type, mode);
if (type == DisplayDevice::DISPLAY_PRIMARY) {
@@ -2668,6 +2670,7 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
}
getHwComposer().setPowerMode(type, mode);
} else {
+ ALOGE("Attempting to set unknown power mode: %d\n", mode);
getHwComposer().setPowerMode(type, mode);
}
}
diff --git a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp
index 627bcc3255..a371c76e6d 100644
--- a/services/surfaceflinger/SurfaceFlinger_hwc1.cpp
+++ b/services/surfaceflinger/SurfaceFlinger_hwc1.cpp
@@ -2535,7 +2535,8 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
if (currentMode == HWC_POWER_MODE_OFF) {
// Turn on the display
getHwComposer().setPowerMode(type, mode);
- if (type == DisplayDevice::DISPLAY_PRIMARY) {
+ if (type == DisplayDevice::DISPLAY_PRIMARY &&
+ mode != HWC_POWER_MODE_DOZE_SUSPEND) {
// FIXME: eventthread only knows about the main display right now
mEventThread->onScreenAcquired();
resyncToHardwareVsync(true);
@@ -2567,7 +2568,8 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
getHwComposer().setPowerMode(type, mode);
mVisibleRegionsDirty = true;
// from this point on, SF will stop drawing on this display
- } else if (mode == HWC_POWER_MODE_DOZE) {
+ } else if (mode == HWC_POWER_MODE_DOZE ||
+ mode == HWC_POWER_MODE_NORMAL) {
// Update display while dozing
getHwComposer().setPowerMode(type, mode);
if (type == DisplayDevice::DISPLAY_PRIMARY) {
@@ -2584,6 +2586,7 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
}
getHwComposer().setPowerMode(type, mode);
} else {
+ ALOGE("Attempting to set unknown power mode: %d\n", mode);
getHwComposer().setPowerMode(type, mode);
}
}