Loading services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -140,8 +140,8 @@ const RefreshRate& RefreshRateConfigs::getBestRefreshRate( return getMinRefreshRateByPolicyLocked(); } if (layers.empty()) { return getCurrentRefreshRateByPolicyLocked(); if (layers.empty() || noVoteLayers == layers.size()) { return getMaxRefreshRateByPolicyLocked(); } // Only if all layers want Min we should return Min Loading services/surfaceflinger/Scheduler/Scheduler.cpp +20 −25 Original line number Diff line number Diff line Loading @@ -385,38 +385,33 @@ nsecs_t Scheduler::getDispSyncExpectedPresentTime(nsecs_t now) { void Scheduler::registerLayer(Layer* layer) { if (!mLayerHistory) return; // If the content detection feature is off, all layers are registered at NoVote. We still // keep the layer history, since we use it for other features (like Frame Rate API), so layers // still need to be registered. if (!mUseContentDetection) { mLayerHistory->registerLayer(layer, mRefreshRateConfigs.getMinRefreshRate().getFps(), mRefreshRateConfigs.getMaxRefreshRate().getFps(), scheduler::LayerHistory::LayerVoteType::NoVote); return; } const auto minFps = mRefreshRateConfigs.getMinRefreshRate().getFps(); const auto maxFps = mRefreshRateConfigs.getMaxRefreshRate().getFps(); // In V1 of content detection, all layers are registered as Heuristic (unless it's wallpaper). if (!mUseContentDetectionV2) { const auto lowFps = mRefreshRateConfigs.getMinRefreshRate().getFps(); const auto highFps = layer->getWindowType() == InputWindowInfo::TYPE_WALLPAPER ? lowFps : mRefreshRateConfigs.getMaxRefreshRate().getFps(); mLayerHistory->registerLayer(layer, lowFps, highFps, if (layer->getWindowType() == InputWindowInfo::TYPE_STATUS_BAR) { mLayerHistory->registerLayer(layer, minFps, maxFps, scheduler::LayerHistory::LayerVoteType::NoVote); } else if (!mUseContentDetection) { // If the content detection feature is off, all layers are registered at Max. We still keep // the layer history, since we use it for other features (like Frame Rate API), so layers // still need to be registered. mLayerHistory->registerLayer(layer, minFps, maxFps, scheduler::LayerHistory::LayerVoteType::Max); } else if (!mUseContentDetectionV2) { // In V1 of content detection, all layers are registered as Heuristic (unless it's // wallpaper). const auto highFps = layer->getWindowType() == InputWindowInfo::TYPE_WALLPAPER ? minFps : maxFps; mLayerHistory->registerLayer(layer, minFps, highFps, scheduler::LayerHistory::LayerVoteType::Heuristic); } else { if (layer->getWindowType() == InputWindowInfo::TYPE_WALLPAPER) { // Running Wallpaper at Min is considered as part of content detection. mLayerHistory->registerLayer(layer, mRefreshRateConfigs.getMinRefreshRate().getFps(), mRefreshRateConfigs.getMaxRefreshRate().getFps(), mLayerHistory->registerLayer(layer, minFps, maxFps, scheduler::LayerHistory::LayerVoteType::Min); } else if (layer->getWindowType() == InputWindowInfo::TYPE_STATUS_BAR) { mLayerHistory->registerLayer(layer, mRefreshRateConfigs.getMinRefreshRate().getFps(), mRefreshRateConfigs.getMaxRefreshRate().getFps(), scheduler::LayerHistory::LayerVoteType::NoVote); } else { mLayerHistory->registerLayer(layer, mRefreshRateConfigs.getMinRefreshRate().getFps(), mRefreshRateConfigs.getMaxRefreshRate().getFps(), mLayerHistory->registerLayer(layer, minFps, maxFps, scheduler::LayerHistory::LayerVoteType::Heuristic); } } Loading services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp +4 −5 Original line number Diff line number Diff line Loading @@ -340,15 +340,14 @@ TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) { std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/ HWC_CONFIG_ID_72); // If there are not layers, there is not content detection, so return the current // refresh rate. // If there are no layers we select the default frame rate, which is the max of the primary // range. auto layers = std::vector<LayerRequirement>{}; EXPECT_EQ(mExpected72Config, EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ false, &ignored)); // Current refresh rate can always be changed. refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_60); ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0); EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ false, &ignored)); Loading Loading
services/surfaceflinger/Scheduler/RefreshRateConfigs.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -140,8 +140,8 @@ const RefreshRate& RefreshRateConfigs::getBestRefreshRate( return getMinRefreshRateByPolicyLocked(); } if (layers.empty()) { return getCurrentRefreshRateByPolicyLocked(); if (layers.empty() || noVoteLayers == layers.size()) { return getMaxRefreshRateByPolicyLocked(); } // Only if all layers want Min we should return Min Loading
services/surfaceflinger/Scheduler/Scheduler.cpp +20 −25 Original line number Diff line number Diff line Loading @@ -385,38 +385,33 @@ nsecs_t Scheduler::getDispSyncExpectedPresentTime(nsecs_t now) { void Scheduler::registerLayer(Layer* layer) { if (!mLayerHistory) return; // If the content detection feature is off, all layers are registered at NoVote. We still // keep the layer history, since we use it for other features (like Frame Rate API), so layers // still need to be registered. if (!mUseContentDetection) { mLayerHistory->registerLayer(layer, mRefreshRateConfigs.getMinRefreshRate().getFps(), mRefreshRateConfigs.getMaxRefreshRate().getFps(), scheduler::LayerHistory::LayerVoteType::NoVote); return; } const auto minFps = mRefreshRateConfigs.getMinRefreshRate().getFps(); const auto maxFps = mRefreshRateConfigs.getMaxRefreshRate().getFps(); // In V1 of content detection, all layers are registered as Heuristic (unless it's wallpaper). if (!mUseContentDetectionV2) { const auto lowFps = mRefreshRateConfigs.getMinRefreshRate().getFps(); const auto highFps = layer->getWindowType() == InputWindowInfo::TYPE_WALLPAPER ? lowFps : mRefreshRateConfigs.getMaxRefreshRate().getFps(); mLayerHistory->registerLayer(layer, lowFps, highFps, if (layer->getWindowType() == InputWindowInfo::TYPE_STATUS_BAR) { mLayerHistory->registerLayer(layer, minFps, maxFps, scheduler::LayerHistory::LayerVoteType::NoVote); } else if (!mUseContentDetection) { // If the content detection feature is off, all layers are registered at Max. We still keep // the layer history, since we use it for other features (like Frame Rate API), so layers // still need to be registered. mLayerHistory->registerLayer(layer, minFps, maxFps, scheduler::LayerHistory::LayerVoteType::Max); } else if (!mUseContentDetectionV2) { // In V1 of content detection, all layers are registered as Heuristic (unless it's // wallpaper). const auto highFps = layer->getWindowType() == InputWindowInfo::TYPE_WALLPAPER ? minFps : maxFps; mLayerHistory->registerLayer(layer, minFps, highFps, scheduler::LayerHistory::LayerVoteType::Heuristic); } else { if (layer->getWindowType() == InputWindowInfo::TYPE_WALLPAPER) { // Running Wallpaper at Min is considered as part of content detection. mLayerHistory->registerLayer(layer, mRefreshRateConfigs.getMinRefreshRate().getFps(), mRefreshRateConfigs.getMaxRefreshRate().getFps(), mLayerHistory->registerLayer(layer, minFps, maxFps, scheduler::LayerHistory::LayerVoteType::Min); } else if (layer->getWindowType() == InputWindowInfo::TYPE_STATUS_BAR) { mLayerHistory->registerLayer(layer, mRefreshRateConfigs.getMinRefreshRate().getFps(), mRefreshRateConfigs.getMaxRefreshRate().getFps(), scheduler::LayerHistory::LayerVoteType::NoVote); } else { mLayerHistory->registerLayer(layer, mRefreshRateConfigs.getMinRefreshRate().getFps(), mRefreshRateConfigs.getMaxRefreshRate().getFps(), mLayerHistory->registerLayer(layer, minFps, maxFps, scheduler::LayerHistory::LayerVoteType::Heuristic); } } Loading
services/surfaceflinger/tests/unittests/RefreshRateConfigsTest.cpp +4 −5 Original line number Diff line number Diff line Loading @@ -340,15 +340,14 @@ TEST_F(RefreshRateConfigsTest, getBestRefreshRate_noLayers) { std::make_unique<RefreshRateConfigs>(m60_72_90Device, /*currentConfigId=*/ HWC_CONFIG_ID_72); // If there are not layers, there is not content detection, so return the current // refresh rate. // If there are no layers we select the default frame rate, which is the max of the primary // range. auto layers = std::vector<LayerRequirement>{}; EXPECT_EQ(mExpected72Config, EXPECT_EQ(mExpected90Config, refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ false, &ignored)); // Current refresh rate can always be changed. refreshRateConfigs->setCurrentConfigId(HWC_CONFIG_ID_60); ASSERT_GE(refreshRateConfigs->setDisplayManagerPolicy({HWC_CONFIG_ID_60, {60, 60}}), 0); EXPECT_EQ(mExpected60Config, refreshRateConfigs->getBestRefreshRate(layers, /*touchActive*/ false, /*idle*/ false, &ignored)); Loading