Loading services/surfaceflinger/Scheduler/RefreshRateSelector.cpp +32 −6 Original line number Original line Diff line number Diff line Loading @@ -948,17 +948,43 @@ auto RefreshRateSelector::getFrameRateOverrides(const std::vector<LayerRequireme const auto layersByUid = groupLayersByUid(layers); const auto layersByUid = groupLayersByUid(layers); UidToFrameRateOverride frameRateOverrides; UidToFrameRateOverride frameRateOverrides; for (const auto& [uid, layersWithSameUid] : layersByUid) { for (const auto& [uid, layersWithSameUid] : layersByUid) { // Layers with ExplicitExactOrMultiple expect touch boost // Look for cases that should not have frame rate overrides. const bool hasExplicitExactOrMultiple = bool hasExplicitExactOrMultiple = false; std::any_of(layersWithSameUid.cbegin(), layersWithSameUid.cend(), bool hasExplicitDefault = false; [](const auto& layer) { bool hasHighHint = false; return layer->vote == LayerVoteType::ExplicitExactOrMultiple; for (const auto& layer : layersWithSameUid) { }); switch (layer->vote) { case LayerVoteType::ExplicitExactOrMultiple: hasExplicitExactOrMultiple = true; break; case LayerVoteType::ExplicitDefault: hasExplicitDefault = true; break; case LayerVoteType::ExplicitCategory: if (layer->frameRateCategory == FrameRateCategory::HighHint) { hasHighHint = true; } break; default: // No action break; } if (hasExplicitExactOrMultiple && hasExplicitDefault && hasHighHint) { break; } } // Layers with ExplicitExactOrMultiple expect touch boost if (globalSignals.touch && hasExplicitExactOrMultiple) { if (globalSignals.touch && hasExplicitExactOrMultiple) { continue; continue; } } // Mirrors getRankedFrameRates. If there is no ExplicitDefault, expect touch boost and // skip frame rate override. if (hasHighHint && !hasExplicitDefault) { continue; } for (auto& [_, score] : scoredFrameRates) { for (auto& [_, score] : scoredFrameRates) { score = 0; score = 0; } } Loading services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp +215 −0 Original line number Original line Diff line number Diff line Loading @@ -3159,6 +3159,210 @@ TEST_P(RefreshRateSelectorTest, getFrameRateOverrides_twoUids) { EXPECT_TRUE(frameRateOverrides.empty()); EXPECT_TRUE(frameRateOverrides.empty()); } } TEST_P(RefreshRateSelectorTest, getFrameRateOverrides_withFrameRateCategory) { if (GetParam() == Config::FrameRateOverride::Disabled) { return; } ASSERT_TRUE(GetParam() == Config::FrameRateOverride::AppOverrideNativeRefreshRates || GetParam() == Config::FrameRateOverride::AppOverride || GetParam() == Config::FrameRateOverride::Enabled); auto selector = createSelector(kModes_30_60_72_90_120, kModeId120); std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f}, {.ownerUid = 1234, .weight = 1.f}}; // HighHint case with touch boost and thus should skip frame rate override. layers[0].name = "ExplicitCategory HighHint"; layers[0].vote = LayerVoteType::ExplicitCategory; layers[0].desiredRefreshRate = 0_Hz; layers[0].frameRateCategory = FrameRateCategory::HighHint; layers[1].name = "ExplicitCategory High"; layers[1].vote = LayerVoteType::ExplicitCategory; layers[1].desiredRefreshRate = 0_Hz; layers[1].frameRateCategory = FrameRateCategory::High; auto frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_TRUE(frameRateOverrides.empty()); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_TRUE(frameRateOverrides.empty()); // HighHint case with touch boost and thus should skip frame rate override. layers[0].name = "ExplicitCategory HighHint"; layers[0].vote = LayerVoteType::ExplicitCategory; layers[0].desiredRefreshRate = 0_Hz; layers[0].frameRateCategory = FrameRateCategory::HighHint; layers[1].name = "ExplicitCategory Normal"; layers[1].vote = LayerVoteType::ExplicitCategory; layers[1].desiredRefreshRate = 0_Hz; layers[1].frameRateCategory = FrameRateCategory::Normal; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_TRUE(frameRateOverrides.empty()); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_TRUE(frameRateOverrides.empty()); // HighHint case with touch boost and thus should skip frame rate override. layers[0].name = "ExplicitCategory HighHint"; layers[0].vote = LayerVoteType::ExplicitCategory; layers[0].desiredRefreshRate = 0_Hz; layers[0].frameRateCategory = FrameRateCategory::HighHint; layers[1].name = "ExplicitCategory Low"; layers[1].vote = LayerVoteType::ExplicitCategory; layers[1].desiredRefreshRate = 0_Hz; layers[1].frameRateCategory = FrameRateCategory::Low; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_TRUE(frameRateOverrides.empty()); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_TRUE(frameRateOverrides.empty()); // HighHint case with touch boost and thus should skip frame rate override. layers[0].name = "ExplicitCategory HighHint"; layers[0].vote = LayerVoteType::ExplicitCategory; layers[0].desiredRefreshRate = 0_Hz; layers[0].frameRateCategory = FrameRateCategory::HighHint; layers[1].name = "ExplicitCategory NoPreference"; layers[1].vote = LayerVoteType::ExplicitCategory; layers[1].desiredRefreshRate = 0_Hz; layers[1].frameRateCategory = FrameRateCategory::NoPreference; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_TRUE(frameRateOverrides.empty()); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_TRUE(frameRateOverrides.empty()); // HighHint case *without* touch boost has frame rate override. // For example, game and touch interaction. layers[0].name = "ExplicitCategory HighHint"; layers[0].vote = LayerVoteType::ExplicitCategory; layers[0].desiredRefreshRate = 0_Hz; layers[0].frameRateCategory = FrameRateCategory::HighHint; layers[1].name = "ExplicitDefault 60"; layers[1].vote = LayerVoteType::ExplicitDefault; layers[1].desiredRefreshRate = 60_Hz; layers[1].frameRateCategory = FrameRateCategory::Default; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); // HighHint case with touch boost and thus should skip frame rate override. layers[0].name = "ExplicitCategory HighHint"; layers[0].vote = LayerVoteType::ExplicitCategory; layers[0].desiredRefreshRate = 0_Hz; layers[0].frameRateCategory = FrameRateCategory::HighHint; layers[1].name = "ExplicitExactOrMultiple 30"; layers[1].vote = LayerVoteType::ExplicitExactOrMultiple; layers[1].desiredRefreshRate = 30_Hz; layers[1].frameRateCategory = FrameRateCategory::Default; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_TRUE(frameRateOverrides.empty()); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_TRUE(frameRateOverrides.empty()); // HighHint case with touch boost and thus should skip frame rate override. layers[0].name = "ExplicitCategory HighHint"; layers[0].vote = LayerVoteType::ExplicitCategory; layers[0].desiredRefreshRate = 0_Hz; layers[0].frameRateCategory = FrameRateCategory::HighHint; layers[1].name = "ExplicitExact 60"; layers[1].vote = LayerVoteType::ExplicitExact; layers[1].desiredRefreshRate = 60_Hz; layers[1].frameRateCategory = FrameRateCategory::Default; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_TRUE(frameRateOverrides.empty()); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_TRUE(frameRateOverrides.empty()); // HighHint case with touch boost and thus should skip frame rate override. layers[0].name = "ExplicitCategory HighHint"; layers[0].vote = LayerVoteType::ExplicitCategory; layers[0].desiredRefreshRate = 0_Hz; layers[0].frameRateCategory = FrameRateCategory::HighHint; layers[1].name = "ExplicitGte 60"; layers[1].vote = LayerVoteType::ExplicitGte; layers[1].desiredRefreshRate = 60_Hz; layers[1].frameRateCategory = FrameRateCategory::Default; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_TRUE(frameRateOverrides.empty()); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_TRUE(frameRateOverrides.empty()); // ExplicitCategory case that expects no global touch boost and thus has frame rate override. layers[0].name = "ExplicitDefault 60"; layers[0].vote = LayerVoteType::ExplicitDefault; layers[0].desiredRefreshRate = 60_Hz; layers[0].frameRateCategory = FrameRateCategory::Default; layers[1].name = "ExplicitCategory High"; layers[1].vote = LayerVoteType::ExplicitCategory; layers[1].desiredRefreshRate = 0_Hz; layers[1].frameRateCategory = FrameRateCategory::High; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(120_Hz, frameRateOverrides.at(1234)); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(120_Hz, frameRateOverrides.at(1234)); // ExplicitCategory case that expects no global touch boost and thus has frame rate override. layers[0].name = "ExplicitDefault 60"; layers[0].vote = LayerVoteType::ExplicitDefault; layers[0].desiredRefreshRate = 60_Hz; layers[0].frameRateCategory = FrameRateCategory::Default; layers[1].name = "ExplicitCategory Normal"; layers[1].vote = LayerVoteType::ExplicitCategory; layers[1].desiredRefreshRate = 0_Hz; layers[1].frameRateCategory = FrameRateCategory::Normal; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); // ExplicitCategory case that expects no global touch boost and thus has frame rate override. layers[0].name = "ExplicitDefault 60"; layers[0].vote = LayerVoteType::ExplicitDefault; layers[0].desiredRefreshRate = 60_Hz; layers[0].frameRateCategory = FrameRateCategory::Default; layers[1].name = "ExplicitCategory Low"; layers[1].vote = LayerVoteType::ExplicitCategory; layers[1].desiredRefreshRate = 0_Hz; layers[1].frameRateCategory = FrameRateCategory::Low; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); // ExplicitCategory case that expects no global touch boost and thus has frame rate override. layers[0].name = "ExplicitDefault 60"; layers[0].vote = LayerVoteType::ExplicitDefault; layers[0].desiredRefreshRate = 60_Hz; layers[0].frameRateCategory = FrameRateCategory::Default; layers[1].name = "ExplicitCategory NoPreference"; layers[1].vote = LayerVoteType::ExplicitCategory; layers[1].desiredRefreshRate = 0_Hz; layers[1].frameRateCategory = FrameRateCategory::NoPreference; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); } TEST_P(RefreshRateSelectorTest, getFrameRateOverrides_touch) { TEST_P(RefreshRateSelectorTest, getFrameRateOverrides_touch) { if (GetParam() == Config::FrameRateOverride::Disabled) { if (GetParam() == Config::FrameRateOverride::Disabled) { return; return; Loading Loading @@ -3204,6 +3408,17 @@ TEST_P(RefreshRateSelectorTest, getFrameRateOverrides_touch) { frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_TRUE(frameRateOverrides.empty()); EXPECT_TRUE(frameRateOverrides.empty()); layers[0].vote = LayerVoteType::ExplicitGte; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); } } TEST_P(RefreshRateSelectorTest, getFrameRateOverrides_DivisorIsNotDisplayRefreshRate) { TEST_P(RefreshRateSelectorTest, getFrameRateOverrides_DivisorIsNotDisplayRefreshRate) { Loading Loading
services/surfaceflinger/Scheduler/RefreshRateSelector.cpp +32 −6 Original line number Original line Diff line number Diff line Loading @@ -948,17 +948,43 @@ auto RefreshRateSelector::getFrameRateOverrides(const std::vector<LayerRequireme const auto layersByUid = groupLayersByUid(layers); const auto layersByUid = groupLayersByUid(layers); UidToFrameRateOverride frameRateOverrides; UidToFrameRateOverride frameRateOverrides; for (const auto& [uid, layersWithSameUid] : layersByUid) { for (const auto& [uid, layersWithSameUid] : layersByUid) { // Layers with ExplicitExactOrMultiple expect touch boost // Look for cases that should not have frame rate overrides. const bool hasExplicitExactOrMultiple = bool hasExplicitExactOrMultiple = false; std::any_of(layersWithSameUid.cbegin(), layersWithSameUid.cend(), bool hasExplicitDefault = false; [](const auto& layer) { bool hasHighHint = false; return layer->vote == LayerVoteType::ExplicitExactOrMultiple; for (const auto& layer : layersWithSameUid) { }); switch (layer->vote) { case LayerVoteType::ExplicitExactOrMultiple: hasExplicitExactOrMultiple = true; break; case LayerVoteType::ExplicitDefault: hasExplicitDefault = true; break; case LayerVoteType::ExplicitCategory: if (layer->frameRateCategory == FrameRateCategory::HighHint) { hasHighHint = true; } break; default: // No action break; } if (hasExplicitExactOrMultiple && hasExplicitDefault && hasHighHint) { break; } } // Layers with ExplicitExactOrMultiple expect touch boost if (globalSignals.touch && hasExplicitExactOrMultiple) { if (globalSignals.touch && hasExplicitExactOrMultiple) { continue; continue; } } // Mirrors getRankedFrameRates. If there is no ExplicitDefault, expect touch boost and // skip frame rate override. if (hasHighHint && !hasExplicitDefault) { continue; } for (auto& [_, score] : scoredFrameRates) { for (auto& [_, score] : scoredFrameRates) { score = 0; score = 0; } } Loading
services/surfaceflinger/tests/unittests/RefreshRateSelectorTest.cpp +215 −0 Original line number Original line Diff line number Diff line Loading @@ -3159,6 +3159,210 @@ TEST_P(RefreshRateSelectorTest, getFrameRateOverrides_twoUids) { EXPECT_TRUE(frameRateOverrides.empty()); EXPECT_TRUE(frameRateOverrides.empty()); } } TEST_P(RefreshRateSelectorTest, getFrameRateOverrides_withFrameRateCategory) { if (GetParam() == Config::FrameRateOverride::Disabled) { return; } ASSERT_TRUE(GetParam() == Config::FrameRateOverride::AppOverrideNativeRefreshRates || GetParam() == Config::FrameRateOverride::AppOverride || GetParam() == Config::FrameRateOverride::Enabled); auto selector = createSelector(kModes_30_60_72_90_120, kModeId120); std::vector<LayerRequirement> layers = {{.ownerUid = 1234, .weight = 1.f}, {.ownerUid = 1234, .weight = 1.f}}; // HighHint case with touch boost and thus should skip frame rate override. layers[0].name = "ExplicitCategory HighHint"; layers[0].vote = LayerVoteType::ExplicitCategory; layers[0].desiredRefreshRate = 0_Hz; layers[0].frameRateCategory = FrameRateCategory::HighHint; layers[1].name = "ExplicitCategory High"; layers[1].vote = LayerVoteType::ExplicitCategory; layers[1].desiredRefreshRate = 0_Hz; layers[1].frameRateCategory = FrameRateCategory::High; auto frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_TRUE(frameRateOverrides.empty()); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_TRUE(frameRateOverrides.empty()); // HighHint case with touch boost and thus should skip frame rate override. layers[0].name = "ExplicitCategory HighHint"; layers[0].vote = LayerVoteType::ExplicitCategory; layers[0].desiredRefreshRate = 0_Hz; layers[0].frameRateCategory = FrameRateCategory::HighHint; layers[1].name = "ExplicitCategory Normal"; layers[1].vote = LayerVoteType::ExplicitCategory; layers[1].desiredRefreshRate = 0_Hz; layers[1].frameRateCategory = FrameRateCategory::Normal; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_TRUE(frameRateOverrides.empty()); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_TRUE(frameRateOverrides.empty()); // HighHint case with touch boost and thus should skip frame rate override. layers[0].name = "ExplicitCategory HighHint"; layers[0].vote = LayerVoteType::ExplicitCategory; layers[0].desiredRefreshRate = 0_Hz; layers[0].frameRateCategory = FrameRateCategory::HighHint; layers[1].name = "ExplicitCategory Low"; layers[1].vote = LayerVoteType::ExplicitCategory; layers[1].desiredRefreshRate = 0_Hz; layers[1].frameRateCategory = FrameRateCategory::Low; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_TRUE(frameRateOverrides.empty()); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_TRUE(frameRateOverrides.empty()); // HighHint case with touch boost and thus should skip frame rate override. layers[0].name = "ExplicitCategory HighHint"; layers[0].vote = LayerVoteType::ExplicitCategory; layers[0].desiredRefreshRate = 0_Hz; layers[0].frameRateCategory = FrameRateCategory::HighHint; layers[1].name = "ExplicitCategory NoPreference"; layers[1].vote = LayerVoteType::ExplicitCategory; layers[1].desiredRefreshRate = 0_Hz; layers[1].frameRateCategory = FrameRateCategory::NoPreference; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_TRUE(frameRateOverrides.empty()); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_TRUE(frameRateOverrides.empty()); // HighHint case *without* touch boost has frame rate override. // For example, game and touch interaction. layers[0].name = "ExplicitCategory HighHint"; layers[0].vote = LayerVoteType::ExplicitCategory; layers[0].desiredRefreshRate = 0_Hz; layers[0].frameRateCategory = FrameRateCategory::HighHint; layers[1].name = "ExplicitDefault 60"; layers[1].vote = LayerVoteType::ExplicitDefault; layers[1].desiredRefreshRate = 60_Hz; layers[1].frameRateCategory = FrameRateCategory::Default; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); // HighHint case with touch boost and thus should skip frame rate override. layers[0].name = "ExplicitCategory HighHint"; layers[0].vote = LayerVoteType::ExplicitCategory; layers[0].desiredRefreshRate = 0_Hz; layers[0].frameRateCategory = FrameRateCategory::HighHint; layers[1].name = "ExplicitExactOrMultiple 30"; layers[1].vote = LayerVoteType::ExplicitExactOrMultiple; layers[1].desiredRefreshRate = 30_Hz; layers[1].frameRateCategory = FrameRateCategory::Default; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_TRUE(frameRateOverrides.empty()); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_TRUE(frameRateOverrides.empty()); // HighHint case with touch boost and thus should skip frame rate override. layers[0].name = "ExplicitCategory HighHint"; layers[0].vote = LayerVoteType::ExplicitCategory; layers[0].desiredRefreshRate = 0_Hz; layers[0].frameRateCategory = FrameRateCategory::HighHint; layers[1].name = "ExplicitExact 60"; layers[1].vote = LayerVoteType::ExplicitExact; layers[1].desiredRefreshRate = 60_Hz; layers[1].frameRateCategory = FrameRateCategory::Default; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_TRUE(frameRateOverrides.empty()); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_TRUE(frameRateOverrides.empty()); // HighHint case with touch boost and thus should skip frame rate override. layers[0].name = "ExplicitCategory HighHint"; layers[0].vote = LayerVoteType::ExplicitCategory; layers[0].desiredRefreshRate = 0_Hz; layers[0].frameRateCategory = FrameRateCategory::HighHint; layers[1].name = "ExplicitGte 60"; layers[1].vote = LayerVoteType::ExplicitGte; layers[1].desiredRefreshRate = 60_Hz; layers[1].frameRateCategory = FrameRateCategory::Default; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_TRUE(frameRateOverrides.empty()); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_TRUE(frameRateOverrides.empty()); // ExplicitCategory case that expects no global touch boost and thus has frame rate override. layers[0].name = "ExplicitDefault 60"; layers[0].vote = LayerVoteType::ExplicitDefault; layers[0].desiredRefreshRate = 60_Hz; layers[0].frameRateCategory = FrameRateCategory::Default; layers[1].name = "ExplicitCategory High"; layers[1].vote = LayerVoteType::ExplicitCategory; layers[1].desiredRefreshRate = 0_Hz; layers[1].frameRateCategory = FrameRateCategory::High; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(120_Hz, frameRateOverrides.at(1234)); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(120_Hz, frameRateOverrides.at(1234)); // ExplicitCategory case that expects no global touch boost and thus has frame rate override. layers[0].name = "ExplicitDefault 60"; layers[0].vote = LayerVoteType::ExplicitDefault; layers[0].desiredRefreshRate = 60_Hz; layers[0].frameRateCategory = FrameRateCategory::Default; layers[1].name = "ExplicitCategory Normal"; layers[1].vote = LayerVoteType::ExplicitCategory; layers[1].desiredRefreshRate = 0_Hz; layers[1].frameRateCategory = FrameRateCategory::Normal; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); // ExplicitCategory case that expects no global touch boost and thus has frame rate override. layers[0].name = "ExplicitDefault 60"; layers[0].vote = LayerVoteType::ExplicitDefault; layers[0].desiredRefreshRate = 60_Hz; layers[0].frameRateCategory = FrameRateCategory::Default; layers[1].name = "ExplicitCategory Low"; layers[1].vote = LayerVoteType::ExplicitCategory; layers[1].desiredRefreshRate = 0_Hz; layers[1].frameRateCategory = FrameRateCategory::Low; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); // ExplicitCategory case that expects no global touch boost and thus has frame rate override. layers[0].name = "ExplicitDefault 60"; layers[0].vote = LayerVoteType::ExplicitDefault; layers[0].desiredRefreshRate = 60_Hz; layers[0].frameRateCategory = FrameRateCategory::Default; layers[1].name = "ExplicitCategory NoPreference"; layers[1].vote = LayerVoteType::ExplicitCategory; layers[1].desiredRefreshRate = 0_Hz; layers[1].frameRateCategory = FrameRateCategory::NoPreference; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); } TEST_P(RefreshRateSelectorTest, getFrameRateOverrides_touch) { TEST_P(RefreshRateSelectorTest, getFrameRateOverrides_touch) { if (GetParam() == Config::FrameRateOverride::Disabled) { if (GetParam() == Config::FrameRateOverride::Disabled) { return; return; Loading Loading @@ -3204,6 +3408,17 @@ TEST_P(RefreshRateSelectorTest, getFrameRateOverrides_touch) { frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_TRUE(frameRateOverrides.empty()); EXPECT_TRUE(frameRateOverrides.empty()); layers[0].vote = LayerVoteType::ExplicitGte; frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); frameRateOverrides = selector.getFrameRateOverrides(layers, 120_Hz, {.touch = true}); EXPECT_EQ(1u, frameRateOverrides.size()); ASSERT_EQ(1u, frameRateOverrides.count(1234)); EXPECT_EQ(60_Hz, frameRateOverrides.at(1234)); } } TEST_P(RefreshRateSelectorTest, getFrameRateOverrides_DivisorIsNotDisplayRefreshRate) { TEST_P(RefreshRateSelectorTest, getFrameRateOverrides_DivisorIsNotDisplayRefreshRate) { Loading