Loading services/surfaceflinger/SurfaceFlinger.cpp +14 −10 Original line number Diff line number Diff line Loading @@ -1541,14 +1541,12 @@ void SurfaceFlinger::setPrimaryVsyncEnabled(bool enabled) { void SurfaceFlinger::setPrimaryVsyncEnabledInternal(bool enabled) { ATRACE_CALL(); mHWCVsyncPendingState = enabled ? HWC2::Vsync::Enable : HWC2::Vsync::Disable; if (const auto displayId = getInternalDisplayIdLocked()) { sp<DisplayDevice> display = getDefaultDisplayDeviceLocked(); if (display && display->isPoweredOn()) { getHwComposer().setVsyncEnabled(*displayId, enabled ? HWC2::Vsync::Enable : HWC2::Vsync::Disable); } else { // Cache the latest vsync state and apply it when screen is on again mEnableHWVsyncScreenOn = enabled; setVsyncEnabledInHWC(*displayId, mHWCVsyncPendingState); } } } Loading Loading @@ -4435,6 +4433,13 @@ void SurfaceFlinger::initializeDisplays() { new LambdaMessage([this]() NO_THREAD_SAFETY_ANALYSIS { onInitializeDisplays(); })); } void SurfaceFlinger::setVsyncEnabledInHWC(DisplayId displayId, HWC2::Vsync enabled) { if (mHWCVsyncState != enabled) { getHwComposer().setVsyncEnabled(displayId, enabled); mHWCVsyncState = enabled; } } void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& display, int mode) { if (display->isVirtual()) { ALOGE("%s: Invalid operation on virtual display", __FUNCTION__); Loading @@ -4461,11 +4466,7 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& display, int // Turn on the display getHwComposer().setPowerMode(*displayId, mode); if (display->isPrimary() && mode != HWC_POWER_MODE_DOZE_SUSPEND) { if (mEnableHWVsyncScreenOn) { setPrimaryVsyncEnabledInternal(mEnableHWVsyncScreenOn); mEnableHWVsyncScreenOn = false; } setVsyncEnabledInHWC(*displayId, mHWCVsyncPendingState); mScheduler->onScreenAcquired(mAppConnectionHandle); mScheduler->resyncToHardwareVsync(true, getVsyncPeriod()); } Loading @@ -4491,6 +4492,9 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& display, int mScheduler->onScreenReleased(mAppConnectionHandle); } // Make sure HWVsync is disabled before turning off the display setVsyncEnabledInHWC(*displayId, HWC2::Vsync::Disable); getHwComposer().setPowerMode(*displayId, mode); mVisibleRegionsDirty = true; // from this point on, SF will stop drawing on this display Loading services/surfaceflinger/SurfaceFlinger.h +4 −2 Original line number Diff line number Diff line Loading @@ -845,6 +845,7 @@ private: } bool previousFrameMissed(); void setVsyncEnabledInHWC(DisplayId displayId, HWC2::Vsync enabled); /* * Debugging & dumpsys Loading Loading @@ -1179,8 +1180,9 @@ private: // be any issues with a raw pointer referencing an invalid object. std::unordered_set<Layer*> mOffscreenLayers; // Flag to indicate whether to re-enable HWVsync when screen is on bool mEnableHWVsyncScreenOn = false; // Flags to capture the state of Vsync in HWC HWC2::Vsync mHWCVsyncState = HWC2::Vsync::Disable; HWC2::Vsync mHWCVsyncPendingState = HWC2::Vsync::Disable; }; } // namespace android Loading
services/surfaceflinger/SurfaceFlinger.cpp +14 −10 Original line number Diff line number Diff line Loading @@ -1541,14 +1541,12 @@ void SurfaceFlinger::setPrimaryVsyncEnabled(bool enabled) { void SurfaceFlinger::setPrimaryVsyncEnabledInternal(bool enabled) { ATRACE_CALL(); mHWCVsyncPendingState = enabled ? HWC2::Vsync::Enable : HWC2::Vsync::Disable; if (const auto displayId = getInternalDisplayIdLocked()) { sp<DisplayDevice> display = getDefaultDisplayDeviceLocked(); if (display && display->isPoweredOn()) { getHwComposer().setVsyncEnabled(*displayId, enabled ? HWC2::Vsync::Enable : HWC2::Vsync::Disable); } else { // Cache the latest vsync state and apply it when screen is on again mEnableHWVsyncScreenOn = enabled; setVsyncEnabledInHWC(*displayId, mHWCVsyncPendingState); } } } Loading Loading @@ -4435,6 +4433,13 @@ void SurfaceFlinger::initializeDisplays() { new LambdaMessage([this]() NO_THREAD_SAFETY_ANALYSIS { onInitializeDisplays(); })); } void SurfaceFlinger::setVsyncEnabledInHWC(DisplayId displayId, HWC2::Vsync enabled) { if (mHWCVsyncState != enabled) { getHwComposer().setVsyncEnabled(displayId, enabled); mHWCVsyncState = enabled; } } void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& display, int mode) { if (display->isVirtual()) { ALOGE("%s: Invalid operation on virtual display", __FUNCTION__); Loading @@ -4461,11 +4466,7 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& display, int // Turn on the display getHwComposer().setPowerMode(*displayId, mode); if (display->isPrimary() && mode != HWC_POWER_MODE_DOZE_SUSPEND) { if (mEnableHWVsyncScreenOn) { setPrimaryVsyncEnabledInternal(mEnableHWVsyncScreenOn); mEnableHWVsyncScreenOn = false; } setVsyncEnabledInHWC(*displayId, mHWCVsyncPendingState); mScheduler->onScreenAcquired(mAppConnectionHandle); mScheduler->resyncToHardwareVsync(true, getVsyncPeriod()); } Loading @@ -4491,6 +4492,9 @@ void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& display, int mScheduler->onScreenReleased(mAppConnectionHandle); } // Make sure HWVsync is disabled before turning off the display setVsyncEnabledInHWC(*displayId, HWC2::Vsync::Disable); getHwComposer().setPowerMode(*displayId, mode); mVisibleRegionsDirty = true; // from this point on, SF will stop drawing on this display Loading
services/surfaceflinger/SurfaceFlinger.h +4 −2 Original line number Diff line number Diff line Loading @@ -845,6 +845,7 @@ private: } bool previousFrameMissed(); void setVsyncEnabledInHWC(DisplayId displayId, HWC2::Vsync enabled); /* * Debugging & dumpsys Loading Loading @@ -1179,8 +1180,9 @@ private: // be any issues with a raw pointer referencing an invalid object. std::unordered_set<Layer*> mOffscreenLayers; // Flag to indicate whether to re-enable HWVsync when screen is on bool mEnableHWVsyncScreenOn = false; // Flags to capture the state of Vsync in HWC HWC2::Vsync mHWCVsyncState = HWC2::Vsync::Disable; HWC2::Vsync mHWCVsyncPendingState = HWC2::Vsync::Disable; }; } // namespace android