[SyncFS] Build indexes from FileTracker entries on disk.
[chromium-blink-merge.git] / gpu / config / gpu_control_list.h
blobb2daa47eb38d975dc0e9063ef2c025fd2db301ec
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef GPU_CONFIG_GPU_CONTROL_LIST_H_
6 #define GPU_CONFIG_GPU_CONTROL_LIST_H_
8 #include <set>
9 #include <string>
10 #include <vector>
12 #include "base/basictypes.h"
13 #include "base/containers/hash_tables.h"
14 #include "base/gtest_prod_util.h"
15 #include "base/memory/ref_counted.h"
16 #include "base/memory/scoped_ptr.h"
17 #include "base/values.h"
18 #include "build/build_config.h"
19 #include "gpu/gpu_export.h"
21 namespace gpu {
22 struct GPUInfo;
24 class GPU_EXPORT GpuControlList {
25 public:
26 enum OsType {
27 kOsLinux,
28 kOsMacosx,
29 kOsWin,
30 kOsChromeOS,
31 kOsAndroid,
32 kOsAny,
33 kOsUnknown
36 enum OsFilter {
37 // In loading, ignore all entries that belong to other OS.
38 kCurrentOsOnly,
39 // In loading, keep all entries. This is for testing only.
40 kAllOs
43 GpuControlList();
44 virtual ~GpuControlList();
46 // Loads control list information from a json file.
47 // If failed, the current GpuControlList is un-touched.
48 bool LoadList(const std::string& json_context, OsFilter os_filter);
50 // Collects system information and combines them with gpu_info and control
51 // list information to decide which entries are applied to the current
52 // system and returns the union of features specified in each entry.
53 // If os is kOsAny, use the current OS; if os_version is empty, use the
54 // current OS version.
55 std::set<int> MakeDecision(
56 OsType os, std::string os_version, const GPUInfo& gpu_info);
58 // Collects the active entries from the last MakeDecision() call.
59 // If disabled set to true, return entries that are disabled; otherwise,
60 // return enabled entries.
61 void GetDecisionEntries(std::vector<uint32>* entry_ids,
62 bool disabled) const;
64 // Returns the description and bugs from active entries from the last
65 // MakeDecision() call.
67 // Each problems has:
68 // {
69 // "description": "Your GPU is too old",
70 // "crBugs": [1234],
71 // "webkitBugs": []
72 // }
73 void GetReasons(
74 base::ListValue* problem_list, const std::string& tag) const;
76 // Return the largest entry id. This is used for histogramming.
77 uint32 max_entry_id() const;
79 // Returns the version of the control list.
80 std::string version() const;
82 // Check if we need more gpu info to make the decisions.
83 // This is computed from the last MakeDecision() call.
84 // If yes, we should create a gl context and do a full gpu info collection.
85 bool needs_more_info() const { return needs_more_info_; }
87 // Returns the number of entries. This is only for tests.
88 size_t num_entries() const;
90 // Register a feature to FeatureMap - used to construct a GpuControlList.
91 void AddSupportedFeature(const std::string& feature_name, int feature_id);
92 // Register whether "all" is recognized as all features.
93 void set_supports_feature_type_all(bool supported);
95 // Enables logging of control list decisions.
96 void enable_control_list_logging(
97 const std::string& control_list_logging_name) {
98 control_list_logging_enabled_ = true;
99 control_list_logging_name_ = control_list_logging_name;
102 private:
103 friend class GpuControlListEntryTest;
104 friend class MachineModelInfoTest;
105 friend class NumberInfoTest;
106 friend class OsInfoTest;
107 friend class StringInfoTest;
108 friend class VersionInfoTest;
110 enum NumericOp {
111 kBetween, // <= * <=
112 kEQ, // =
113 kLT, // <
114 kLE, // <=
115 kGT, // >
116 kGE, // >=
117 kAny,
118 kUnknown // Indicates the data is invalid.
121 class GPU_EXPORT VersionInfo {
122 public:
123 // If version_style is empty, it defaults to kNumerical.
124 VersionInfo(const std::string& version_op,
125 const std::string& version_style,
126 const std::string& version_string,
127 const std::string& version_string2);
128 ~VersionInfo();
130 // Determines if a given version is included in the VersionInfo range.
131 // "splitter" divides version string into segments.
132 bool Contains(const std::string& version, char splitter) const;
133 // Same as above, using '.' as splitter.
134 bool Contains(const std::string& version) const;
136 // Determine if the version_style is lexical.
137 bool IsLexical() const;
139 // Determines if the VersionInfo contains valid information.
140 bool IsValid() const;
142 private:
143 enum VersionStyle {
144 kVersionStyleNumerical,
145 kVersionStyleLexical,
146 kVersionStyleUnknown
149 static VersionStyle StringToVersionStyle(const std::string& version_style);
151 // Compare two version strings.
152 // Return 1 if version > version_ref,
153 // 0 if version = version_ref,
154 // -1 if version < version_ref.
155 // Note that we only compare as many segments as both versions contain.
156 // For example: Compare("10.3.1", "10.3") returns 0,
157 // Compare("10.3", "10.3.1") returns 0.
158 // If "version_style" is Lexical, the first segment is compared
159 // numerically, all other segments are compared lexically.
160 // Lexical is used for AMD Linux driver versions only.
161 static int Compare(const std::vector<std::string>& version,
162 const std::vector<std::string>& version_ref,
163 VersionStyle version_style);
165 NumericOp op_;
166 VersionStyle version_style_;
167 std::vector<std::string> version_;
168 std::vector<std::string> version2_;
171 class GPU_EXPORT OsInfo {
172 public:
173 OsInfo(const std::string& os,
174 const std::string& version_op,
175 const std::string& version_string,
176 const std::string& version_string2);
177 ~OsInfo();
179 // Determines if a given os/version is included in the OsInfo set.
180 bool Contains(OsType type, const std::string& version) const;
182 // Determines if the VersionInfo contains valid information.
183 bool IsValid() const;
185 OsType type() const;
187 // Maps string to OsType; returns kOsUnknown if it's not a valid os.
188 static OsType StringToOsType(const std::string& os);
190 private:
191 OsType type_;
192 scoped_ptr<VersionInfo> version_info_;
195 class GPU_EXPORT StringInfo {
196 public:
197 StringInfo(const std::string& string_op, const std::string& string_value);
199 // Determines if a given string is included in the StringInfo.
200 bool Contains(const std::string& value) const;
202 // Determines if the StringInfo contains valid information.
203 bool IsValid() const;
205 private:
206 enum Op {
207 kContains,
208 kBeginWith,
209 kEndWith,
210 kEQ, // =
211 kUnknown // Indicates StringInfo data is invalid.
214 // Maps string to Op; returns kUnknown if it's not a valid Op.
215 static Op StringToOp(const std::string& string_op);
217 Op op_;
218 std::string value_;
221 class GPU_EXPORT FloatInfo {
222 public:
223 FloatInfo(const std::string& float_op,
224 const std::string& float_value,
225 const std::string& float_value2);
227 // Determines if a given float is included in the FloatInfo.
228 bool Contains(float value) const;
230 // Determines if the FloatInfo contains valid information.
231 bool IsValid() const;
233 private:
234 NumericOp op_;
235 float value_;
236 float value2_;
239 class GPU_EXPORT IntInfo {
240 public:
241 IntInfo(const std::string& int_op,
242 const std::string& int_value,
243 const std::string& int_value2);
245 // Determines if a given int is included in the IntInfo.
246 bool Contains(int value) const;
248 // Determines if the IntInfo contains valid information.
249 bool IsValid() const;
251 private:
252 NumericOp op_;
253 int value_;
254 int value2_;
257 class GPU_EXPORT BoolInfo {
258 public:
259 explicit BoolInfo(bool value);
261 // Determines if a given bool is included in the BoolInfo.
262 bool Contains(bool value) const;
264 private:
265 bool value_;
268 class GpuControlListEntry;
269 typedef scoped_refptr<GpuControlListEntry> ScopedGpuControlListEntry;
271 typedef base::hash_map<std::string, int> FeatureMap;
273 class GPU_EXPORT GpuControlListEntry
274 : public base::RefCounted<GpuControlListEntry> {
275 public:
276 // Constructs GpuControlListEntry from DictionaryValue loaded from json.
277 // Top-level entry must have an id number. Others are exceptions.
278 static ScopedGpuControlListEntry GetEntryFromValue(
279 const base::DictionaryValue* value, bool top_level,
280 const FeatureMap& feature_map,
281 bool supports_feature_type_all);
283 // Logs a control list match for this rule in the list identified by
284 // |control_list_logging_name|.
285 void LogControlListMatch(
286 const std::string& control_list_logging_name) const;
288 // Determines if a given os/gc/machine_model/driver is included in the
289 // Entry set.
290 bool Contains(OsType os_type, const std::string& os_version,
291 const GPUInfo& gpu_info) const;
293 // Determines whether we needs more gpu info to make the blacklisting
294 // decision. It should only be checked if Contains() returns true.
295 bool NeedsMoreInfo(const GPUInfo& gpu_info) const;
297 // Returns the OsType.
298 OsType GetOsType() const;
300 // Returns the entry's unique id. 0 is reserved.
301 uint32 id() const;
303 // Returns whether the entry is disabled.
304 bool disabled() const;
306 // Returns the description of the entry
307 const std::string& description() const { return description_; }
309 // Returns a list of Chromium and Webkit bugs applicable to this entry
310 const std::vector<int>& cr_bugs() const { return cr_bugs_; }
311 const std::vector<int>& webkit_bugs() const { return webkit_bugs_; }
313 // Returns the blacklisted features in this entry.
314 const std::set<int>& features() const;
316 // Returns a list of blacklisted feature names in this entry.
317 void GetFeatureNames(base::ListValue* feature_names,
318 const FeatureMap& feature_map,
319 bool supports_feature_type_all) const;
321 private:
322 friend class base::RefCounted<GpuControlListEntry>;
324 enum MultiGpuStyle {
325 kMultiGpuStyleOptimus,
326 kMultiGpuStyleAMDSwitchable,
327 kMultiGpuStyleAMDSwitchableIntegrated,
328 kMultiGpuStyleAMDSwitchableDiscrete,
329 kMultiGpuStyleNone
332 enum MultiGpuCategory {
333 // This entry applies if this is the primary GPU on the system.
334 kMultiGpuCategoryPrimary,
335 // This entry applies if this is a secondary GPU on the system.
336 kMultiGpuCategorySecondary,
337 // This entry applies if this is the active GPU on the system.
338 kMultiGpuCategoryActive,
339 // This entry applies if this is any of the GPUs on the system.
340 kMultiGpuCategoryAny,
341 kMultiGpuCategoryNone
344 enum GLType {
345 kGLTypeGL, // This is default on MacOSX, Linux, ChromeOS
346 kGLTypeGLES, // This is default on Android
347 kGLTypeANGLE, // This is default on Windows
348 kGLTypeNone
351 GpuControlListEntry();
352 ~GpuControlListEntry();
354 bool SetId(uint32 id);
356 void SetDisabled(bool disabled);
358 bool SetOsInfo(const std::string& os,
359 const std::string& version_op,
360 const std::string& version_string,
361 const std::string& version_string2);
363 bool SetVendorId(const std::string& vendor_id_string);
365 bool AddDeviceId(const std::string& device_id_string);
367 bool SetMultiGpuStyle(const std::string& multi_gpu_style_string);
369 bool SetMultiGpuCategory(const std::string& multi_gpu_category_string);
371 bool SetGLType(const std::string& gl_type_string);
373 bool SetDriverVendorInfo(const std::string& vendor_op,
374 const std::string& vendor_value);
376 bool SetDriverVersionInfo(const std::string& version_op,
377 const std::string& version_style,
378 const std::string& version_string,
379 const std::string& version_string2);
381 bool SetDriverDateInfo(const std::string& date_op,
382 const std::string& date_string,
383 const std::string& date_string2);
385 bool SetGLVersionInfo(const std::string& version_op,
386 const std::string& version_string,
387 const std::string& version_string2);
389 bool SetGLVendorInfo(const std::string& vendor_op,
390 const std::string& vendor_value);
392 bool SetGLRendererInfo(const std::string& renderer_op,
393 const std::string& renderer_value);
395 bool SetGLExtensionsInfo(const std::string& extensions_op,
396 const std::string& extensions_value);
398 bool SetGLResetNotificationStrategyInfo(const std::string& op,
399 const std::string& int_string,
400 const std::string& int_string2);
402 bool SetCpuBrand(const std::string& cpu_op,
403 const std::string& cpu_value);
405 bool SetPerfGraphicsInfo(const std::string& op,
406 const std::string& float_string,
407 const std::string& float_string2);
409 bool SetPerfGamingInfo(const std::string& op,
410 const std::string& float_string,
411 const std::string& float_string2);
413 bool SetPerfOverallInfo(const std::string& op,
414 const std::string& float_string,
415 const std::string& float_string2);
417 bool AddMachineModelName(const std::string& model_name);
419 bool SetMachineModelVersionInfo(const std::string& version_op,
420 const std::string& version_string,
421 const std::string& version_string2);
423 bool SetGpuCountInfo(const std::string& op,
424 const std::string& int_string,
425 const std::string& int_string2);
427 void SetDirectRenderingInfo(bool value);
429 bool SetFeatures(const std::vector<std::string>& features,
430 const FeatureMap& feature_map,
431 bool supports_feature_type_all);
433 void AddException(ScopedGpuControlListEntry exception);
435 // Return true if GL_VERSION string does not fit the entry info
436 // on GL type and GL version.
437 bool GLVersionInfoMismatch(const std::string& gl_version) const;
439 static MultiGpuStyle StringToMultiGpuStyle(const std::string& style);
441 static MultiGpuCategory StringToMultiGpuCategory(
442 const std::string& category);
444 static GLType StringToGLType(const std::string& gl_type);
446 // map a feature_name to feature_id. If the string is not a registered
447 // feature name, return false.
448 static bool StringToFeature(const std::string& feature_name,
449 int* feature_id,
450 const FeatureMap& feature_map);
452 // Return the default GL type, depending on the OS.
453 // See GLType declaration.
454 static GLType GetDefaultGLType();
456 uint32 id_;
457 bool disabled_;
458 std::string description_;
459 std::vector<int> cr_bugs_;
460 std::vector<int> webkit_bugs_;
461 scoped_ptr<OsInfo> os_info_;
462 uint32 vendor_id_;
463 std::vector<uint32> device_id_list_;
464 MultiGpuStyle multi_gpu_style_;
465 MultiGpuCategory multi_gpu_category_;
466 GLType gl_type_;
467 scoped_ptr<StringInfo> driver_vendor_info_;
468 scoped_ptr<VersionInfo> driver_version_info_;
469 scoped_ptr<VersionInfo> driver_date_info_;
470 scoped_ptr<VersionInfo> gl_version_info_;
471 scoped_ptr<StringInfo> gl_vendor_info_;
472 scoped_ptr<StringInfo> gl_renderer_info_;
473 scoped_ptr<StringInfo> gl_extensions_info_;
474 scoped_ptr<IntInfo> gl_reset_notification_strategy_info_;
475 scoped_ptr<StringInfo> cpu_brand_;
476 scoped_ptr<FloatInfo> perf_graphics_info_;
477 scoped_ptr<FloatInfo> perf_gaming_info_;
478 scoped_ptr<FloatInfo> perf_overall_info_;
479 std::vector<std::string> machine_model_name_list_;
480 scoped_ptr<VersionInfo> machine_model_version_info_;
481 scoped_ptr<IntInfo> gpu_count_info_;
482 scoped_ptr<BoolInfo> direct_rendering_info_;
483 std::set<int> features_;
484 std::vector<ScopedGpuControlListEntry> exceptions_;
487 // Gets the current OS type.
488 static OsType GetOsType();
490 bool LoadList(const base::DictionaryValue& parsed_json, OsFilter os_filter);
492 void Clear();
494 static NumericOp StringToNumericOp(const std::string& op);
496 std::string version_;
497 std::vector<ScopedGpuControlListEntry> entries_;
499 // This records all the blacklist entries that are appliable to the current
500 // user machine. It is updated everytime MakeDecision() is called and is
501 // used later by GetDecisionEntries().
502 std::vector<ScopedGpuControlListEntry> active_entries_;
504 uint32 max_entry_id_;
506 bool needs_more_info_;
508 // The features a GpuControlList recognizes and handles.
509 FeatureMap feature_map_;
510 bool supports_feature_type_all_;
512 bool control_list_logging_enabled_;
513 std::string control_list_logging_name_;
516 } // namespace gpu
518 #endif // GPU_CONFIG_GPU_CONTROL_LIST_H_