diff options
Diffstat (limited to 'services/surfaceflinger/FlagManager.cpp')
-rw-r--r-- | services/surfaceflinger/FlagManager.cpp | 82 |
1 files changed, 74 insertions, 8 deletions
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 |