2323#include < sys/stat.h>
2424#include < vector>
2525
26+ #include < android-base/macros.h>
2627#include < graphicsenv/FeatureOverrides.h>
2728#include < log/log.h>
29+ #include < vkjson.h>
2830
2931#include " feature_config.pb.h"
3032
@@ -35,13 +37,53 @@ void resetFeatureOverrides(android::FeatureOverrides &featureOverrides) {
3537 featureOverrides.mPackageFeatures .clear ();
3638}
3739
40+ bool
41+ gpuVendorIdMatches (const VkJsonInstance &vkJsonInstance,
42+ const uint32_t &configVendorId) {
43+ if (vkJsonInstance.devices .empty ()) {
44+ return false ;
45+ }
46+
47+ // Always match the TEST Vendor ID
48+ if (configVendorId == feature_override::GpuVendorID::VENDOR_ID_TEST) {
49+ return true ;
50+ }
51+
52+ // Always assume one GPU device.
53+ uint32_t vendorID = vkJsonInstance.devices .front ().properties .vendorID ;
54+
55+ return vendorID == configVendorId;
56+ }
57+
58+ bool
59+ conditionsMet (const VkJsonInstance &vkJsonInstance,
60+ const android::FeatureConfig &featureConfig) {
61+ bool gpuVendorIdMatch = false ;
62+
63+ if (featureConfig.mGpuVendorIDs .empty ()) {
64+ gpuVendorIdMatch = true ;
65+ } else {
66+ for (const auto &gpuVendorID: featureConfig.mGpuVendorIDs ) {
67+ if (gpuVendorIdMatches (vkJsonInstance, gpuVendorID)) {
68+ gpuVendorIdMatch = true ;
69+ break ;
70+ }
71+ }
72+ }
73+
74+ return gpuVendorIdMatch;
75+ }
76+
3877void initFeatureConfig (android::FeatureConfig &featureConfig,
3978 const feature_override::FeatureConfig &featureConfigProto) {
4079 featureConfig.mFeatureName = featureConfigProto.feature_name ();
4180 featureConfig.mEnabled = featureConfigProto.enabled ();
81+ for (const auto &gpuVendorIdProto: featureConfigProto.gpu_vendor_ids ()) {
82+ featureConfig.mGpuVendorIDs .emplace_back (static_cast <uint32_t >(gpuVendorIdProto));
83+ }
4284}
4385
44- feature_override::FeatureOverrideProtos readFeatureConfigProtos (std::string configFilePath) {
86+ feature_override::FeatureOverrideProtos readFeatureConfigProtos (const std::string & configFilePath) {
4587 feature_override::FeatureOverrideProtos overridesProtos;
4688
4789 std::ifstream protobufBinaryFile (configFilePath.c_str ());
@@ -78,9 +120,15 @@ std::string FeatureOverrideParser::getFeatureOverrideFilePath() const {
78120
79121bool FeatureOverrideParser::shouldReloadFeatureOverrides () const {
80122 std::string configFilePath = getFeatureOverrideFilePath ();
123+
124+ std::ifstream configFile (configFilePath);
125+ if (!configFile.good ()) {
126+ return false ;
127+ }
128+
81129 struct stat fileStat{};
82- if (stat (getFeatureOverrideFilePath () .c_str (), &fileStat) != 0 ) {
83- ALOGE (" Error getting file information for '%s': %s" , getFeatureOverrideFilePath () .c_str (),
130+ if (stat (configFilePath .c_str (), &fileStat) != 0 ) {
131+ ALOGE (" Error getting file information for '%s': %s" , configFilePath .c_str (),
84132 strerror (errno));
85133 // stat'ing the file failed, so return false since reading it will also likely fail.
86134 return false ;
@@ -100,12 +148,22 @@ void FeatureOverrideParser::parseFeatureOverrides() {
100148 // Clear out the stale values before adding the newly parsed data.
101149 resetFeatureOverrides (mFeatureOverrides );
102150
151+ if (overridesProtos.global_features ().empty () &&
152+ overridesProtos.package_features ().empty ()) {
153+ // No overrides to parse.
154+ return ;
155+ }
156+
157+ const VkJsonInstance vkJsonInstance = VkJsonGetInstance ();
158+
103159 // Global feature overrides.
104160 for (const auto &featureConfigProto: overridesProtos.global_features ()) {
105161 FeatureConfig featureConfig;
106162 initFeatureConfig (featureConfig, featureConfigProto);
107163
108- mFeatureOverrides .mGlobalFeatures .emplace_back (featureConfig);
164+ if (conditionsMet (vkJsonInstance, featureConfig)) {
165+ mFeatureOverrides .mGlobalFeatures .emplace_back (featureConfig);
166+ }
109167 }
110168
111169 // App-specific feature overrides.
@@ -122,7 +180,9 @@ void FeatureOverrideParser::parseFeatureOverrides() {
122180 FeatureConfig featureConfig;
123181 initFeatureConfig (featureConfig, featureConfigProto);
124182
125- featureConfigs.emplace_back (featureConfig);
183+ if (conditionsMet (vkJsonInstance, featureConfig)) {
184+ featureConfigs.emplace_back (featureConfig);
185+ }
126186 }
127187
128188 mFeatureOverrides .mPackageFeatures [packageName] = featureConfigs;
0 commit comments