Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(674)

Unified Diff: content/browser/gpu/gpu_control_list.h

Issue 12976004: Generalzie GpuBlacklist to GpuControlList. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/gpu/gpu_blacklist_unittest.cc ('k') | content/browser/gpu/gpu_control_list.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/gpu/gpu_control_list.h
===================================================================
--- content/browser/gpu/gpu_control_list.h (revision 0)
+++ content/browser/gpu/gpu_control_list.h (revision 0)
@@ -0,0 +1,481 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_GPU_GPU_CONTROL_LIST_H_
+#define CONTENT_BROWSER_GPU_GPU_CONTROL_LIST_H_
+
+#include <string>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/gtest_prod_util.h"
+#include "base/hash_tables.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/values.h"
+#include "build/build_config.h"
+#include "content/common/content_export.h"
+
+namespace content {
+struct GPUInfo;
+
+class CONTENT_EXPORT GpuControlList {
+ public:
+ enum OsType {
+ kOsLinux,
+ kOsMacosx,
+ kOsWin,
+ kOsChromeOS,
+ kOsAndroid,
+ kOsAny,
+ kOsUnknown
+ };
+
+ enum OsFilter {
+ // In loading, ignore all entries that belong to other OS.
+ kCurrentOsOnly,
+ // In loading, keep all entries. This is for testing only.
+ kAllOs
+ };
+
+ GpuControlList();
+ virtual ~GpuControlList();
+
+ // Loads control list information from a json file.
+ // If failed, the current GpuControlList is un-touched.
+ bool LoadList(const std::string& json_context, OsFilter os_filter);
+ bool LoadList(const std::string& browser_version_string,
+ const std::string& json_context, OsFilter os_filter);
+
+ // Collects system information and combines them with gpu_info and control
+ // list information to decide which entries are applied to the current
+ // system and returns the union of features specified in each entry.
+ // If os is kOsAny, use the current OS; if os_version is empty, use the
+ // current OS version.
+ int MakeDecision(
+ OsType os, std::string os_version, const GPUInfo& gpu_info);
+
+ // Collects the active entries from the last MakeDecision() call.
+ // If disabled set to true, return entries that are disabled; otherwise,
+ // return enabled entries.
+ void GetDecisionEntries(std::vector<uint32>* entry_ids,
+ bool disabled) const;
+
+ // Returns the description and bugs from active entries from the last
+ // MakeDecision() call.
+ //
+ // Each problems has:
+ // {
+ // "description": "Your GPU is too old",
+ // "crBugs": [1234],
+ // "webkitBugs": []
+ // }
+ void GetReasons(base::ListValue* problem_list) const;
+
+ // Return the largest entry id. This is used for histogramming.
+ uint32 max_entry_id() const;
+
+ // Returns the version of the current blacklist.
+ std::string GetVersion() const;
+
+ // Check if we need more gpu info to make the decisions.
+ // This is computed from the last MakeDecision() call.
+ // If yes, we should create a gl context and do a full gpu info collection.
+ bool needs_more_info() const { return needs_more_info_; }
+
+ // Check if any entries contain unknown fields. This is only for tests.
+ bool contains_unknown_fields() const { return contains_unknown_fields_; }
+
+ // Returns the number of entries. This is only for tests.
+ size_t num_entries() const;
+
+ // Register a feature to FeatureMap - used to construct a GpuControlList.
+ void AddFeature(const std::string& feature_name, int feature_id);
+
+ private:
+ enum BrowserVersionSupport {
+ kSupported,
+ kUnsupported,
+ kMalformed
+ };
+
+ enum NumericOp {
+ kBetween, // <= * <=
+ kEQ, // =
+ kLT, // <
+ kLE, // <=
+ kGT, // >
+ kGE, // >=
+ kAny,
+ kUnknown // Indicates the data is invalid.
+ };
+
+ class VersionInfo {
+ public:
+ // If version_style is empty, it defaults to kNumerical.
+ VersionInfo(const std::string& version_op,
+ const std::string& version_style,
+ const std::string& version_string,
+ const std::string& version_string2);
+ ~VersionInfo();
+
+ // Determines if a given version is included in the VersionInfo range.
+ // "splitter" divides version string into segments.
+ bool Contains(const std::string& version, char splitter) const;
+ // Same as above, using '.' as splitter.
+ bool Contains(const std::string& version) const;
+
+ // Determine if the version_style is lexical.
+ bool IsLexical() const;
+
+ // Determines if the VersionInfo contains valid information.
+ bool IsValid() const;
+
+ private:
+ enum VersionStyle {
+ kVersionStyleNumerical,
+ kVersionStyleLexical,
+ kVersionStyleUnknown
+ };
+
+ static VersionStyle StringToVersionStyle(const std::string& version_style);
+
+ // Compare two version strings.
+ // Return 1 if version > version_ref,
+ // 0 if version = version_ref,
+ // -1 if version < version_ref.
+ // Note that we only compare as many as segments as version_ref contains.
+ // If version_ref is xxx.yyy, it's considered as xxx.yyy.*
+ // For example: Compare("10.3.1", "10.3") returns 0,
+ // Compare("10.3", "10.3.1") returns -1.
+ // If "version_style" is Lexical, the first segment is compared
+ // numerically, all other segments are compared lexically.
+ // Lexical is used for AMD Linux driver versions only.
+ static int Compare(const std::vector<std::string>& version,
+ const std::vector<std::string>& version_ref,
+ VersionStyle version_style);
+
+ NumericOp op_;
+ VersionStyle version_style_;
+ std::vector<std::string> version_;
+ std::vector<std::string> version2_;
+ };
+
+ class OsInfo {
+ public:
+ OsInfo(const std::string& os,
+ const std::string& version_op,
+ const std::string& version_string,
+ const std::string& version_string2);
+ ~OsInfo();
+
+ // Determines if a given os/version is included in the OsInfo set.
+ bool Contains(OsType type, const std::string& version) const;
+
+ // Determines if the VersionInfo contains valid information.
+ bool IsValid() const;
+
+ OsType type() const;
+
+ // Maps string to OsType; returns kOsUnknown if it's not a valid os.
+ static OsType StringToOsType(const std::string& os);
+
+ private:
+ OsType type_;
+ scoped_ptr<VersionInfo> version_info_;
+ };
+
+ class StringInfo {
+ public:
+ StringInfo(const std::string& string_op, const std::string& string_value);
+
+ // Determines if a given string is included in the StringInfo.
+ bool Contains(const std::string& value) const;
+
+ // Determines if the StringInfo contains valid information.
+ bool IsValid() const;
+
+ private:
+ enum Op {
+ kContains,
+ kBeginWith,
+ kEndWith,
+ kEQ, // =
+ kUnknown // Indicates StringInfo data is invalid.
+ };
+
+ // Maps string to Op; returns kUnknown if it's not a valid Op.
+ static Op StringToOp(const std::string& string_op);
+
+ Op op_;
+ std::string value_;
+ };
+
+ class FloatInfo {
+ public:
+ FloatInfo(const std::string& float_op,
+ const std::string& float_value,
+ const std::string& float_value2);
+
+ // Determines if a given float is included in the FloatInfo.
+ bool Contains(float value) const;
+
+ // Determines if the FloatInfo contains valid information.
+ bool IsValid() const;
+
+ private:
+ NumericOp op_;
+ float value_;
+ float value2_;
+ };
+
+ class IntInfo {
+ public:
+ IntInfo(const std::string& int_op,
+ const std::string& int_value,
+ const std::string& int_value2);
+
+ // Determines if a given int is included in the IntInfo.
+ bool Contains(int value) const;
+
+ // Determines if the IntInfo contains valid information.
+ bool IsValid() const;
+
+ private:
+ NumericOp op_;
+ int value_;
+ int value2_;
+ };
+
+ class MachineModelInfo {
+ public:
+ MachineModelInfo(const std::string& name_op,
+ const std::string& name_value,
+ const std::string& version_op,
+ const std::string& version_string,
+ const std::string& version_string2);
+ ~MachineModelInfo();
+
+ // Determines if a given name/version is included in the MachineModelInfo.
+ bool Contains(const std::string& name, const std::string& version) const;
+
+ // Determines if the MachineModelInfo contains valid information.
+ bool IsValid() const;
+
+ private:
+ scoped_ptr<StringInfo> name_info_;
+ scoped_ptr<VersionInfo> version_info_;
+ };
+
+ class GpuControlListEntry;
+ typedef scoped_refptr<GpuControlListEntry> ScopedGpuControlListEntry;
+
+ typedef base::hash_map<std::string, int> FeatureMap;
+
+ class GpuControlListEntry : public base::RefCounted<GpuControlListEntry> {
+ public:
+ // Constructs GpuControlListEntry from DictionaryValue loaded from json.
+ // Top-level entry must have an id number. Others are exceptions.
+ static ScopedGpuControlListEntry GetEntryFromValue(
+ const base::DictionaryValue* value, bool top_level,
+ const FeatureMap& feature_map);
+
+ // Determines if a given os/gc/machine_model/driver is included in the
+ // Entry set.
+ bool Contains(OsType os_type, const std::string& os_version,
+ const GPUInfo& gpu_info) const;
+
+ // Determines whether we needs more gpu info to make the blacklisting
+ // decision. It should only be checked if Contains() returns true.
+ bool NeedsMoreInfo(const GPUInfo& gpu_info) const;
+
+ // Returns the OsType.
+ OsType GetOsType() const;
+
+ // Returns the entry's unique id. 0 is reserved.
+ uint32 id() const;
+
+ // Returns whether the entry is disabled.
+ bool disabled() const;
+
+ // Returns the description of the entry
+ const std::string& description() const { return description_; }
+
+ // Returns a list of Chromium and Webkit bugs applicable to this entry
+ const std::vector<int>& cr_bugs() const { return cr_bugs_; }
+ const std::vector<int>& webkit_bugs() const { return webkit_bugs_; }
+
+ // Returns the features.
+ int GetFeatures() const;
+
+ // Returns true if an unknown field is encountered.
+ bool contains_unknown_fields() const {
+ return contains_unknown_fields_;
+ }
+ // Returns true if an unknown blacklist feature is encountered.
+ bool contains_unknown_features() const {
+ return contains_unknown_features_;
+ }
+
+ private:
+ friend class base::RefCounted<GpuControlListEntry>;
+
+ enum MultiGpuStyle {
+ kMultiGpuStyleOptimus,
+ kMultiGpuStyleAMDSwitchable,
+ kMultiGpuStyleNone
+ };
+
+ enum MultiGpuCategory {
+ kMultiGpuCategoryPrimary,
+ kMultiGpuCategorySecondary,
+ kMultiGpuCategoryAny,
+ kMultiGpuCategoryNone
+ };
+
+ GpuControlListEntry();
+ ~GpuControlListEntry();
+
+ bool SetId(uint32 id);
+
+ void SetDisabled(bool disabled);
+
+ bool SetOsInfo(const std::string& os,
+ const std::string& version_op,
+ const std::string& version_string,
+ const std::string& version_string2);
+
+ bool SetVendorId(const std::string& vendor_id_string);
+
+ bool AddDeviceId(const std::string& device_id_string);
+
+ bool SetMultiGpuStyle(const std::string& multi_gpu_style_string);
+
+ bool SetMultiGpuCategory(const std::string& multi_gpu_category_string);
+
+ bool SetDriverVendorInfo(const std::string& vendor_op,
+ const std::string& vendor_value);
+
+ bool SetDriverVersionInfo(const std::string& version_op,
+ const std::string& version_style,
+ const std::string& version_string,
+ const std::string& version_string2);
+
+ bool SetDriverDateInfo(const std::string& date_op,
+ const std::string& date_string,
+ const std::string& date_string2);
+
+ bool SetGLVendorInfo(const std::string& vendor_op,
+ const std::string& vendor_value);
+
+ bool SetGLRendererInfo(const std::string& renderer_op,
+ const std::string& renderer_value);
+
+ bool SetCpuBrand(const std::string& cpu_op,
+ const std::string& cpu_value);
+
+ bool SetPerfGraphicsInfo(const std::string& op,
+ const std::string& float_string,
+ const std::string& float_string2);
+
+ bool SetPerfGamingInfo(const std::string& op,
+ const std::string& float_string,
+ const std::string& float_string2);
+
+ bool SetPerfOverallInfo(const std::string& op,
+ const std::string& float_string,
+ const std::string& float_string2);
+
+ bool SetMachineModelInfo(const std::string& name_op,
+ const std::string& name_value,
+ const std::string& version_op,
+ const std::string& version_string,
+ const std::string& version_string2);
+
+ bool SetGpuCountInfo(const std::string& op,
+ const std::string& int_string,
+ const std::string& int_string2);
+
+ bool SetFeatures(const std::vector<std::string>& features,
+ const FeatureMap& feature_map);
+
+ void AddException(ScopedGpuControlListEntry exception);
+
+ static MultiGpuStyle StringToMultiGpuStyle(const std::string& style);
+
+ static MultiGpuCategory StringToMultiGpuCategory(
+ const std::string& category);
+
+ // map a feature_name to feature_id. If the string is not a registered
+ // feature name, return false.
+ static bool StringToFeature(const std::string& feature_name,
+ int* feature_id,
+ const FeatureMap& feature_map);
+
+ uint32 id_;
+ bool disabled_;
+ std::string description_;
+ std::vector<int> cr_bugs_;
+ std::vector<int> webkit_bugs_;
+ scoped_ptr<OsInfo> os_info_;
+ uint32 vendor_id_;
+ std::vector<uint32> device_id_list_;
+ MultiGpuStyle multi_gpu_style_;
+ MultiGpuCategory multi_gpu_category_;
+ scoped_ptr<StringInfo> driver_vendor_info_;
+ scoped_ptr<VersionInfo> driver_version_info_;
+ scoped_ptr<VersionInfo> driver_date_info_;
+ scoped_ptr<StringInfo> gl_vendor_info_;
+ scoped_ptr<StringInfo> gl_renderer_info_;
+ scoped_ptr<StringInfo> cpu_brand_;
+ scoped_ptr<FloatInfo> perf_graphics_info_;
+ scoped_ptr<FloatInfo> perf_gaming_info_;
+ scoped_ptr<FloatInfo> perf_overall_info_;
+ scoped_ptr<MachineModelInfo> machine_model_info_;
+ scoped_ptr<IntInfo> gpu_count_info_;
+ int features_;
+ std::vector<ScopedGpuControlListEntry> exceptions_;
+ bool contains_unknown_fields_;
+ bool contains_unknown_features_;
+ };
+
+ // Gets the current OS type.
+ static OsType GetOsType();
+
+ bool LoadList(const base::DictionaryValue& parsed_json, OsFilter os_filter);
+
+ void Clear();
+
+ // Check if the entry is supported by the current version of browser.
+ // By default, if there is no browser version information in the entry,
+ // return kSupported;
+ BrowserVersionSupport IsEntrySupportedByCurrentBrowserVersion(
+ const base::DictionaryValue* value);
+
+ static NumericOp StringToNumericOp(const std::string& op);
+
+ std::string version_;
+ std::vector<ScopedGpuControlListEntry> feature_list_;
+
+ std::string browser_version_;
+
+ // This records all the blacklist entries that are appliable to the current
+ // user machine. It is updated everytime MakeBlacklistDecision() is
+ // called and is used later by GetDecisionEntries().
+ std::vector<ScopedGpuControlListEntry> active_entries_;
+
+ uint32 max_entry_id_;
+
+ bool contains_unknown_fields_;
+
+ bool needs_more_info_;
+
+ // The features a GpuControlList recognizes and handles.
+ FeatureMap feature_map_;
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_GPU_GPU_CONTROL_LIST_H_
+
Property changes on: content/browser/gpu/gpu_control_list.h
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « content/browser/gpu/gpu_blacklist_unittest.cc ('k') | content/browser/gpu/gpu_control_list.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698