@@ -5679,7 +5679,15 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
56795679 incRefreshableDisplays ();
56805680 }
56815681
5682+ const bool shouldApplyOptimizationPolicy =
5683+ FlagManager::getInstance ().disable_synthetic_vsync_for_performance () &&
5684+ FlagManager::getInstance ().correct_virtual_display_power_state ();
5685+ if (isInternalDisplay && shouldApplyOptimizationPolicy) {
5686+ applyOptimizationPolicy (__func__);
5687+ }
5688+
56825689 const auto activeMode = display->refreshRateSelector ().getActiveMode ().modePtr ;
5690+ using OptimizationPolicy = gui::ISurfaceComposer::OptimizationPolicy;
56835691 if (currentMode == hal::PowerMode::OFF) {
56845692 // Turn on the display
56855693
@@ -5694,12 +5702,9 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
56945702 onActiveDisplayChangedLocked (activeDisplay.get (), *display);
56955703 }
56965704
5697- if (displayId == mActiveDisplayId ) {
5698- if (FlagManager::getInstance ().correct_virtual_display_power_state ()) {
5699- applyOptimizationPolicy (" setPhysicalDisplayPowerMode(ON)" );
5700- } else {
5701- disablePowerOptimizations (" setPhysicalDisplayPowerMode(ON)" );
5702- }
5705+ if (displayId == mActiveDisplayId && !shouldApplyOptimizationPolicy) {
5706+ optimizeThreadScheduling (" setPhysicalDisplayPowerMode(ON/DOZE)" ,
5707+ OptimizationPolicy::optimizeForPerformance);
57035708 }
57045709
57055710 getHwComposer ().setPowerMode (displayId, mode);
@@ -5708,7 +5713,7 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
57085713 mScheduler ->getVsyncSchedule (displayId)->getPendingHardwareVsyncState ();
57095714 requestHardwareVsync (displayId, enable);
57105715
5711- if (displayId == mActiveDisplayId ) {
5716+ if (displayId == mActiveDisplayId && !shouldApplyOptimizationPolicy ) {
57125717 mScheduler ->enableSyntheticVsync (false );
57135718 }
57145719
@@ -5725,13 +5730,12 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
57255730 if (const auto display = getActivatableDisplay ()) {
57265731 onActiveDisplayChangedLocked (activeDisplay.get (), *display);
57275732 } else {
5728- if (FlagManager::getInstance ().correct_virtual_display_power_state ()) {
5729- applyOptimizationPolicy (" setPhysicalDisplayPowerMode(OFF)" );
5730- } else {
5731- enablePowerOptimizations (" setPhysicalDisplayPowerMode(OFF)" );
5733+ if (!shouldApplyOptimizationPolicy) {
5734+ optimizeThreadScheduling (" setPhysicalDisplayPowerMode(OFF)" ,
5735+ OptimizationPolicy::optimizeForPower);
57325736 }
57335737
5734- if (currentModeNotDozeSuspend) {
5738+ if (currentModeNotDozeSuspend && !shouldApplyOptimizationPolicy ) {
57355739 mScheduler ->enableSyntheticVsync ();
57365740 }
57375741 }
@@ -5759,7 +5763,9 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
57595763 ALOGI (" Force repainting for DOZE_SUSPEND -> DOZE or ON." );
57605764 mVisibleRegionsDirty = true ;
57615765 scheduleRepaint ();
5762- mScheduler ->enableSyntheticVsync (false );
5766+ if (!shouldApplyOptimizationPolicy) {
5767+ mScheduler ->enableSyntheticVsync (false );
5768+ }
57635769 }
57645770 constexpr bool kAllowToEnable = true ;
57655771 mScheduler ->resyncToHardwareVsync (displayId, kAllowToEnable , activeMode.get ());
@@ -5769,7 +5775,7 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
57695775 constexpr bool kDisallow = true ;
57705776 mScheduler ->disableHardwareVsync (displayId, kDisallow );
57715777
5772- if (displayId == mActiveDisplayId ) {
5778+ if (displayId == mActiveDisplayId && !shouldApplyOptimizationPolicy ) {
57735779 mScheduler ->enableSyntheticVsync ();
57745780 }
57755781 getHwComposer ().setPowerMode (displayId, mode);
@@ -5808,43 +5814,44 @@ void SurfaceFlinger::setVirtualDisplayPowerMode(const sp<DisplayDevice>& display
58085814 to_string (displayId).c_str ());
58095815}
58105816
5811- bool SurfaceFlinger::shouldOptimizeForPerformance () {
5812- for (const auto & [_, display] : mDisplays ) {
5813- // Displays that are optimized for power are always powered on and should not influence
5814- // whether there is an active display for the purpose of power optimization, etc. If these
5815- // displays are being shown somewhere, a different (physical or virtual) display that is
5816- // optimized for performance will be powered on in addition. Displays optimized for
5817- // performance will change power mode, so if they are off then they are not active.
5818- if (display->isPoweredOn () &&
5819- display->getOptimizationPolicy () ==
5820- gui::ISurfaceComposer::OptimizationPolicy::optimizeForPerformance) {
5821- return true ;
5822- }
5823- }
5824- return false ;
5825- }
5826-
5827- void SurfaceFlinger::enablePowerOptimizations (const char * whence) {
5828- ALOGD (" %s: Enabling power optimizations" , whence);
5829-
5830- setSchedAttr (false , whence);
5831- setSchedFifo (false , whence);
5832- }
5833-
5834- void SurfaceFlinger::disablePowerOptimizations (const char * whence) {
5835- ALOGD (" %s: Disabling power optimizations" , whence);
5817+ void SurfaceFlinger::optimizeThreadScheduling (
5818+ const char * whence, gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy) {
5819+ ALOGD (" %s: Optimizing thread scheduling: %s" , whence, to_string (optimizationPolicy));
58365820
5821+ const bool optimizeForPerformance =
5822+ optimizationPolicy == gui::ISurfaceComposer::OptimizationPolicy::optimizeForPerformance;
58375823 // TODO: b/281692563 - Merge the syscalls. For now, keep uclamp in a separate syscall
58385824 // and set it before SCHED_FIFO due to b/190237315.
5839- setSchedAttr (true , whence);
5840- setSchedFifo (true , whence);
5825+ setSchedAttr (optimizeForPerformance , whence);
5826+ setSchedFifo (optimizeForPerformance , whence);
58415827}
58425828
58435829void SurfaceFlinger::applyOptimizationPolicy (const char * whence) {
5844- if (shouldOptimizeForPerformance ()) {
5845- disablePowerOptimizations (whence);
5846- } else {
5847- enablePowerOptimizations (whence);
5830+ using OptimizationPolicy = gui::ISurfaceComposer::OptimizationPolicy;
5831+
5832+ const bool optimizeForPerformance =
5833+ std::any_of (mDisplays .begin (), mDisplays .end (), [](const auto & pair) {
5834+ const auto & display = pair.second ;
5835+ return display->isPoweredOn () &&
5836+ display->getOptimizationPolicy () ==
5837+ OptimizationPolicy::optimizeForPerformance;
5838+ });
5839+
5840+ optimizeThreadScheduling (whence,
5841+ optimizeForPerformance ? OptimizationPolicy::optimizeForPerformance
5842+ : OptimizationPolicy::optimizeForPower);
5843+
5844+ if (mScheduler ) {
5845+ const bool disableSyntheticVsync =
5846+ std::any_of (mDisplays .begin (), mDisplays .end (), [](const auto & pair) {
5847+ const auto & display = pair.second ;
5848+ const hal::PowerMode powerMode = display->getPowerMode ();
5849+ return powerMode != hal::PowerMode::OFF &&
5850+ powerMode != hal::PowerMode::DOZE_SUSPEND &&
5851+ display->getOptimizationPolicy () ==
5852+ OptimizationPolicy::optimizeForPerformance;
5853+ });
5854+ mScheduler ->enableSyntheticVsync (!disableSyntheticVsync);
58485855 }
58495856}
58505857
0 commit comments