@@ -5678,7 +5678,15 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
56785678 incRefreshableDisplays ();
56795679 }
56805680
5681+ const bool shouldApplyOptimizationPolicy =
5682+ FlagManager::getInstance ().disable_synthetic_vsync_for_performance () &&
5683+ FlagManager::getInstance ().correct_virtual_display_power_state ();
5684+ if (isInternalDisplay && shouldApplyOptimizationPolicy) {
5685+ applyOptimizationPolicy (__func__);
5686+ }
5687+
56815688 const auto activeMode = display->refreshRateSelector ().getActiveMode ().modePtr ;
5689+ using OptimizationPolicy = gui::ISurfaceComposer::OptimizationPolicy;
56825690 if (currentMode == hal::PowerMode::OFF) {
56835691 // Turn on the display
56845692
@@ -5693,12 +5701,9 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
56935701 onActiveDisplayChangedLocked (activeDisplay.get (), *display);
56945702 }
56955703
5696- if (displayId == mActiveDisplayId ) {
5697- if (FlagManager::getInstance ().correct_virtual_display_power_state ()) {
5698- applyOptimizationPolicy (" setPhysicalDisplayPowerMode(ON)" );
5699- } else {
5700- disablePowerOptimizations (" setPhysicalDisplayPowerMode(ON)" );
5701- }
5704+ if (displayId == mActiveDisplayId && !shouldApplyOptimizationPolicy) {
5705+ optimizeThreadScheduling (" setPhysicalDisplayPowerMode(ON/DOZE)" ,
5706+ OptimizationPolicy::optimizeForPerformance);
57025707 }
57035708
57045709 getHwComposer ().setPowerMode (displayId, mode);
@@ -5707,7 +5712,7 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
57075712 mScheduler ->getVsyncSchedule (displayId)->getPendingHardwareVsyncState ();
57085713 requestHardwareVsync (displayId, enable);
57095714
5710- if (displayId == mActiveDisplayId ) {
5715+ if (displayId == mActiveDisplayId && !shouldApplyOptimizationPolicy ) {
57115716 mScheduler ->enableSyntheticVsync (false );
57125717 }
57135718
@@ -5724,13 +5729,12 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
57245729 if (const auto display = getActivatableDisplay ()) {
57255730 onActiveDisplayChangedLocked (activeDisplay.get (), *display);
57265731 } else {
5727- if (FlagManager::getInstance ().correct_virtual_display_power_state ()) {
5728- applyOptimizationPolicy (" setPhysicalDisplayPowerMode(OFF)" );
5729- } else {
5730- enablePowerOptimizations (" setPhysicalDisplayPowerMode(OFF)" );
5732+ if (!shouldApplyOptimizationPolicy) {
5733+ optimizeThreadScheduling (" setPhysicalDisplayPowerMode(OFF)" ,
5734+ OptimizationPolicy::optimizeForPower);
57315735 }
57325736
5733- if (currentModeNotDozeSuspend) {
5737+ if (currentModeNotDozeSuspend && !shouldApplyOptimizationPolicy ) {
57345738 mScheduler ->enableSyntheticVsync ();
57355739 }
57365740 }
@@ -5758,7 +5762,9 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
57585762 ALOGI (" Force repainting for DOZE_SUSPEND -> DOZE or ON." );
57595763 mVisibleRegionsDirty = true ;
57605764 scheduleRepaint ();
5761- mScheduler ->enableSyntheticVsync (false );
5765+ if (!shouldApplyOptimizationPolicy) {
5766+ mScheduler ->enableSyntheticVsync (false );
5767+ }
57625768 }
57635769 constexpr bool kAllowToEnable = true ;
57645770 mScheduler ->resyncToHardwareVsync (displayId, kAllowToEnable , activeMode.get ());
@@ -5768,7 +5774,7 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
57685774 constexpr bool kDisallow = true ;
57695775 mScheduler ->disableHardwareVsync (displayId, kDisallow );
57705776
5771- if (displayId == mActiveDisplayId ) {
5777+ if (displayId == mActiveDisplayId && !shouldApplyOptimizationPolicy ) {
57725778 mScheduler ->enableSyntheticVsync ();
57735779 }
57745780 getHwComposer ().setPowerMode (displayId, mode);
@@ -5807,43 +5813,44 @@ void SurfaceFlinger::setVirtualDisplayPowerMode(const sp<DisplayDevice>& display
58075813 to_string (displayId).c_str ());
58085814}
58095815
5810- bool SurfaceFlinger::shouldOptimizeForPerformance () {
5811- for (const auto & [_, display] : mDisplays ) {
5812- // Displays that are optimized for power are always powered on and should not influence
5813- // whether there is an active display for the purpose of power optimization, etc. If these
5814- // displays are being shown somewhere, a different (physical or virtual) display that is
5815- // optimized for performance will be powered on in addition. Displays optimized for
5816- // performance will change power mode, so if they are off then they are not active.
5817- if (display->isPoweredOn () &&
5818- display->getOptimizationPolicy () ==
5819- gui::ISurfaceComposer::OptimizationPolicy::optimizeForPerformance) {
5820- return true ;
5821- }
5822- }
5823- return false ;
5824- }
5825-
5826- void SurfaceFlinger::enablePowerOptimizations (const char * whence) {
5827- ALOGD (" %s: Enabling power optimizations" , whence);
5828-
5829- setSchedAttr (false , whence);
5830- setSchedFifo (false , whence);
5831- }
5832-
5833- void SurfaceFlinger::disablePowerOptimizations (const char * whence) {
5834- ALOGD (" %s: Disabling power optimizations" , whence);
5816+ void SurfaceFlinger::optimizeThreadScheduling (
5817+ const char * whence, gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy) {
5818+ ALOGD (" %s: Optimizing thread scheduling: %s" , whence, to_string (optimizationPolicy));
58355819
5820+ const bool optimizeForPerformance =
5821+ optimizationPolicy == gui::ISurfaceComposer::OptimizationPolicy::optimizeForPerformance;
58365822 // TODO: b/281692563 - Merge the syscalls. For now, keep uclamp in a separate syscall
58375823 // and set it before SCHED_FIFO due to b/190237315.
5838- setSchedAttr (true , whence);
5839- setSchedFifo (true , whence);
5824+ setSchedAttr (optimizeForPerformance , whence);
5825+ setSchedFifo (optimizeForPerformance , whence);
58405826}
58415827
58425828void SurfaceFlinger::applyOptimizationPolicy (const char * whence) {
5843- if (shouldOptimizeForPerformance ()) {
5844- disablePowerOptimizations (whence);
5845- } else {
5846- enablePowerOptimizations (whence);
5829+ using OptimizationPolicy = gui::ISurfaceComposer::OptimizationPolicy;
5830+
5831+ const bool optimizeForPerformance =
5832+ std::any_of (mDisplays .begin (), mDisplays .end (), [](const auto & pair) {
5833+ const auto & display = pair.second ;
5834+ return display->isPoweredOn () &&
5835+ display->getOptimizationPolicy () ==
5836+ OptimizationPolicy::optimizeForPerformance;
5837+ });
5838+
5839+ optimizeThreadScheduling (whence,
5840+ optimizeForPerformance ? OptimizationPolicy::optimizeForPerformance
5841+ : OptimizationPolicy::optimizeForPower);
5842+
5843+ if (mScheduler ) {
5844+ const bool disableSyntheticVsync =
5845+ std::any_of (mDisplays .begin (), mDisplays .end (), [](const auto & pair) {
5846+ const auto & display = pair.second ;
5847+ const hal::PowerMode powerMode = display->getPowerMode ();
5848+ return powerMode != hal::PowerMode::OFF &&
5849+ powerMode != hal::PowerMode::DOZE_SUSPEND &&
5850+ display->getOptimizationPolicy () ==
5851+ OptimizationPolicy::optimizeForPerformance;
5852+ });
5853+ mScheduler ->enableSyntheticVsync (!disableSyntheticVsync);
58475854 }
58485855}
58495856
0 commit comments