diff options
author | 2023-10-23 12:57:41 -0700 | |
---|---|---|
committer | 2023-10-27 19:51:31 +0000 | |
commit | d6d8016d771710c09de313dde8f29f2c8976c5e6 (patch) | |
tree | c96aa31869935558f84680d20c99ec1620841e14 | |
parent | c589dc40a04423f8cb893b9763bb7b5fd943fb2d (diff) |
SF: move trunk stable flags to FlagManager
Test: presubmit
Bug: 297389311
Bug: 278199093
Bug: 284845445
Bug: 273702768
Bug: 259132483
Bug: 283055450
Change-Id: I2a85b2534ac8d472acd0de443785317871bbfe89
-rw-r--r-- | services/surfaceflinger/DisplayHardware/DisplayMode.h | 5 | ||||
-rw-r--r-- | services/surfaceflinger/FlagManager.cpp | 82 | ||||
-rw-r--r-- | services/surfaceflinger/FlagManager.h | 16 | ||||
-rw-r--r-- | services/surfaceflinger/RefreshRateOverlay.cpp | 5 | ||||
-rw-r--r-- | services/surfaceflinger/Scheduler/EventThread.cpp | 3 | ||||
-rw-r--r-- | services/surfaceflinger/Scheduler/LayerHistory.cpp | 6 | ||||
-rw-r--r-- | services/surfaceflinger/Scheduler/RefreshRateSelector.cpp | 3 | ||||
-rw-r--r-- | services/surfaceflinger/Scheduler/Scheduler.cpp | 3 | ||||
-rw-r--r-- | services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp | 9 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 33 | ||||
-rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 6 | ||||
-rw-r--r-- | services/surfaceflinger/Utils/FlagUtils.h | 33 | ||||
-rw-r--r-- | services/surfaceflinger/main_surfaceflinger.cpp | 3 | ||||
-rw-r--r-- | services/surfaceflinger/tests/unittests/FlagManagerTest.cpp | 90 | ||||
-rw-r--r-- | services/surfaceflinger/tests/unittests/FlagUtils.h | 4 |
15 files changed, 201 insertions, 100 deletions
diff --git a/services/surfaceflinger/DisplayHardware/DisplayMode.h b/services/surfaceflinger/DisplayHardware/DisplayMode.h index 1775a7a4a6..f32fb3a5c7 100644 --- a/services/surfaceflinger/DisplayHardware/DisplayMode.h +++ b/services/surfaceflinger/DisplayHardware/DisplayMode.h @@ -30,8 +30,8 @@ #include <scheduler/Fps.h> #include "DisplayHardware/Hal.h" +#include "FlagManager.h" #include "Scheduler/StrongTyping.h" -#include "Utils/FlagUtils.h" namespace android { @@ -50,7 +50,6 @@ using DisplayModeId = StrongTyping<ui::DisplayModeId, struct DisplayModeIdTag, C using DisplayModes = ftl::SmallMap<DisplayModeId, DisplayModePtr, 3>; using DisplayModeIterator = DisplayModes::const_iterator; -using namespace com::android::graphics::surfaceflinger; class DisplayMode { public: @@ -140,7 +139,7 @@ public: // Peak refresh rate represents the highest refresh rate that can be used // for the presentation. Fps getPeakFps() const { - return flagutils::vrrConfigEnabled() && mVrrConfig + return FlagManager::getInstance().vrr_config() && mVrrConfig ? Fps::fromPeriodNsecs(mVrrConfig->minFrameIntervalNs) : mVsyncRate; } diff --git a/services/surfaceflinger/FlagManager.cpp b/services/surfaceflinger/FlagManager.cpp index 919ea4244e..a8f05bbd56 100644 --- a/services/surfaceflinger/FlagManager.cpp +++ b/services/surfaceflinger/FlagManager.cpp @@ -26,7 +26,11 @@ #include <server_configurable_flags/get_flags.h> #include <cinttypes> +#include <com_android_graphics_surfaceflinger_flags.h> + namespace android { +using namespace com::android::graphics::surfaceflinger; + static constexpr const char* kExperimentNamespace = "surface_flinger_native_boot"; std::unique_ptr<FlagManager> FlagManager::mInstance; @@ -48,6 +52,14 @@ std::optional<bool> parseBool(const char* str) { } } +bool getFlagValue(std::function<bool()> getter, std::optional<bool> overrideValue) { + if (overrideValue.has_value()) { + return *overrideValue; + } + + return getter(); +} + void dumpFlag(std::string& result, const char* name, std::function<bool()> getter) { base::StringAppendF(&result, "%s: %s\n", name, getter() ? "true" : "false"); } @@ -71,12 +83,25 @@ void FlagManager::markBootCompleted() { mBootCompleted = true; } +void FlagManager::setUnitTestMode() { + mUnitTestMode = true; + + // Also set boot completed as we don't really care about it in unit testing + mBootCompleted = true; +} + void FlagManager::dump(std::string& result) const { -#define DUMP_FLAG(name) dumpFlag(result, #name, std::bind(&FlagManager::name, this)); +#define DUMP_FLAG(name) dumpFlag(result, #name, std::bind(&FlagManager::name, this)) base::StringAppendF(&result, "FlagManager values: \n"); DUMP_FLAG(use_adpf_cpu_hint); DUMP_FLAG(use_skia_tracing); + DUMP_FLAG(connected_display); + DUMP_FLAG(dont_skip_on_early); + DUMP_FLAG(enable_small_area_detection); + DUMP_FLAG(misc1); + DUMP_FLAG(late_boot_misc2); + DUMP_FLAG(vrr_config); #undef DUMP_FLAG } @@ -92,7 +117,7 @@ bool FlagManager::getServerConfigurableFlag(const char* experimentFlagName) cons return res.has_value() && res.value(); } -#define FLAG_MANAGER_SERVER_FLAG(name, syspropOverride, serverFlagName) \ +#define FLAG_MANAGER_LEGACY_SERVER_FLAG(name, syspropOverride, serverFlagName) \ bool FlagManager::name() const { \ LOG_ALWAYS_FATAL_IF(!mBootCompleted, \ "Can't read %s before boot completed as it is server writable", \ @@ -102,12 +127,53 @@ bool FlagManager::getServerConfigurableFlag(const char* experimentFlagName) cons return getServerConfigurableFlag(serverFlagName); \ } -FLAG_MANAGER_SERVER_FLAG(test_flag, "", "") -FLAG_MANAGER_SERVER_FLAG(use_adpf_cpu_hint, "debug.sf.enable_adpf_cpu_hint", - "AdpfFeature__adpf_cpu_hint") -FLAG_MANAGER_SERVER_FLAG(use_skia_tracing, PROPERTY_SKIA_ATRACE_ENABLED, - "SkiaTracingFeature__use_skia_tracing") +#define FLAG_MANAGER_FLAG_INTERNAL(name, syspropOverride, checkForBootCompleted) \ + bool FlagManager::name() const { \ + if (checkForBootCompleted) { \ + LOG_ALWAYS_FATAL_IF(!mBootCompleted, \ + "Can't read %s before boot completed as it is server writable", \ + __func__); \ + } \ + static std::optional<bool> debugOverride = getBoolProperty(syspropOverride); \ + static bool value = getFlagValue([] { return flags::name(); }, debugOverride); \ + if (mUnitTestMode) { \ + /* \ + * When testing, we don't want to rely on the cached values stored in the static \ + * variables. \ + */ \ + debugOverride = getBoolProperty(syspropOverride); \ + value = getFlagValue([] { return flags::name(); }, debugOverride); \ + } \ + return value; \ + } -#undef FLAG_MANAGER_SERVER_FLAG +#define FLAG_MANAGER_SERVER_FLAG(name, syspropOverride) \ + FLAG_MANAGER_FLAG_INTERNAL(name, syspropOverride, true) + +#define FLAG_MANAGER_READ_ONLY_FLAG(name, syspropOverride) \ + FLAG_MANAGER_FLAG_INTERNAL(name, syspropOverride, false) + +/// Legacy server flags /// +FLAG_MANAGER_LEGACY_SERVER_FLAG(test_flag, "", "") +FLAG_MANAGER_LEGACY_SERVER_FLAG(use_adpf_cpu_hint, "debug.sf.enable_adpf_cpu_hint", + "AdpfFeature__adpf_cpu_hint") +FLAG_MANAGER_LEGACY_SERVER_FLAG(use_skia_tracing, PROPERTY_SKIA_ATRACE_ENABLED, + "SkiaTracingFeature__use_skia_tracing") + +/// Trunk stable readonly flags /// +FLAG_MANAGER_READ_ONLY_FLAG(connected_display, "") +FLAG_MANAGER_READ_ONLY_FLAG(enable_small_area_detection, "") +FLAG_MANAGER_READ_ONLY_FLAG(misc1, "") +FLAG_MANAGER_READ_ONLY_FLAG(vrr_config, "debug.sf.enable_vrr_config") + +/// Trunk stable server flags /// +FLAG_MANAGER_SERVER_FLAG(late_boot_misc2, "") + +/// Exceptions /// +bool FlagManager::dont_skip_on_early() const { + // Even though this is a server writable flag, we do call it before boot completed, but that's + // fine since the decision is done per frame. We can't do caching though. + return flags::dont_skip_on_early(); +} } // namespace android diff --git a/services/surfaceflinger/FlagManager.h b/services/surfaceflinger/FlagManager.h index facf6c35d8..5a353bbe6c 100644 --- a/services/surfaceflinger/FlagManager.h +++ b/services/surfaceflinger/FlagManager.h @@ -39,10 +39,23 @@ public: void markBootCompleted(); void dump(std::string& result) const; + void setUnitTestMode(); + + /// Legacy server flags /// bool test_flag() const; bool use_adpf_cpu_hint() const; bool use_skia_tracing() const; + /// Trunk stable readonly flags /// + bool connected_display() const; + bool enable_small_area_detection() const; + bool misc1() const; + bool vrr_config() const; + + /// Trunk stable server flags /// + bool late_boot_misc2() const; + bool dont_skip_on_early() const; + protected: // overridden for unit tests virtual std::optional<bool> getBoolProperty(const char*) const; @@ -53,7 +66,8 @@ private: FlagManager(const FlagManager&) = delete; - std::atomic_bool mBootCompleted; + std::atomic_bool mBootCompleted = false; + std::atomic_bool mUnitTestMode = false; static std::unique_ptr<FlagManager> mInstance; static std::once_flag mOnce; diff --git a/services/surfaceflinger/RefreshRateOverlay.cpp b/services/surfaceflinger/RefreshRateOverlay.cpp index 42676c6936..2ac7319709 100644 --- a/services/surfaceflinger/RefreshRateOverlay.cpp +++ b/services/surfaceflinger/RefreshRateOverlay.cpp @@ -17,9 +17,9 @@ #include <algorithm> #include "Client.h" +#include "FlagManager.h" #include "Layer.h" #include "RefreshRateOverlay.h" -#include "Utils/FlagUtils.h" #include <SkSurface.h> @@ -268,7 +268,8 @@ void RefreshRateOverlay::changeRefreshRate(Fps vsyncRate, Fps renderFps) { } void RefreshRateOverlay::changeRenderRate(Fps renderFps) { - if (mFeatures.test(Features::RenderRate) && mVsyncRate && flagutils::vrrConfigEnabled()) { + if (mFeatures.test(Features::RenderRate) && mVsyncRate && + FlagManager::getInstance().vrr_config()) { mRenderFps = renderFps; const auto buffer = getOrCreateBuffers(*mVsyncRate, renderFps)[mFrame]; createTransaction().setBuffer(mSurfaceControl->get(), buffer).apply(); diff --git a/services/surfaceflinger/Scheduler/EventThread.cpp b/services/surfaceflinger/Scheduler/EventThread.cpp index 9a55c94424..7f627f829d 100644 --- a/services/surfaceflinger/Scheduler/EventThread.cpp +++ b/services/surfaceflinger/Scheduler/EventThread.cpp @@ -45,6 +45,7 @@ #include <scheduler/VsyncConfig.h> #include "DisplayHardware/DisplayMode.h" +#include "FlagManager.h" #include "FrameTimeline.h" #include "VSyncDispatch.h" #include "VSyncTracker.h" @@ -308,7 +309,7 @@ sp<EventThreadConnection> EventThread::createEventConnection( auto connection = sp<EventThreadConnection>::make(const_cast<EventThread*>(this), IPCThreadState::self()->getCallingUid(), eventRegistration); - if (flags::misc1()) { + if (FlagManager::getInstance().misc1()) { const int policy = SCHED_FIFO; connection->setMinSchedulerPolicy(policy, sched_get_priority_min(policy)); } diff --git a/services/surfaceflinger/Scheduler/LayerHistory.cpp b/services/surfaceflinger/Scheduler/LayerHistory.cpp index ff829143d3..21bbb08c1c 100644 --- a/services/surfaceflinger/Scheduler/LayerHistory.cpp +++ b/services/surfaceflinger/Scheduler/LayerHistory.cpp @@ -21,7 +21,6 @@ #include "LayerHistory.h" #include <android-base/stringprintf.h> -#include <com_android_graphics_surfaceflinger_flags.h> #include <cutils/properties.h> #include <gui/TraceUtils.h> #include <utils/Log.h> @@ -34,16 +33,15 @@ #include "../Layer.h" #include "EventThread.h" +#include "FlagManager.h" #include "LayerInfo.h" namespace android::scheduler { namespace { -using namespace com::android::graphics::surfaceflinger; - bool isLayerActive(const LayerInfo& info, nsecs_t threshold) { - if (flags::misc1() && !info.isVisible()) { + if (FlagManager::getInstance().misc1() && !info.isVisible()) { return false; } diff --git a/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp b/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp index eb69d0bf22..5892b2b44c 100644 --- a/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp +++ b/services/surfaceflinger/Scheduler/RefreshRateSelector.cpp @@ -38,7 +38,6 @@ #include "../SurfaceFlingerProperties.h" #include "RefreshRateSelector.h" -#include "Utils/FlagUtils.h" #include <com_android_graphics_surfaceflinger_flags.h> @@ -115,7 +114,7 @@ std::pair<unsigned, unsigned> divisorRange(Fps vsyncRate, Fps peakFps, FpsRange using fps_approx_ops::operator/; // use signed type as `fps / range.max` might be 0 auto start = std::max(1, static_cast<int>(peakFps / range.max) - 1); - if (flagutils::vrrConfigEnabled()) { + if (FlagManager::getInstance().vrr_config()) { start = std::max(1, static_cast<int>(vsyncRate / std::min(range.max, peakFps, fps_approx_ops::operator<)) - diff --git a/services/surfaceflinger/Scheduler/Scheduler.cpp b/services/surfaceflinger/Scheduler/Scheduler.cpp index 5b36a5efa6..1a8713d4a9 100644 --- a/services/surfaceflinger/Scheduler/Scheduler.cpp +++ b/services/surfaceflinger/Scheduler/Scheduler.cpp @@ -47,6 +47,7 @@ #include "../Layer.h" #include "EventThread.h" +#include "FlagManager.h" #include "FrameRateOverrideMappings.h" #include "FrontEnd/LayerHandle.h" #include "OneShotTimer.h" @@ -210,7 +211,7 @@ void Scheduler::onFrameSignal(ICompositor& compositor, VsyncId vsyncId, targeters.try_emplace(id, &targeter); } - if (flagutils::vrrConfigEnabled() && + if (FlagManager::getInstance().vrr_config() && CC_UNLIKELY(mPacesetterFrameDurationFractionToSkip > 0.f)) { const auto period = pacesetterTargeter.target().expectedFrameDuration(); const auto skipDuration = Duration::fromNs( diff --git a/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp b/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp index f4676706fd..186a6bc9d6 100644 --- a/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp +++ b/services/surfaceflinger/Scheduler/VSyncDispatchTimerQueue.cpp @@ -25,16 +25,14 @@ #include <scheduler/TimeKeeper.h> +#include "FlagManager.h" #include "VSyncDispatchTimerQueue.h" #include "VSyncTracker.h" -#include <com_android_graphics_surfaceflinger_flags.h> - #undef LOG_TAG #define LOG_TAG "VSyncDispatch" namespace android::scheduler { -using namespace com::android::graphics::surfaceflinger; using base::StringAppendF; @@ -43,7 +41,8 @@ namespace { nsecs_t getExpectedCallbackTime(nsecs_t now, nsecs_t nextVsyncTime, const VSyncDispatch::ScheduleTiming& timing) { const auto expectedCallbackTime = nextVsyncTime - timing.readyDuration - timing.workDuration; - const auto baseTime = flags::dont_skip_on_early() ? now : expectedCallbackTime; + const auto baseTime = + FlagManager::getInstance().dont_skip_on_early() ? now : expectedCallbackTime; return std::max(baseTime, expectedCallbackTime); } @@ -105,7 +104,7 @@ ScheduleResult VSyncDispatchTimerQueueEntry::schedule(VSyncDispatch::ScheduleTim mArmedInfo && (nextVsyncTime > (mArmedInfo->mActualVsyncTime + mMinVsyncDistance)); bool const wouldSkipAWakeup = mArmedInfo && ((nextWakeupTime > (mArmedInfo->mActualWakeupTime + mMinVsyncDistance))); - if (flags::dont_skip_on_early()) { + if (FlagManager::getInstance().dont_skip_on_early()) { if (wouldSkipAVsyncTarget || wouldSkipAWakeup) { return getExpectedCallbackTime(now, mArmedInfo->mActualVsyncTime, timing); } diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 3050520d79..62eb17d2e7 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -157,15 +157,12 @@ #include "TimeStats/TimeStats.h" #include "TunnelModeEnabledReporter.h" #include "Utils/Dumper.h" -#include "Utils/FlagUtils.h" #include "WindowInfosListenerInvoker.h" #include <aidl/android/hardware/graphics/common/DisplayDecorationSupport.h> #include <aidl/android/hardware/graphics/composer3/DisplayCapability.h> #include <aidl/android/hardware/graphics/composer3/RenderIntent.h> -#include <com_android_graphics_surfaceflinger_flags.h> - #undef NO_THREAD_SAFETY_ANALYSIS #define NO_THREAD_SAFETY_ANALYSIS \ _Pragma("GCC error \"Prefer <ftl/fake_guard.h> or MutexUtils.h helpers.\"") @@ -175,8 +172,6 @@ #define DOES_CONTAIN_BORDER false namespace android { -using namespace com::android::graphics::surfaceflinger; - using namespace std::chrono_literals; using namespace std::string_literals; using namespace std::string_view_literals; @@ -509,11 +504,6 @@ SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipI base::GetBoolProperty("persist.debug.sf.enable_layer_lifecycle_manager"s, true); mLegacyFrontEndEnabled = !mLayerLifecycleManagerEnabled || base::GetBoolProperty("persist.debug.sf.enable_legacy_frontend"s, false); - - // Trunk-Stable flags - mMiscFlagValue = flags::misc1(); - mConnectedDisplayFlagValue = flags::connected_display(); - mMisc2FlagEarlyBootValue = flags::late_boot_misc2(); } LatchUnsignaledConfig SurfaceFlinger::getLatchUnsignaledConfig() { @@ -756,10 +746,6 @@ void SurfaceFlinger::bootFinished() { enableRefreshRateOverlay(true); } })); - - LOG_ALWAYS_FATAL_IF(flags::misc1() != mMiscFlagValue, "misc1 flag is not boot stable!"); - - mMisc2FlagLateBootValue = flags::late_boot_misc2(); } static std::optional<renderengine::RenderEngine::RenderEngineType> @@ -2102,7 +2088,7 @@ nsecs_t SurfaceFlinger::getVsyncPeriodFromHWC() const { void SurfaceFlinger::onComposerHalVsync(hal::HWDisplayId hwcDisplayId, int64_t timestamp, std::optional<hal::VsyncPeriodNanos> vsyncPeriod) { - if (mConnectedDisplayFlagValue) { + if (FlagManager::getInstance().connected_display()) { // use ~0 instead of -1 as AidlComposerHal.cpp passes the param as unsigned int32 if (mIsHotplugErrViaNegVsync && timestamp < 0 && vsyncPeriod.has_value() && vsyncPeriod.value() == ~0) { @@ -4066,7 +4052,7 @@ void SurfaceFlinger::initScheduler(const sp<const DisplayDevice>& display) { if (sysprop::use_content_detection_for_refresh_rate(false)) { features |= Feature::kContentDetection; - if (flags::enable_small_area_detection()) { + if (FlagManager::getInstance().enable_small_area_detection()) { features |= Feature::kSmallDirtyContentDetection; } } @@ -6476,17 +6462,6 @@ void SurfaceFlinger::dumpAllLocked(const DumpArgs& args, const std::string& comp result.append("SurfaceFlinger global state:\n"); colorizer.reset(result); - StringAppendF(&result, "MiscFlagValue: %s\n", mMiscFlagValue ? "true" : "false"); - StringAppendF(&result, "ConnectedDisplayFlagValue: %s\n", - mConnectedDisplayFlagValue ? "true" : "false"); - StringAppendF(&result, "Misc2FlagValue: %s (%s after boot)\n", - mMisc2FlagLateBootValue ? "true" : "false", - mMisc2FlagEarlyBootValue == mMisc2FlagLateBootValue ? "stable" : "modified"); - StringAppendF(&result, "VrrConfigFlagValue: %s\n", - flagutils::vrrConfigEnabled() ? "true" : "false"); - StringAppendF(&result, "DontSkipOnEarlyFlagValue: %s\n", - flags::dont_skip_on_early() ? "true" : "false"); - getRenderEngine().dump(result); result.append("ClientCache state:\n"); @@ -7228,7 +7203,7 @@ status_t SurfaceFlinger::onTransact(uint32_t code, const Parcel& data, Parcel* r // Second argument is a delay in ms for triggering the jank. This is useful for working // with tools that steal the adb connection. This argument is optional. case 1045: { - if (flagutils::vrrConfigEnabled()) { + if (FlagManager::getInstance().vrr_config()) { float jankAmount = data.readFloat(); int32_t jankDelayMs = 0; if (data.readInt32(&jankDelayMs) != NO_ERROR) { @@ -9079,7 +9054,7 @@ binder::Status SurfaceComposerAIDL::createConnection(sp<gui::ISurfaceComposerCli const sp<Client> client = sp<Client>::make(mFlinger); if (client->initCheck() == NO_ERROR) { *outClient = client; - if (flags::misc1()) { + if (FlagManager::getInstance().misc1()) { const int policy = SCHED_FIFO; client->setMinSchedulerPolicy(policy, sched_get_priority_min(policy)); } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index 51dd394b72..520bd221b3 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -1457,12 +1457,6 @@ private: void sfdo_setDebugFlash(int delay); void sfdo_scheduleComposite(); void sfdo_scheduleCommit(); - - // Trunk-Stable flags - bool mMiscFlagValue; - bool mConnectedDisplayFlagValue; - bool mMisc2FlagEarlyBootValue; - bool mMisc2FlagLateBootValue; }; class SurfaceComposerAIDL : public gui::BnSurfaceComposer { diff --git a/services/surfaceflinger/Utils/FlagUtils.h b/services/surfaceflinger/Utils/FlagUtils.h deleted file mode 100644 index 8435f04573..0000000000 --- a/services/surfaceflinger/Utils/FlagUtils.h +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include <android-base/properties.h> -#include <com_android_graphics_surfaceflinger_flags.h> -#include <string> - -namespace android::flagutils { - -using namespace std::literals::string_literals; -using namespace com::android::graphics::surfaceflinger; - -inline bool vrrConfigEnabled() { - static const bool enable_vrr_config = - base::GetBoolProperty("debug.sf.enable_vrr_config"s, false); - return flags::vrr_config() || enable_vrr_config; -} -} // namespace android::flagutils diff --git a/services/surfaceflinger/main_surfaceflinger.cpp b/services/surfaceflinger/main_surfaceflinger.cpp index 959945230d..9889cb9c5d 100644 --- a/services/surfaceflinger/main_surfaceflinger.cpp +++ b/services/surfaceflinger/main_surfaceflinger.cpp @@ -34,6 +34,7 @@ #include <errno.h> #include <hidl/LegacySupport.h> #include <processgroup/sched_policy.h> +#include "FlagManager.h" #include "SurfaceFlinger.h" #include "SurfaceFlingerFactory.h" #include "SurfaceFlingerProperties.h" @@ -149,7 +150,7 @@ int main(int, char**) { // publish gui::ISurfaceComposer, the new AIDL interface sp<SurfaceComposerAIDL> composerAIDL = sp<SurfaceComposerAIDL>::make(flinger); - if (flags::misc1()) { + if (FlagManager::getInstance().misc1()) { composerAIDL->setMinSchedulerPolicy(SCHED_FIFO, newPriority); } sm->addService(String16("SurfaceFlingerAIDL"), composerAIDL, false, diff --git a/services/surfaceflinger/tests/unittests/FlagManagerTest.cpp b/services/surfaceflinger/tests/unittests/FlagManagerTest.cpp index 32c4d05919..aa37754300 100644 --- a/services/surfaceflinger/tests/unittests/FlagManagerTest.cpp +++ b/services/surfaceflinger/tests/unittests/FlagManagerTest.cpp @@ -18,11 +18,14 @@ #define LOG_TAG "FlagManagerTest" #include "FlagManager.h" +#include "FlagUtils.h" #include <gmock/gmock.h> #include <gtest/gtest.h> #include <log/log.h> +#include <com_android_graphics_surfaceflinger_flags.h> + namespace android { using testing::Return; @@ -58,12 +61,12 @@ TEST_F(FlagManagerTest, isSingleton) { EXPECT_EQ(&FlagManager::getInstance(), &FlagManager::getInstance()); } -TEST_F(FlagManagerTest, creashesIfQueriedBeforeBoot) { +TEST_F(FlagManagerTest, legacyCreashesIfQueriedBeforeBoot) { mFlagManager.markBootIncomplete(); - EXPECT_DEATH(FlagManager::getInstance().use_adpf_cpu_hint(), ""); + EXPECT_DEATH(FlagManager::getInstance().test_flag(), ""); } -TEST_F(FlagManagerTest, returnsOverride) { +TEST_F(FlagManagerTest, legacyReturnsOverride) { EXPECT_CALL(mFlagManager, getBoolProperty).WillOnce(Return(true)); EXPECT_EQ(true, mFlagManager.test_flag()); @@ -71,7 +74,7 @@ TEST_F(FlagManagerTest, returnsOverride) { EXPECT_EQ(false, mFlagManager.test_flag()); } -TEST_F(FlagManagerTest, returnsValue) { +TEST_F(FlagManagerTest, legacyReturnsValue) { EXPECT_CALL(mFlagManager, getBoolProperty).WillRepeatedly(Return(std::nullopt)); EXPECT_CALL(mFlagManager, getServerConfigurableFlag).WillOnce(Return(true)); @@ -81,4 +84,83 @@ TEST_F(FlagManagerTest, returnsValue) { EXPECT_EQ(false, mFlagManager.test_flag()); } +TEST_F(FlagManagerTest, creashesIfQueriedBeforeBoot) { + mFlagManager.markBootIncomplete(); + EXPECT_DEATH(FlagManager::getInstance().late_boot_misc2(), ""); +} + +TEST_F(FlagManagerTest, returnsOverride) { + mFlagManager.setUnitTestMode(); + + // Twice, since the first call is to initialize the static variable + EXPECT_CALL(mFlagManager, getBoolProperty) + .Times((2)) + .WillOnce(Return(true)) + .WillOnce(Return(true)); + EXPECT_EQ(true, mFlagManager.late_boot_misc2()); + + EXPECT_CALL(mFlagManager, getBoolProperty).WillOnce(Return(false)); + EXPECT_EQ(false, mFlagManager.late_boot_misc2()); +} + +TEST_F(FlagManagerTest, returnsValue) { + mFlagManager.setUnitTestMode(); + + EXPECT_CALL(mFlagManager, getBoolProperty).WillRepeatedly(Return(std::nullopt)); + + { + SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::late_boot_misc2, true); + EXPECT_EQ(true, mFlagManager.late_boot_misc2()); + } + + { + SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::late_boot_misc2, false); + EXPECT_EQ(false, mFlagManager.late_boot_misc2()); + } +} + +TEST_F(FlagManagerTest, readonlyReturnsOverride) { + mFlagManager.setUnitTestMode(); + + // Twice, since the first call is to initialize the static variable + EXPECT_CALL(mFlagManager, getBoolProperty) + .Times(2) + .WillOnce(Return(true)) + .WillOnce(Return(true)); + EXPECT_EQ(true, mFlagManager.misc1()); + + EXPECT_CALL(mFlagManager, getBoolProperty).WillOnce(Return(false)); + EXPECT_EQ(false, mFlagManager.misc1()); +} + +TEST_F(FlagManagerTest, readonlyReturnsValue) { + mFlagManager.setUnitTestMode(); + + EXPECT_CALL(mFlagManager, getBoolProperty).WillRepeatedly(Return(std::nullopt)); + + { + SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::misc1, true); + EXPECT_EQ(true, mFlagManager.misc1()); + } + + { + SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::misc1, false); + EXPECT_EQ(false, mFlagManager.misc1()); + } +} + +TEST_F(FlagManagerTest, dontSkipOnEarlyIsNotCached) { + EXPECT_CALL(mFlagManager, getBoolProperty).WillRepeatedly(Return(std::nullopt)); + + const auto initialValue = com::android::graphics::surfaceflinger::flags::dont_skip_on_early(); + + com::android::graphics::surfaceflinger::flags::dont_skip_on_early(true); + EXPECT_EQ(true, mFlagManager.dont_skip_on_early()); + + com::android::graphics::surfaceflinger::flags::dont_skip_on_early(false); + EXPECT_EQ(false, mFlagManager.dont_skip_on_early()); + + com::android::graphics::surfaceflinger::flags::dont_skip_on_early(initialValue); +} + } // namespace android diff --git a/services/surfaceflinger/tests/unittests/FlagUtils.h b/services/surfaceflinger/tests/unittests/FlagUtils.h index 7103684577..333e4e7e05 100644 --- a/services/surfaceflinger/tests/unittests/FlagUtils.h +++ b/services/surfaceflinger/tests/unittests/FlagUtils.h @@ -16,12 +16,16 @@ #pragma once +#include "FlagManager.h" + #define SET_FLAG_FOR_TEST(name, value) TestFlagSetter _testflag_((name), (name), (value)) namespace android { class TestFlagSetter { public: TestFlagSetter(bool (*getter)(), void((*setter)(bool)), bool flagValue) { + FlagManager::getMutableInstance().setUnitTestMode(); + const bool initialValue = getter(); setter(flagValue); mResetFlagValue = [=] { setter(initialValue); }; |