| Index: chrome/browser/gpu_blacklist.cc
|
| ===================================================================
|
| --- chrome/browser/gpu_blacklist.cc (revision 148446)
|
| +++ chrome/browser/gpu_blacklist.cc (working copy)
|
| @@ -67,9 +67,30 @@
|
| return numerical;
|
| }
|
|
|
| +bool GpuUnmatched(uint32 vendor_id, const std::vector<uint32>& device_id_list,
|
| + const content::GPUInfo::GPUDevice& gpu) {
|
| + if (vendor_id == 0)
|
| + return false;
|
| + if (vendor_id != gpu.vendor_id)
|
| + return true;
|
| + bool device_specified = false;
|
| + for (size_t i = 0; i < device_id_list.size(); ++i) {
|
| + if (device_id_list[i] == 0)
|
| + continue;
|
| + if (device_id_list[i] == gpu.device_id)
|
| + return false;
|
| + device_specified = true;
|
| + }
|
| + return device_specified;
|
| +}
|
| +
|
| const char kMultiGpuStyleStringAMDSwitchable[] = "amd_switchable";
|
| const char kMultiGpuStyleStringOptimus[] = "optimus";
|
|
|
| +const char kMultiGpuCategoryStringPrimary[] = "primary";
|
| +const char kMultiGpuCategoryStringSecondary[] = "secondary";
|
| +const char kMultiGpuCategoryStringAny[] = "any";
|
| +
|
| const char kVersionStyleStringNumerical[] = "numerical";
|
| const char kVersionStyleStringLexical[] = "lexical";
|
|
|
| @@ -404,6 +425,15 @@
|
| dictionary_entry_count++;
|
| }
|
|
|
| + std::string multi_gpu_category;
|
| + if (value->GetString("multi_gpu_category", &multi_gpu_category)) {
|
| + if (!entry->SetMultiGpuCategory(multi_gpu_category)) {
|
| + LOG(WARNING) << "Malformed multi_gpu_category entry " << entry->id();
|
| + return NULL;
|
| + }
|
| + dictionary_entry_count++;
|
| + }
|
| +
|
| DictionaryValue* driver_vendor_value = NULL;
|
| if (value->GetDictionary("driver_vendor", &driver_vendor_value)) {
|
| std::string vendor_op;
|
| @@ -590,6 +620,7 @@
|
| disabled_(false),
|
| vendor_id_(0),
|
| multi_gpu_style_(kMultiGpuStyleNone),
|
| + multi_gpu_category_(kMultiGpuCategoryPrimary),
|
| feature_type_(content::GPU_FEATURE_TYPE_UNKNOWN),
|
| contains_unknown_fields_(false),
|
| contains_unknown_features_(false) {
|
| @@ -643,6 +674,16 @@
|
| return true;
|
| }
|
|
|
| +bool GpuBlacklist::GpuBlacklistEntry::SetMultiGpuCategory(
|
| + const std::string& multi_gpu_category_string) {
|
| + MultiGpuCategory category =
|
| + StringToMultiGpuCategory(multi_gpu_category_string);
|
| + if (category == kMultiGpuCategoryNone)
|
| + return false;
|
| + multi_gpu_category_ = category;
|
| + return true;
|
| +}
|
| +
|
| bool GpuBlacklist::GpuBlacklistEntry::SetDriverVendorInfo(
|
| const std::string& vendor_op,
|
| const std::string& vendor_value) {
|
| @@ -758,25 +799,48 @@
|
| return kMultiGpuStyleNone;
|
| }
|
|
|
| +// static
|
| +GpuBlacklist::GpuBlacklistEntry::MultiGpuCategory
|
| +GpuBlacklist::GpuBlacklistEntry::StringToMultiGpuCategory(
|
| + const std::string& category) {
|
| + if (category == kMultiGpuCategoryStringPrimary)
|
| + return kMultiGpuCategoryPrimary;
|
| + if (category == kMultiGpuCategoryStringSecondary)
|
| + return kMultiGpuCategorySecondary;
|
| + if (category == kMultiGpuCategoryStringAny)
|
| + return kMultiGpuCategoryAny;
|
| + return kMultiGpuCategoryNone;
|
| +}
|
| +
|
| bool GpuBlacklist::GpuBlacklistEntry::Contains(
|
| OsType os_type, const Version& os_version,
|
| const content::GPUInfo& gpu_info) const {
|
| DCHECK(os_type != kOsAny);
|
| if (os_info_.get() != NULL && !os_info_->Contains(os_type, os_version))
|
| return false;
|
| - if (vendor_id_ != 0 && vendor_id_ != gpu_info.gpu.vendor_id)
|
| - return false;
|
| - if (device_id_list_.size() > 0) {
|
| - bool found = false;
|
| - for (size_t i = 0; i < device_id_list_.size(); ++i) {
|
| - if (device_id_list_[i] == gpu_info.gpu.device_id) {
|
| - found = true;
|
| - break;
|
| - }
|
| - }
|
| - if (!found)
|
| - return false;
|
| + bool is_not_primary_gpu =
|
| + GpuUnmatched(vendor_id_, device_id_list_, gpu_info.gpu);
|
| + bool is_not_secondary_gpu = true;
|
| + for (size_t i = 0; i < gpu_info.secondary_gpus.size(); ++i) {
|
| + is_not_secondary_gpu = is_not_secondary_gpu &&
|
| + GpuUnmatched(vendor_id_, device_id_list_, gpu_info.secondary_gpus[i]);
|
| }
|
| + switch (multi_gpu_category_) {
|
| + case kMultiGpuCategoryPrimary:
|
| + if (is_not_primary_gpu)
|
| + return false;
|
| + break;
|
| + case kMultiGpuCategorySecondary:
|
| + if (is_not_secondary_gpu)
|
| + return false;
|
| + break;
|
| + case kMultiGpuCategoryAny:
|
| + if (is_not_primary_gpu && is_not_secondary_gpu)
|
| + return false;
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| switch (multi_gpu_style_) {
|
| case kMultiGpuStyleOptimus:
|
| if (!gpu_info.optimus)
|
|
|