blob: 11a5e0da8ccc8361ca96b693f8e65cc08a847343 [file] [log] [blame]
rnlee81d32602021-07-27 13:24:07 -07001/*
2 * Copyright (C) 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "FlagManager.h"
18
19#include <SurfaceFlingerProperties.sysprop.h>
20#include <android-base/parsebool.h>
21#include <android-base/parseint.h>
Leon Scroggins IIIa37ca992022-02-02 18:08:20 -050022#include <android-base/properties.h>
rnlee81d32602021-07-27 13:24:07 -070023#include <android-base/stringprintf.h>
24#include <log/log.h>
Leon Scroggins IIIa37ca992022-02-02 18:08:20 -050025#include <renderengine/RenderEngine.h>
rnlee81d32602021-07-27 13:24:07 -070026#include <server_configurable_flags/get_flags.h>
27#include <cinttypes>
28
Ady Abrahamd6d80162023-10-23 12:57:41 -070029#include <com_android_graphics_surfaceflinger_flags.h>
30
rnlee81d32602021-07-27 13:24:07 -070031namespace android {
Ady Abrahamd6d80162023-10-23 12:57:41 -070032using namespace com::android::graphics::surfaceflinger;
33
rnlee81d32602021-07-27 13:24:07 -070034static constexpr const char* kExperimentNamespace = "surface_flinger_native_boot";
rnlee81d32602021-07-27 13:24:07 -070035
Ady Abraham53b0c492023-10-23 11:47:14 -070036std::unique_ptr<FlagManager> FlagManager::mInstance;
37std::once_flag FlagManager::mOnce;
38
39FlagManager::FlagManager(ConstructorTag) {}
rnlee81d32602021-07-27 13:24:07 -070040FlagManager::~FlagManager() = default;
41
rnlee81d32602021-07-27 13:24:07 -070042namespace {
Ady Abrahamc589dc42023-10-26 16:20:53 -070043std::optional<bool> parseBool(const char* str) {
rnlee81d32602021-07-27 13:24:07 -070044 base::ParseBoolResult parseResult = base::ParseBool(str);
45 switch (parseResult) {
46 case base::ParseBoolResult::kTrue:
47 return std::make_optional(true);
48 case base::ParseBoolResult::kFalse:
49 return std::make_optional(false);
50 case base::ParseBoolResult::kError:
51 return std::nullopt;
52 }
53}
Ady Abrahamc589dc42023-10-26 16:20:53 -070054
Ady Abrahamd6d80162023-10-23 12:57:41 -070055bool getFlagValue(std::function<bool()> getter, std::optional<bool> overrideValue) {
56 if (overrideValue.has_value()) {
57 return *overrideValue;
58 }
59
60 return getter();
61}
62
Ady Abrahamc589dc42023-10-26 16:20:53 -070063void dumpFlag(std::string& result, const char* name, std::function<bool()> getter) {
64 base::StringAppendF(&result, "%s: %s\n", name, getter() ? "true" : "false");
65}
66
rnlee81d32602021-07-27 13:24:07 -070067} // namespace
68
Ady Abrahamc589dc42023-10-26 16:20:53 -070069const FlagManager& FlagManager::getInstance() {
70 return getMutableInstance();
rnlee81d32602021-07-27 13:24:07 -070071}
72
Ady Abrahamc589dc42023-10-26 16:20:53 -070073FlagManager& FlagManager::getMutableInstance() {
74 std::call_once(mOnce, [&] {
75 LOG_ALWAYS_FATAL_IF(mInstance, "Instance already created");
76 mInstance = std::make_unique<FlagManager>(ConstructorTag{});
77 });
78
79 return *mInstance;
80}
81
82void FlagManager::markBootCompleted() {
83 mBootCompleted = true;
84}
85
Ady Abrahamd6d80162023-10-23 12:57:41 -070086void FlagManager::setUnitTestMode() {
87 mUnitTestMode = true;
88
89 // Also set boot completed as we don't really care about it in unit testing
90 mBootCompleted = true;
91}
92
Ady Abrahamc589dc42023-10-26 16:20:53 -070093void FlagManager::dump(std::string& result) const {
Ady Abrahamd6d80162023-10-23 12:57:41 -070094#define DUMP_FLAG(name) dumpFlag(result, #name, std::bind(&FlagManager::name, this))
Ady Abrahamc589dc42023-10-26 16:20:53 -070095
96 base::StringAppendF(&result, "FlagManager values: \n");
97 DUMP_FLAG(use_adpf_cpu_hint);
98 DUMP_FLAG(use_skia_tracing);
Ady Abrahamd6d80162023-10-23 12:57:41 -070099 DUMP_FLAG(connected_display);
100 DUMP_FLAG(dont_skip_on_early);
101 DUMP_FLAG(enable_small_area_detection);
102 DUMP_FLAG(misc1);
103 DUMP_FLAG(late_boot_misc2);
104 DUMP_FLAG(vrr_config);
Brian Johnson8c144002023-10-30 15:47:44 -0700105 DUMP_FLAG(hotplug2);
Brian Johnson4f095462023-10-31 10:12:55 -0700106 DUMP_FLAG(hdcp_level_hal);
Ady Abrahamc589dc42023-10-26 16:20:53 -0700107
108#undef DUMP_FLAG
109}
110
111std::optional<bool> FlagManager::getBoolProperty(const char* property) const {
112 return parseBool(base::GetProperty(property, "").c_str());
113}
114
115bool FlagManager::getServerConfigurableFlag(const char* experimentFlagName) const {
116 const auto value = server_configurable_flags::GetServerConfigurableFlag(kExperimentNamespace,
117 experimentFlagName, "");
118 const auto res = parseBool(value.c_str());
119 return res.has_value() && res.value();
120}
121
Ady Abrahamd6d80162023-10-23 12:57:41 -0700122#define FLAG_MANAGER_LEGACY_SERVER_FLAG(name, syspropOverride, serverFlagName) \
Ady Abrahamc589dc42023-10-26 16:20:53 -0700123 bool FlagManager::name() const { \
124 LOG_ALWAYS_FATAL_IF(!mBootCompleted, \
125 "Can't read %s before boot completed as it is server writable", \
126 __func__); \
127 const auto debugOverride = getBoolProperty(syspropOverride); \
128 if (debugOverride.has_value()) return debugOverride.value(); \
129 return getServerConfigurableFlag(serverFlagName); \
rnlee81d32602021-07-27 13:24:07 -0700130 }
rnlee81d32602021-07-27 13:24:07 -0700131
Ady Abrahamd6d80162023-10-23 12:57:41 -0700132#define FLAG_MANAGER_FLAG_INTERNAL(name, syspropOverride, checkForBootCompleted) \
133 bool FlagManager::name() const { \
134 if (checkForBootCompleted) { \
135 LOG_ALWAYS_FATAL_IF(!mBootCompleted, \
136 "Can't read %s before boot completed as it is server writable", \
137 __func__); \
138 } \
139 static std::optional<bool> debugOverride = getBoolProperty(syspropOverride); \
140 static bool value = getFlagValue([] { return flags::name(); }, debugOverride); \
141 if (mUnitTestMode) { \
142 /* \
143 * When testing, we don't want to rely on the cached values stored in the static \
144 * variables. \
145 */ \
146 debugOverride = getBoolProperty(syspropOverride); \
147 value = getFlagValue([] { return flags::name(); }, debugOverride); \
148 } \
149 return value; \
150 }
Matt Buckleyd23c7962021-09-21 20:43:00 +0000151
Ady Abrahamd6d80162023-10-23 12:57:41 -0700152#define FLAG_MANAGER_SERVER_FLAG(name, syspropOverride) \
153 FLAG_MANAGER_FLAG_INTERNAL(name, syspropOverride, true)
154
155#define FLAG_MANAGER_READ_ONLY_FLAG(name, syspropOverride) \
156 FLAG_MANAGER_FLAG_INTERNAL(name, syspropOverride, false)
157
158/// Legacy server flags ///
159FLAG_MANAGER_LEGACY_SERVER_FLAG(test_flag, "", "")
160FLAG_MANAGER_LEGACY_SERVER_FLAG(use_adpf_cpu_hint, "debug.sf.enable_adpf_cpu_hint",
161 "AdpfFeature__adpf_cpu_hint")
162FLAG_MANAGER_LEGACY_SERVER_FLAG(use_skia_tracing, PROPERTY_SKIA_ATRACE_ENABLED,
163 "SkiaTracingFeature__use_skia_tracing")
164
165/// Trunk stable readonly flags ///
166FLAG_MANAGER_READ_ONLY_FLAG(connected_display, "")
167FLAG_MANAGER_READ_ONLY_FLAG(enable_small_area_detection, "")
168FLAG_MANAGER_READ_ONLY_FLAG(misc1, "")
169FLAG_MANAGER_READ_ONLY_FLAG(vrr_config, "debug.sf.enable_vrr_config")
Brian Johnson8c144002023-10-30 15:47:44 -0700170FLAG_MANAGER_READ_ONLY_FLAG(hotplug2, "")
Brian Johnson4f095462023-10-31 10:12:55 -0700171FLAG_MANAGER_READ_ONLY_FLAG(hdcp_level_hal, "")
Ady Abrahamd6d80162023-10-23 12:57:41 -0700172
173/// Trunk stable server flags ///
174FLAG_MANAGER_SERVER_FLAG(late_boot_misc2, "")
175
176/// Exceptions ///
177bool FlagManager::dont_skip_on_early() const {
178 // Even though this is a server writable flag, we do call it before boot completed, but that's
179 // fine since the decision is done per frame. We can't do caching though.
180 return flags::dont_skip_on_early();
181}
Leon Scroggins IIIa37ca992022-02-02 18:08:20 -0500182
rnlee81d32602021-07-27 13:24:07 -0700183} // namespace android