Commit 7616dfbd by Courtney Goeltzenleuchter Committed by Commit Bot

Vulkan: Allow Android properties to override features

Can enable/disable ANGLE feature via Android properties: debug.angle.feature_overrides_enabled and debug.angle.feature_overrides_disabled which take a string of ':' separated feature strings. Bug: b/170328907 Change-Id: I815b42c5cfae85a39f0f753eabd56e264ea38baf Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2514200 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
parent a481bee2
...@@ -188,6 +188,8 @@ struct FeatureSetBase ...@@ -188,6 +188,8 @@ struct FeatureSetBase
features->push_back(it->second); features->push_back(it->second);
} }
} }
const FeatureMap &getFeatures() const { return members; }
}; };
inline FeatureSetBase::FeatureSetBase() = default; inline FeatureSetBase::FeatureSetBase() = default;
......
...@@ -235,9 +235,11 @@ bool ReplaceSubstring(std::string *str, ...@@ -235,9 +235,11 @@ bool ReplaceSubstring(std::string *str,
return true; return true;
} }
std::vector<std::string> GetStringsFromEnvironmentVar(const char *varName, const char *separator) std::vector<std::string> GetStringsFromEnvironmentVarOrAndroidProperty(const char *varName,
const char *propertyName,
const char *separator)
{ {
std::string environment = GetEnvironmentVar(varName); std::string environment = GetEnvironmentVarOrAndroidProperty(varName, propertyName);
return SplitString(environment, separator, TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY); return SplitString(environment, separator, TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
} }
......
...@@ -94,7 +94,9 @@ bool ReplaceSubstring(std::string *str, ...@@ -94,7 +94,9 @@ bool ReplaceSubstring(std::string *str,
const std::string &replacement); const std::string &replacement);
// Split up a string parsed from an environment variable. // Split up a string parsed from an environment variable.
std::vector<std::string> GetStringsFromEnvironmentVar(const char *varName, const char *separator); std::vector<std::string> GetStringsFromEnvironmentVarOrAndroidProperty(const char *varName,
const char *propertyName,
const char *separator);
// Split up a string parsed from environment variable or via Android property, use cached result if // Split up a string parsed from environment variable or via Android property, use cached result if
// available. // available.
......
...@@ -58,8 +58,8 @@ void Overlay::destroy(const gl::Context *context) ...@@ -58,8 +58,8 @@ void Overlay::destroy(const gl::Context *context)
void Overlay::enableOverlayWidgetsFromEnvironment() void Overlay::enableOverlayWidgetsFromEnvironment()
{ {
std::vector<std::string> enabledWidgets = std::vector<std::string> enabledWidgets = angle::GetStringsFromEnvironmentVarOrAndroidProperty(
angle::GetStringsFromEnvironmentVar("ANGLE_OVERLAY", ":"); "ANGLE_OVERLAY", "debug.angle.overlay", ":");
for (const std::pair<const char *, WidgetId> &widgetName : kWidgetNames) for (const std::pair<const char *, WidgetId> &widgetName : kWidgetNames)
{ {
......
...@@ -902,18 +902,46 @@ gl::Rectangle ClipRectToScissor(const gl::State &glState, const gl::Rectangle &r ...@@ -902,18 +902,46 @@ gl::Rectangle ClipRectToScissor(const gl::State &glState, const gl::Rectangle &r
return clippedRect; return clippedRect;
} }
void LogFeatureStatus(const angle::FeatureSetBase &features,
const std::vector<std::string> &featureNames,
bool enabled)
{
for (const std::string &name : featureNames)
{
if (features.getFeatures().find(name) != features.getFeatures().end())
{
INFO() << "Feature: " << name << (enabled ? " enabled" : " disabled");
}
else
{
WARN() << "Feature: " << name << " is not a valid feature name.";
}
}
}
void ApplyFeatureOverrides(angle::FeatureSetBase *features, const egl::DisplayState &state) void ApplyFeatureOverrides(angle::FeatureSetBase *features, const egl::DisplayState &state)
{ {
features->overrideFeatures(state.featureOverridesEnabled, true); features->overrideFeatures(state.featureOverridesEnabled, true);
features->overrideFeatures(state.featureOverridesDisabled, false); features->overrideFeatures(state.featureOverridesDisabled, false);
// Override with environment as well. // Override with environment as well.
constexpr char kAngleFeatureOverridesEnabledEnvName[] = "ANGLE_FEATURE_OVERRIDES_ENABLED";
constexpr char kAngleFeatureOverridesDisabledEnvName[] = "ANGLE_FEATURE_OVERRIDES_DISABLED";
constexpr char kAngleFeatureOverridesEnabledPropertyName[] =
"debug.angle.feature_overrides_enabled";
constexpr char kAngleFeatureOverridesDisabledPropertyName[] =
"debug.angle.feature_overrides_disabled";
std::vector<std::string> overridesEnabled = std::vector<std::string> overridesEnabled =
angle::GetStringsFromEnvironmentVar("ANGLE_FEATURE_OVERRIDES_ENABLED", ":"); angle::GetCachedStringsFromEnvironmentVarOrAndroidProperty(
kAngleFeatureOverridesEnabledEnvName, kAngleFeatureOverridesEnabledPropertyName, ":");
std::vector<std::string> overridesDisabled = std::vector<std::string> overridesDisabled =
angle::GetStringsFromEnvironmentVar("ANGLE_FEATURE_OVERRIDES_DISABLED", ":"); angle::GetCachedStringsFromEnvironmentVarOrAndroidProperty(
kAngleFeatureOverridesDisabledEnvName, kAngleFeatureOverridesDisabledPropertyName, ":");
features->overrideFeatures(overridesEnabled, true); features->overrideFeatures(overridesEnabled, true);
LogFeatureStatus(*features, overridesEnabled, true);
features->overrideFeatures(overridesDisabled, false); features->overrideFeatures(overridesDisabled, false);
LogFeatureStatus(*features, overridesDisabled, false);
} }
void GetSamplePosition(GLsizei sampleCount, size_t index, GLfloat *xy) void GetSamplePosition(GLsizei sampleCount, size_t index, GLfloat *xy)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment