@@ -5719,7 +5719,13 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
57195719 incRefreshableDisplays ();
57205720 }
57215721
5722+ if (displayId == mActiveDisplayId &&
5723+ FlagManager::getInstance ().correct_virtual_display_power_state ()) {
5724+ applyOptimizationPolicy (__func__);
5725+ }
5726+
57225727 const auto activeMode = display->refreshRateSelector ().getActiveMode ().modePtr ;
5728+ using OptimizationPolicy = gui::ISurfaceComposer::OptimizationPolicy;
57235729 if (currentMode == hal::PowerMode::OFF) {
57245730 // Turn on the display
57255731
@@ -5734,12 +5740,10 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
57345740 onActiveDisplayChangedLocked (activeDisplay.get (), *display);
57355741 }
57365742
5737- if (displayId == mActiveDisplayId ) {
5738- if (FlagManager::getInstance ().correct_virtual_display_power_state ()) {
5739- applyOptimizationPolicy (" setPhysicalDisplayPowerMode(ON)" );
5740- } else {
5741- disablePowerOptimizations (" setPhysicalDisplayPowerMode(ON)" );
5742- }
5743+ if (displayId == mActiveDisplayId &&
5744+ !FlagManager::getInstance ().correct_virtual_display_power_state ()) {
5745+ optimizeThreadScheduling (" setPhysicalDisplayPowerMode(ON/DOZE)" ,
5746+ OptimizationPolicy::optimizeForPerformance);
57435747 }
57445748
57455749 getHwComposer ().setPowerMode (displayId, mode);
@@ -5748,7 +5752,8 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
57485752 mScheduler ->getVsyncSchedule (displayId)->getPendingHardwareVsyncState ();
57495753 requestHardwareVsync (displayId, enable);
57505754
5751- if (displayId == mActiveDisplayId ) {
5755+ if (displayId == mActiveDisplayId &&
5756+ !FlagManager::getInstance ().correct_virtual_display_power_state ()) {
57525757 mScheduler ->enableSyntheticVsync (false );
57535758 }
57545759
@@ -5765,13 +5770,13 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
57655770 if (const auto display = getActivatableDisplay ()) {
57665771 onActiveDisplayChangedLocked (activeDisplay.get (), *display);
57675772 } else {
5768- if (FlagManager::getInstance ().correct_virtual_display_power_state ()) {
5769- applyOptimizationPolicy (" setPhysicalDisplayPowerMode(OFF)" );
5770- } else {
5771- enablePowerOptimizations (" setPhysicalDisplayPowerMode(OFF)" );
5773+ if (!FlagManager::getInstance ().correct_virtual_display_power_state ()) {
5774+ optimizeThreadScheduling (" setPhysicalDisplayPowerMode(OFF)" ,
5775+ OptimizationPolicy::optimizeForPower);
57725776 }
57735777
5774- if (currentModeNotDozeSuspend) {
5778+ if (currentModeNotDozeSuspend &&
5779+ !FlagManager::getInstance ().correct_virtual_display_power_state ()) {
57755780 mScheduler ->enableSyntheticVsync ();
57765781 }
57775782 }
@@ -5799,7 +5804,9 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
57995804 ALOGI (" Force repainting for DOZE_SUSPEND -> DOZE or ON." );
58005805 mVisibleRegionsDirty = true ;
58015806 scheduleRepaint ();
5802- mScheduler ->enableSyntheticVsync (false );
5807+ if (!FlagManager::getInstance ().correct_virtual_display_power_state ()) {
5808+ mScheduler ->enableSyntheticVsync (false );
5809+ }
58035810 }
58045811 constexpr bool kAllowToEnable = true ;
58055812 mScheduler ->resyncToHardwareVsync (displayId, kAllowToEnable , activeMode.get ());
@@ -5809,7 +5816,8 @@ void SurfaceFlinger::setPhysicalDisplayPowerMode(const sp<DisplayDevice>& displa
58095816 constexpr bool kDisallow = true ;
58105817 mScheduler ->disableHardwareVsync (displayId, kDisallow );
58115818
5812- if (displayId == mActiveDisplayId ) {
5819+ if (displayId == mActiveDisplayId &&
5820+ !FlagManager::getInstance ().correct_virtual_display_power_state ()) {
58135821 mScheduler ->enableSyntheticVsync ();
58145822 }
58155823 getHwComposer ().setPowerMode (displayId, mode);
@@ -5848,43 +5856,44 @@ void SurfaceFlinger::setVirtualDisplayPowerMode(const sp<DisplayDevice>& display
58485856 to_string (displayId).c_str ());
58495857}
58505858
5851- bool SurfaceFlinger::shouldOptimizeForPerformance () {
5852- for (const auto & [_, display] : mDisplays ) {
5853- // Displays that are optimized for power are always powered on and should not influence
5854- // whether there is an active display for the purpose of power optimization, etc. If these
5855- // displays are being shown somewhere, a different (physical or virtual) display that is
5856- // optimized for performance will be powered on in addition. Displays optimized for
5857- // performance will change power mode, so if they are off then they are not active.
5858- if (display->isPoweredOn () &&
5859- display->getOptimizationPolicy () ==
5860- gui::ISurfaceComposer::OptimizationPolicy::optimizeForPerformance) {
5861- return true ;
5862- }
5863- }
5864- return false ;
5865- }
5866-
5867- void SurfaceFlinger::enablePowerOptimizations (const char * whence) {
5868- ALOGD (" %s: Enabling power optimizations" , whence);
5869-
5870- setSchedAttr (false , whence);
5871- setSchedFifo (false , whence);
5872- }
5873-
5874- void SurfaceFlinger::disablePowerOptimizations (const char * whence) {
5875- ALOGD (" %s: Disabling power optimizations" , whence);
5859+ void SurfaceFlinger::optimizeThreadScheduling (
5860+ const char * whence, gui::ISurfaceComposer::OptimizationPolicy optimizationPolicy) {
5861+ ALOGD (" %s: Optimizing thread scheduling: %s" , whence, to_string (optimizationPolicy));
58765862
5863+ const bool optimizeForPerformance =
5864+ optimizationPolicy == gui::ISurfaceComposer::OptimizationPolicy::optimizeForPerformance;
58775865 // TODO: b/281692563 - Merge the syscalls. For now, keep uclamp in a separate syscall
58785866 // and set it before SCHED_FIFO due to b/190237315.
5879- setSchedAttr (true , whence);
5880- setSchedFifo (true , whence);
5867+ setSchedAttr (optimizeForPerformance , whence);
5868+ setSchedFifo (optimizeForPerformance , whence);
58815869}
58825870
58835871void SurfaceFlinger::applyOptimizationPolicy (const char * whence) {
5884- if (shouldOptimizeForPerformance ()) {
5885- disablePowerOptimizations (whence);
5886- } else {
5887- enablePowerOptimizations (whence);
5872+ using OptimizationPolicy = gui::ISurfaceComposer::OptimizationPolicy;
5873+
5874+ const bool optimizeForPerformance =
5875+ std::any_of (mDisplays .begin (), mDisplays .end (), [](const auto & pair) {
5876+ const auto & display = pair.second ;
5877+ return display->isPoweredOn () &&
5878+ display->getOptimizationPolicy () ==
5879+ OptimizationPolicy::optimizeForPerformance;
5880+ });
5881+
5882+ optimizeThreadScheduling (whence,
5883+ optimizeForPerformance ? OptimizationPolicy::optimizeForPerformance
5884+ : OptimizationPolicy::optimizeForPower);
5885+
5886+ if (mScheduler ) {
5887+ const bool disableSyntheticVsync =
5888+ std::any_of (mDisplays .begin (), mDisplays .end (), [](const auto & pair) {
5889+ const auto & display = pair.second ;
5890+ const hal::PowerMode powerMode = display->getPowerMode ();
5891+ return powerMode != hal::PowerMode::OFF &&
5892+ powerMode != hal::PowerMode::DOZE_SUSPEND &&
5893+ display->getOptimizationPolicy () ==
5894+ OptimizationPolicy::optimizeForPerformance;
5895+ });
5896+ mScheduler ->enableSyntheticVsync (!disableSyntheticVsync);
58885897 }
58895898}
58905899
0 commit comments