gpu_control_list.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_control_list.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/cpu.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/json/json_reader.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_number_conversions.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/strings/stringprintf.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/sys_info.h" 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_info.h" 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "gpu/config/gpu_util.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace gpu { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Break a version string into segments. Return true if each segment is 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// a valid number. 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ProcessVersionString(const std::string& version_string, 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char splitter, 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string>* version) { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(version); 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SplitString(version_string, splitter, version); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (version->size() == 0) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the splitter is '-', we assume it's a date with format "mm-dd-yyyy"; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // we split it into the order of "yyyy", "mm", "dd". 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (splitter == '-') { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string year = (*version)[version->size() - 1]; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = version->size() - 1; i > 0; --i) { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*version)[i] = (*version)[i - 1]; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (*version)[0] = year; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < version->size(); ++i) { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned num = 0; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!base::StringToUint((*version)[i], &num)) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Compare two number strings using numerical ordering. 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Return 0 if number = number_ref, 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1 if number > number_ref, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// -1 if number < number_ref. 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int CompareNumericalNumberStrings( 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& number, const std::string& number_ref) { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned value1 = 0; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned value2 = 0; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool valid = base::StringToUint(number, &value1); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(valid); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) valid = base::StringToUint(number_ref, &value2); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(valid); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value1 == value2) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value1 > value2) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 1; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Compare two number strings using lexical ordering. 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Return 0 if number = number_ref, 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1 if number > number_ref, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// -1 if number < number_ref. 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We only compare as many digits as number_ref contains. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// If number_ref is xxx, it's considered as xxx* 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// For example: CompareLexicalNumberStrings("121", "12") returns 0, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CompareLexicalNumberStrings("12", "121") returns -1. 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int CompareLexicalNumberStrings( 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& number, const std::string& number_ref) { 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < number_ref.length(); ++i) { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned value1 = 0; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i < number.length()) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value1 = number[i] - '0'; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned value2 = number_ref[i] - '0'; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value1 > value2) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 1; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value1 < value2) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuUnmatched(uint32 vendor_id, const std::vector<uint32>& device_id_list, 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GPUInfo::GPUDevice& gpu) { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (vendor_id == 0) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (vendor_id != gpu.vendor_id) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool device_specified = false; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < device_id_list.size(); ++i) { 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (device_id_list[i] == 0) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (device_id_list[i] == gpu.device_id) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_specified = true; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return device_specified; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMultiGpuStyleStringAMDSwitchable[] = "amd_switchable"; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMultiGpuStyleStringOptimus[] = "optimus"; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMultiGpuCategoryStringPrimary[] = "primary"; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMultiGpuCategoryStringSecondary[] = "secondary"; 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMultiGpuCategoryStringAny[] = "any"; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kVersionStyleStringNumerical[] = "numerical"; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kVersionStyleStringLexical[] = "lexical"; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kOp[] = "op"; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace anonymous 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::VersionInfo::VersionInfo( 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_op, 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_style, 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string2) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : version_style_(kVersionStyleNumerical) { 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = StringToNumericOp(version_op); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kUnknown || op_ == kAny) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) version_style_ = StringToVersionStyle(version_style); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ProcessVersionString(version_string, '.', &version_)) { 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kBetween) { 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ProcessVersionString(version_string2, '.', &version2_)) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::VersionInfo::~VersionInfo() { 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::VersionInfo::Contains( 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string) const { 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Contains(version_string, '.'); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::VersionInfo::Contains( 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, char splitter) const { 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kUnknown) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kAny) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> version; 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ProcessVersionString(version_string, splitter, &version)) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int relation = Compare(version, version_, version_style_); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kEQ) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (relation == 0); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (op_ == kLT) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (relation < 0); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (op_ == kLE) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (relation <= 0); 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (op_ == kGT) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (relation > 0); 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (op_ == kGE) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (relation >= 0); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // op_ == kBetween 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (relation < 0) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Compare(version, version2_, version_style_) <= 0; 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::VersionInfo::IsValid() const { 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (op_ != kUnknown && version_style_ != kVersionStyleUnknown); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::VersionInfo::IsLexical() const { 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return version_style_ == kVersionStyleLexical; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int GpuControlList::VersionInfo::Compare( 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& version, 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& version_ref, 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VersionStyle version_style) { 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(version.size() > 0 && version_ref.size() > 0); 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(version_style != kVersionStyleUnknown); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < version_ref.size(); ++i) { 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i >= version.size()) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int ret = 0; 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We assume both versions are checked by ProcessVersionString(). 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i > 0 && version_style == kVersionStyleLexical) 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret = CompareLexicalNumberStrings(version[i], version_ref[i]); 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret = CompareNumericalNumberStrings(version[i], version_ref[i]); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ret != 0) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ret; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::VersionInfo::VersionStyle 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::VersionInfo::StringToVersionStyle( 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_style) { 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (version_style.empty() || version_style == kVersionStyleStringNumerical) 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kVersionStyleNumerical; 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (version_style == kVersionStyleStringLexical) 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kVersionStyleLexical; 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kVersionStyleUnknown; 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsInfo::OsInfo(const std::string& os, 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_op, 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string2) { 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = StringToOsType(os); 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ != kOsUnknown) { 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) version_info_.reset(new VersionInfo( 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) version_op, std::string(), version_string, version_string2)); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsInfo::~OsInfo() {} 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::OsInfo::Contains(OsType type, 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version) const { 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsValid()) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ != type && type_ != kOsAny) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return version_info_->Contains(version); 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::OsInfo::IsValid() const { 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return type_ != kOsUnknown && version_info_->IsValid(); 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsType GpuControlList::OsInfo::type() const { 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return type_; 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsType GpuControlList::OsInfo::StringToOsType( 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& os) { 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os == "win") 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsWin; 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (os == "macosx") 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsMacosx; 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (os == "android") 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsAndroid; 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (os == "linux") 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsLinux; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (os == "chromeos") 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsChromeOS; 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (os == "any") 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsAny; 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsUnknown; 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::MachineModelInfo::MachineModelInfo( 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name_op, 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name_value, 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_op, 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string2) { 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_info_.reset(new StringInfo(name_op, name_value)); 269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) version_info_.reset(new VersionInfo( 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) version_op, std::string(), version_string, version_string2)); 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::MachineModelInfo::~MachineModelInfo() {} 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::MachineModelInfo::Contains( 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name, const std::string& version) const { 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsValid()) 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!name_info_->Contains(name)) 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return version_info_->Contains(version); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::MachineModelInfo::IsValid() const { 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return name_info_->IsValid() && version_info_->IsValid(); 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::StringInfo::StringInfo(const std::string& string_op, 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& string_value) { 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = StringToOp(string_op); 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value_ = StringToLowerASCII(string_value); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::StringInfo::Contains(const std::string& value) const { 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string my_value = StringToLowerASCII(value); 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (op_) { 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kContains: 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return strstr(my_value.c_str(), value_.c_str()) != NULL; 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kBeginWith: 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return StartsWithASCII(my_value, value_, false); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kEndWith: 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return EndsWith(my_value, value_, false); 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kEQ: 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value_ == my_value; 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::StringInfo::IsValid() const { 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return op_ != kUnknown; 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::StringInfo::Op GpuControlList::StringInfo::StringToOp( 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& string_op) { 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (string_op == "=") 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kEQ; 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (string_op == "contains") 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kContains; 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (string_op == "beginwith") 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kBeginWith; 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (string_op == "endwith") 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kEndWith; 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kUnknown; 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::FloatInfo::FloatInfo(const std::string& float_op, 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_value, 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_value2) 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : op_(kUnknown), 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value_(0.f), 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value2_(0.f) { 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) op_ = StringToNumericOp(float_op); 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (op_ == kAny) 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double dvalue = 0; 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!base::StringToDouble(float_value, &dvalue)) { 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value_ = static_cast<float>(dvalue); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kBetween) { 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!base::StringToDouble(float_value2, &dvalue)) { 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value2_ = static_cast<float>(dvalue); 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::FloatInfo::Contains(float value) const { 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kUnknown) 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kAny) 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kEQ) 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value == value_); 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kLT) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value < value_); 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kLE) 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value <= value_); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kGT) 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value > value_); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kGE) 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value >= value_); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(op_ == kBetween); 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ((value_ <= value && value <= value2_) || 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (value2_ <= value && value <= value_)); 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::FloatInfo::IsValid() const { 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return op_ != kUnknown; 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::IntInfo::IntInfo(const std::string& int_op, 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& int_value, 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& int_value2) 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : op_(kUnknown), 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value_(0), 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value2_(0) { 381c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) op_ = StringToNumericOp(int_op); 382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (op_ == kAny) 383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!base::StringToInt(int_value, &value_)) { 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kBetween && 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !base::StringToInt(int_value2, &value2_)) 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::IntInfo::Contains(int value) const { 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kUnknown) 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kAny) 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kEQ) 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value == value_); 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kLT) 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value < value_); 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kLE) 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value <= value_); 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kGT) 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value > value_); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kGE) 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value >= value_); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(op_ == kBetween); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ((value_ <= value && value <= value2_) || 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (value2_ <= value && value <= value_)); 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::IntInfo::IsValid() const { 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return op_ != kUnknown; 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::ScopedGpuControlListEntry 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::GetEntryFromValue( 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* value, bool top_level, 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FeatureMap& feature_map, 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool supports_feature_type_all) { 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(value); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedGpuControlListEntry entry(new GpuControlListEntry()); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t dictionary_entry_count = 0; 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (top_level) { 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 id; 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value->GetInteger("id", reinterpret_cast<int*>(&id)) || 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !entry->SetId(id)) { 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed id entry " << entry->id(); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool disabled; 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetBoolean("disabled", &disabled)) { 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->SetDisabled(disabled); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string description; 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetString("description", &description)) { 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->description_ = description; 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->description_ = "The GPU is unavailable for an unexplained reason."; 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* cr_bugs; 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetList("cr_bugs", &cr_bugs)) { 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < cr_bugs->GetSize(); ++i) { 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int bug_id; 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (cr_bugs->GetInteger(i, &bug_id)) { 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->cr_bugs_.push_back(bug_id); 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed cr_bugs entry " << entry->id(); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* webkit_bugs; 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetList("webkit_bugs", &webkit_bugs)) { 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < webkit_bugs->GetSize(); ++i) { 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int bug_id; 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (webkit_bugs->GetInteger(i, &bug_id)) { 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->webkit_bugs_.push_back(bug_id); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed webkit_bugs entry " << entry->id(); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* os_value = NULL; 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("os", &os_value)) { 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string os_type; 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string os_version_op = "any"; 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string os_version_string; 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string os_version_string2; 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_value->GetString("type", &os_type); 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* os_version_value = NULL; 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os_value->GetDictionary("version", &os_version_value)) { 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_version_value->GetString(kOp, &os_version_op); 490d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) os_version_value->GetString("value", &os_version_string); 491d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) os_version_value->GetString("value2", &os_version_string2); 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetOsInfo(os_type, os_version_op, os_version_string, 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_version_string2)) { 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed os entry " << entry->id(); 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string vendor_id; 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetString("vendor_id", &vendor_id)) { 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetVendorId(vendor_id)) { 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed vendor_id entry " << entry->id(); 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* device_id_list; 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetList("device_id", &device_id_list)) { 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < device_id_list->GetSize(); ++i) { 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string device_id; 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!device_id_list->GetString(i, &device_id) || 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !entry->AddDeviceId(device_id)) { 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed device_id entry " << entry->id(); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string multi_gpu_style; 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetString("multi_gpu_style", &multi_gpu_style)) { 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetMultiGpuStyle(multi_gpu_style)) { 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed multi_gpu_style entry " << entry->id(); 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string multi_gpu_category; 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetString("multi_gpu_category", &multi_gpu_category)) { 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetMultiGpuCategory(multi_gpu_category)) { 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed multi_gpu_category entry " << entry->id(); 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* driver_vendor_value = NULL; 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("driver_vendor", &driver_vendor_value)) { 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string vendor_op; 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string vendor_value; 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_vendor_value->GetString(kOp, &vendor_op); 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_vendor_value->GetString("value", &vendor_value); 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetDriverVendorInfo(vendor_op, vendor_value)) { 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed driver_vendor entry " << entry->id(); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* driver_version_value = NULL; 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("driver_version", &driver_version_value)) { 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_version_op = "any"; 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_version_style; 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_version_string; 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_version_string2; 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_value->GetString(kOp, &driver_version_op); 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_value->GetString("style", &driver_version_style); 562d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) driver_version_value->GetString("value", &driver_version_string); 563d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) driver_version_value->GetString("value2", &driver_version_string2); 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetDriverVersionInfo(driver_version_op, 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_style, 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_string, 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_string2)) { 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed driver_version entry " << entry->id(); 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* driver_date_value = NULL; 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("driver_date", &driver_date_value)) { 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_date_op = "any"; 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_date_string; 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_date_string2; 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_date_value->GetString(kOp, &driver_date_op); 580d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) driver_date_value->GetString("value", &driver_date_string); 581d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) driver_date_value->GetString("value2", &driver_date_string2); 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetDriverDateInfo(driver_date_op, driver_date_string, 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_date_string2)) { 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed driver_date entry " << entry->id(); 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* gl_vendor_value = NULL; 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("gl_vendor", &gl_vendor_value)) { 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string vendor_op; 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string vendor_value; 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_vendor_value->GetString(kOp, &vendor_op); 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_vendor_value->GetString("value", &vendor_value); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetGLVendorInfo(vendor_op, vendor_value)) { 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed gl_vendor entry " << entry->id(); 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* gl_renderer_value = NULL; 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("gl_renderer", &gl_renderer_value)) { 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string renderer_op; 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string renderer_value; 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_renderer_value->GetString(kOp, &renderer_op); 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_renderer_value->GetString("value", &renderer_value); 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetGLRendererInfo(renderer_op, renderer_value)) { 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed gl_renderer entry " << entry->id(); 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 616b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const base::DictionaryValue* gl_extensions_value = NULL; 617b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (value->GetDictionary("gl_extensions", &gl_extensions_value)) { 618b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::string extensions_op; 619b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::string extensions_value; 620b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gl_extensions_value->GetString(kOp, &extensions_op); 621b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gl_extensions_value->GetString("value", &extensions_value); 622b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!entry->SetGLExtensionsInfo(extensions_op, extensions_value)) { 623b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LOG(WARNING) << "Malformed gl_extensions entry " << entry->id(); 624b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return NULL; 625b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 626b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) dictionary_entry_count++; 627b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 628b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 629a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::DictionaryValue* gl_reset_notification_strategy_value = NULL; 630a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (value->GetDictionary("gl_reset_notification_strategy", 631a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &gl_reset_notification_strategy_value)) { 632a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string op; 633a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string int_value; 634a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string int_value2; 635a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gl_reset_notification_strategy_value->GetString(kOp, &op); 636a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gl_reset_notification_strategy_value->GetString("value", &int_value); 637a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gl_reset_notification_strategy_value->GetString("value2", &int_value2); 638a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!entry->SetGLResetNotificationStrategyInfo( 639a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) op, int_value, int_value2)) { 640a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LOG(WARNING) << "Malformed gl_reset_notification_strategy entry " 641a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) << entry->id(); 642a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return NULL; 643a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 644a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dictionary_entry_count++; 645a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 646a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* cpu_brand_value = NULL; 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("cpu_info", &cpu_brand_value)) { 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string cpu_op; 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string cpu_value; 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cpu_brand_value->GetString(kOp, &cpu_op); 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cpu_brand_value->GetString("value", &cpu_value); 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetCpuBrand(cpu_op, cpu_value)) { 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed cpu_brand entry " << entry->id(); 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* perf_graphics_value = NULL; 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("perf_graphics", &perf_graphics_value)) { 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string op; 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value; 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value2; 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_graphics_value->GetString(kOp, &op); 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_graphics_value->GetString("value", &float_value); 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_graphics_value->GetString("value2", &float_value2); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetPerfGraphicsInfo(op, float_value, float_value2)) { 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed perf_graphics entry " << entry->id(); 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* perf_gaming_value = NULL; 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("perf_gaming", &perf_gaming_value)) { 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string op; 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value; 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value2; 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_gaming_value->GetString(kOp, &op); 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_gaming_value->GetString("value", &float_value); 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_gaming_value->GetString("value2", &float_value2); 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetPerfGamingInfo(op, float_value, float_value2)) { 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed perf_gaming entry " << entry->id(); 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* perf_overall_value = NULL; 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("perf_overall", &perf_overall_value)) { 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string op; 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value; 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value2; 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_overall_value->GetString(kOp, &op); 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_overall_value->GetString("value", &float_value); 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_overall_value->GetString("value2", &float_value2); 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetPerfOverallInfo(op, float_value, float_value2)) { 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed perf_overall entry " << entry->id(); 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* machine_model_value = NULL; 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("machine_model", &machine_model_value)) { 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name_op; 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name_value; 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* name = NULL; 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (machine_model_value->GetDictionary("name", &name)) { 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name->GetString(kOp, &name_op); 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name->GetString("value", &name_value); 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string version_op = "any"; 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string version_string; 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string version_string2; 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* version_value = NULL; 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (machine_model_value->GetDictionary("version", &version_value)) { 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) version_value->GetString(kOp, &version_op); 721d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) version_value->GetString("value", &version_string); 722d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) version_value->GetString("value2", &version_string2); 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetMachineModelInfo( 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_op, name_value, version_op, version_string, version_string2)) { 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed machine_model entry " << entry->id(); 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* gpu_count_value = NULL; 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("gpu_count", &gpu_count_value)) { 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string op; 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string int_value; 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string int_value2; 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_count_value->GetString(kOp, &op); 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_count_value->GetString("value", &int_value); 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_count_value->GetString("value2", &int_value2); 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetGpuCountInfo(op, int_value, int_value2)) { 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed gpu_count entry " << entry->id(); 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (top_level) { 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* feature_value = NULL; 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetList("features", &feature_value)) { 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> feature_list; 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < feature_value->GetSize(); ++i) { 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string feature; 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (feature_value->GetString(i, &feature)) { 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) feature_list.push_back(feature); 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed feature entry " << entry->id(); 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!entry->SetFeatures( 761c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) feature_list, feature_map, supports_feature_type_all)) { 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed feature entry " << entry->id(); 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (top_level) { 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* exception_list_value = NULL; 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetList("exceptions", &exception_list_value)) { 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < exception_list_value->GetSize(); ++i) { 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* exception_value = NULL; 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!exception_list_value->GetDictionary(i, &exception_value)) { 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed exceptions entry " << entry->id(); 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 778c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedGpuControlListEntry exception(GetEntryFromValue( 779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) exception_value, false, feature_map, supports_feature_type_all)); 780868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (exception.get() == NULL) { 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed exceptions entry " << entry->id(); 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 784868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Exception should inherit vendor_id from parent, otherwise if only 785868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // device_ids are specified in Exception, the info will be incomplete. 786868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (exception->vendor_id_ == 0 && entry->vendor_id_ != 0) 787868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) exception->vendor_id_ = entry->vendor_id_; 788d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) entry->AddException(exception); 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* browser_version_value = NULL; 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // browser_version is processed in LoadGpuControlList(). 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("browser_version", &browser_version_value)) 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->size() != dictionary_entry_count) { 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Entry with unknown fields " << entry->id(); 801d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return NULL; 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return entry; 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::GpuControlListEntry() 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : id_(0), 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) disabled_(false), 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vendor_id_(0), 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) multi_gpu_style_(kMultiGpuStyleNone), 811d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) multi_gpu_category_(kMultiGpuCategoryPrimary) { 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::~GpuControlListEntry() { } 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetId(uint32 id) { 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (id != 0) { 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) id_ = id; 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuControlList::GpuControlListEntry::SetDisabled(bool disabled) { 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) disabled_ = disabled; 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetOsInfo( 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& os, 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_op, 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string2) { 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_info_.reset(new OsInfo(os, version_op, version_string, version_string2)); 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return os_info_->IsValid(); 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetVendorId( 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& vendor_id_string) { 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vendor_id_ = 0; 8401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return base::HexStringToUInt(vendor_id_string, &vendor_id_); 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::AddDeviceId( 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_id_string) { 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 device_id = 0; 8461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (base::HexStringToUInt(device_id_string, &device_id)) { 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_id_list_.push_back(device_id); 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetMultiGpuStyle( 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& multi_gpu_style_string) { 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MultiGpuStyle style = StringToMultiGpuStyle(multi_gpu_style_string); 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (style == kMultiGpuStyleNone) 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) multi_gpu_style_ = style; 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetMultiGpuCategory( 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& multi_gpu_category_string) { 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MultiGpuCategory category = 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringToMultiGpuCategory(multi_gpu_category_string); 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (category == kMultiGpuCategoryNone) 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) multi_gpu_category_ = category; 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetDriverVendorInfo( 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& vendor_op, 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& vendor_value) { 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_vendor_info_.reset(new StringInfo(vendor_op, vendor_value)); 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return driver_vendor_info_->IsValid(); 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetDriverVersionInfo( 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_op, 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_style, 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string2) { 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_info_.reset(new VersionInfo( 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) version_op, version_style, version_string, version_string2)); 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return driver_version_info_->IsValid(); 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetDriverDateInfo( 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& date_op, 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& date_string, 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& date_string2) { 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_date_info_.reset( 894c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new VersionInfo(date_op, std::string(), date_string, date_string2)); 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return driver_date_info_->IsValid(); 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGLVendorInfo( 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& vendor_op, 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& vendor_value) { 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_vendor_info_.reset(new StringInfo(vendor_op, vendor_value)); 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gl_vendor_info_->IsValid(); 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGLRendererInfo( 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& renderer_op, 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& renderer_value) { 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_renderer_info_.reset(new StringInfo(renderer_op, renderer_value)); 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gl_renderer_info_->IsValid(); 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGLExtensionsInfo( 913b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const std::string& extensions_op, 914b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const std::string& extensions_value) { 915b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gl_extensions_info_.reset(new StringInfo(extensions_op, extensions_value)); 916b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return gl_extensions_info_->IsValid(); 917b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 918b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 919a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGLResetNotificationStrategyInfo( 920a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& op, 921a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& int_string, 922a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& int_string2) { 923a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gl_reset_notification_strategy_info_.reset( 924a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new IntInfo(op, int_string, int_string2)); 925a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return gl_reset_notification_strategy_info_->IsValid(); 926a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 927a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetCpuBrand( 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& cpu_op, 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& cpu_value) { 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cpu_brand_.reset(new StringInfo(cpu_op, cpu_value)); 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return cpu_brand_->IsValid(); 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetPerfGraphicsInfo( 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& op, 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string, 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string2) { 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_graphics_info_.reset(new FloatInfo(op, float_string, float_string2)); 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return perf_graphics_info_->IsValid(); 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetPerfGamingInfo( 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& op, 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string, 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string2) { 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_gaming_info_.reset(new FloatInfo(op, float_string, float_string2)); 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return perf_gaming_info_->IsValid(); 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetPerfOverallInfo( 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& op, 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string, 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string2) { 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_overall_info_.reset(new FloatInfo(op, float_string, float_string2)); 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return perf_overall_info_->IsValid(); 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetMachineModelInfo( 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name_op, 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& name_value, 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_op, 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string2) { 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) machine_model_info_.reset(new MachineModelInfo( 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_op, name_value, version_op, version_string, version_string2)); 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return machine_model_info_->IsValid(); 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGpuCountInfo( 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& op, 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& int_string, 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& int_string2) { 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_count_info_.reset(new IntInfo(op, int_string, int_string2)); 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gpu_count_info_->IsValid(); 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetFeatures( 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& feature_strings, 980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FeatureMap& feature_map, 981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool supports_feature_type_all) { 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t size = feature_strings.size(); 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (size == 0) 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) features_.clear(); 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < size; ++i) { 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int feature = 0; 988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (supports_feature_type_all && feature_strings[i] == "all") { 989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (FeatureMap::const_iterator iter = feature_map.begin(); 990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter != feature_map.end(); ++iter) 991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) features_.insert(iter->second); 992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) continue; 993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 994d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!StringToFeature(feature_strings[i], &feature, feature_map)) { 995d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) features_.clear(); 996d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return false; 997d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 998d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) features_.insert(feature); 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuControlList::GpuControlListEntry::AddException( 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedGpuControlListEntry exception) { 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) exceptions_.push_back(exception); 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::MultiGpuStyle 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::StringToMultiGpuStyle( 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& style) { 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (style == kMultiGpuStyleStringOptimus) 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuStyleOptimus; 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (style == kMultiGpuStyleStringAMDSwitchable) 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuStyleAMDSwitchable; 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuStyleNone; 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::MultiGpuCategory 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::StringToMultiGpuCategory( 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& category) { 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (category == kMultiGpuCategoryStringPrimary) 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuCategoryPrimary; 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (category == kMultiGpuCategoryStringSecondary) 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuCategorySecondary; 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (category == kMultiGpuCategoryStringAny) 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuCategoryAny; 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuCategoryNone; 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void GpuControlList::GpuControlListEntry::LogControlListMatch( 10334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& control_list_logging_name) const { 10344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static const char kControlListMatchMessage[] = 10354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "Control list match for rule #%u in %s."; 10361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) VLOG(1) << base::StringPrintf(kControlListMatchMessage, id_, 10371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) control_list_logging_name.c_str()); 10384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 10394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::Contains( 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OsType os_type, const std::string& os_version, 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GPUInfo& gpu_info) const { 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(os_type != kOsAny); 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os_info_.get() != NULL && !os_info_->Contains(os_type, os_version)) 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_not_primary_gpu = 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuUnmatched(vendor_id_, device_id_list_, gpu_info.gpu); 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_not_secondary_gpu = true; 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < gpu_info.secondary_gpus.size(); ++i) { 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_not_secondary_gpu = is_not_secondary_gpu && 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuUnmatched(vendor_id_, device_id_list_, gpu_info.secondary_gpus[i]); 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (multi_gpu_category_) { 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kMultiGpuCategoryPrimary: 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_not_primary_gpu) 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kMultiGpuCategorySecondary: 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_not_secondary_gpu) 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kMultiGpuCategoryAny: 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (is_not_primary_gpu && is_not_secondary_gpu) 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kMultiGpuCategoryNone: 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (multi_gpu_style_) { 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kMultiGpuStyleOptimus: 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!gpu_info.optimus) 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kMultiGpuStyleAMDSwitchable: 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!gpu_info.amd_switchable) 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kMultiGpuStyleNone: 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (driver_vendor_info_.get() != NULL && !gpu_info.driver_vendor.empty() && 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !driver_vendor_info_->Contains(gpu_info.driver_vendor)) 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (driver_version_info_.get() != NULL && !gpu_info.driver_version.empty()) { 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!driver_version_info_->Contains(gpu_info.driver_version)) 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (driver_date_info_.get() != NULL && !gpu_info.driver_date.empty()) { 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!driver_date_info_->Contains(gpu_info.driver_date, '-')) 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gl_vendor_info_.get() != NULL && !gpu_info.gl_vendor.empty() && 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !gl_vendor_info_->Contains(gpu_info.gl_vendor)) 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gl_renderer_info_.get() != NULL && !gpu_info.gl_renderer.empty() && 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !gl_renderer_info_->Contains(gpu_info.gl_renderer)) 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1098b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (gl_extensions_info_.get() != NULL && !gpu_info.gl_extensions.empty() && 1099b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) !gl_extensions_info_->Contains(gpu_info.gl_extensions)) 1100b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return false; 1101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (gl_reset_notification_strategy_info_.get() != NULL && 1102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) !gl_reset_notification_strategy_info_->Contains( 1103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gpu_info.gl_reset_notification_strategy)) 1104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (perf_graphics_info_.get() != NULL && 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (gpu_info.performance_stats.graphics == 0.0 || 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !perf_graphics_info_->Contains(gpu_info.performance_stats.graphics))) 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (perf_gaming_info_.get() != NULL && 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (gpu_info.performance_stats.gaming == 0.0 || 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !perf_gaming_info_->Contains(gpu_info.performance_stats.gaming))) 11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (perf_overall_info_.get() != NULL && 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (gpu_info.performance_stats.overall == 0.0 || 11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !perf_overall_info_->Contains(gpu_info.performance_stats.overall))) 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (machine_model_info_.get() != NULL) { 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> name_version; 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SplitString(gpu_info.machine_model, ' ', &name_version); 11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (name_version.size() == 2 && 11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !machine_model_info_->Contains(name_version[0], name_version[1])) 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gpu_count_info_.get() != NULL && 11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !gpu_count_info_->Contains(gpu_info.secondary_gpus.size() + 1)) 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (cpu_brand_.get() != NULL) { 11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::CPU cpu_info; 11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!cpu_brand_->Contains(cpu_info.cpu_brand())) 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < exceptions_.size(); ++i) { 11342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (exceptions_[i]->Contains(os_type, os_version, gpu_info) && 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !exceptions_[i]->NeedsMoreInfo(gpu_info)) 11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::NeedsMoreInfo( 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GPUInfo& gpu_info) const { 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We only check for missing info that might be collected with a gl context. 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If certain info is missing due to some error, say, we fail to collect 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // vendor_id/device_id, then even if we launch GPU process and create a gl 11462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // context, we won't gather such missing info, so we still return false. 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (driver_vendor_info_.get() && gpu_info.driver_vendor.empty()) 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (driver_version_info_.get() && gpu_info.driver_version.empty()) 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gl_vendor_info_.get() && gpu_info.gl_vendor.empty()) 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gl_renderer_info_.get() && gpu_info.gl_renderer.empty()) 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < exceptions_.size(); ++i) { 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (exceptions_[i]->NeedsMoreInfo(gpu_info)) 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsType GpuControlList::GpuControlListEntry::GetOsType() const { 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os_info_.get() == NULL) 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsAny; 11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return os_info_->type(); 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32 GpuControlList::GpuControlListEntry::id() const { 11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return id_; 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::disabled() const { 11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return disabled_; 11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const std::set<int>& GpuControlList::GpuControlListEntry::features() const { 11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return features_; 11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::StringToFeature( 11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& feature_name, int* feature_id, 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FeatureMap& feature_map) { 11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FeatureMap::const_iterator iter = feature_map.find(feature_name); 11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter != feature_map.end()) { 11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *feature_id = iter->second; 11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlList() 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : max_entry_id_(0), 1194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) needs_more_info_(false), 11954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) supports_feature_type_all_(false), 11964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) control_list_logging_enabled_(false) { 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::~GpuControlList() { 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Clear(); 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::LoadList( 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& json_context, GpuControlList::OsFilter os_filter) { 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string browser_version_string = "0"; 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return LoadList(browser_version_string, json_context, os_filter); 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::LoadList( 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& browser_version_string, 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& json_context, 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuControlList::OsFilter os_filter) { 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> pieces; 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ProcessVersionString(browser_version_string, '.', &pieces)) 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_version_ = browser_version_string; 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> root; 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root.reset(base::JSONReader::Read(json_context)); 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root.get() == NULL || !root->IsType(base::Value::TYPE_DICTIONARY)) 12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* root_dictionary = 1224eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static_cast<base::DictionaryValue*>(root.get()); 12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(root_dictionary); 12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return LoadList(*root_dictionary, os_filter); 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::LoadList(const base::DictionaryValue& parsed_json, 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuControlList::OsFilter os_filter) { 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<ScopedGpuControlListEntry> entries; 12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parsed_json.GetString("version", &version_); 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> pieces; 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ProcessVersionString(version_, '.', &pieces)) 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* list = NULL; 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!parsed_json.GetList("entries", &list)) 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 max_entry_id = 0; 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < list->GetSize(); ++i) { 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* list_item = NULL; 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool valid = list->GetDictionary(i, &list_item); 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!valid || list_item == NULL) 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check browser version compatibility: if the entry is not for the 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // current browser version, don't process it. 12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrowserVersionSupport browser_version_support = 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IsEntrySupportedByCurrentBrowserVersion(list_item); 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (browser_version_support == kMalformed) 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (browser_version_support == kUnsupported) 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(browser_version_support == kSupported); 1257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedGpuControlListEntry entry(GpuControlListEntry::GetEntryFromValue( 1258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) list_item, true, feature_map_, supports_feature_type_all_)); 1259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (entry.get() == NULL) 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (entry->id() > max_entry_id) 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_entry_id = entry->id(); 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entries.push_back(entry); 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Clear(); 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OsType my_os = GetOsType(); 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < entries.size(); ++i) { 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OsType entry_os = entries[i]->GetOsType(); 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os_filter == GpuControlList::kAllOs || 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry_os == kOsAny || entry_os == my_os) 1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entries_.push_back(entries[i]); 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_entry_id_ = max_entry_id; 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::set<int> GpuControlList::MakeDecision( 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuControlList::OsType os, 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string os_version, 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GPUInfo& gpu_info) { 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_entries_.clear(); 1283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<int> features; 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_more_info_ = false; 1286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<int> possible_features; 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os == kOsAny) 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os = GetOsType(); 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os_version.empty()) { 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_version = base::SysInfo::OperatingSystemVersion(); 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t pos = os_version.find_first_not_of("0123456789."); 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pos != std::string::npos) 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_version = os_version.substr(0, pos); 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> pieces; 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ProcessVersionString(os_version, '.', &pieces)) 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_version = "0"; 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < entries_.size(); ++i) { 1301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (entries_[i]->Contains(os, os_version, gpu_info)) { 1302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!entries_[i]->disabled()) { 13034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (control_list_logging_enabled_) 13044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) entries_[i]->LogControlListMatch(control_list_logging_name_); 1305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MergeFeatureSets(&possible_features, entries_[i]->features()); 1306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!entries_[i]->NeedsMoreInfo(gpu_info)) 1307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MergeFeatureSets(&features, entries_[i]->features()); 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_entries_.push_back(entries_[i]); 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (possible_features.size() > features.size()) 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_more_info_ = true; 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return features; 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuControlList::GetDecisionEntries( 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<uint32>* entry_ids, bool disabled) const { 13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(entry_ids); 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry_ids->clear(); 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < active_entries_.size(); ++i) { 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (disabled == active_entries_[i]->disabled()) 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry_ids->push_back(active_entries_[i]->id()); 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuControlList::GetReasons(base::ListValue* problem_list) const { 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(problem_list); 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < active_entries_.size(); ++i) { 1332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GpuControlListEntry* entry = active_entries_[i].get(); 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (entry->disabled()) 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* problem = new base::DictionaryValue(); 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) problem->SetString("description", entry->description()); 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ListValue* cr_bugs = new base::ListValue(); 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t j = 0; j < entry->cr_bugs().size(); ++j) 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cr_bugs->Append(new base::FundamentalValue(entry->cr_bugs()[j])); 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) problem->Set("crBugs", cr_bugs); 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ListValue* webkit_bugs = new base::ListValue(); 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t j = 0; j < entry->webkit_bugs().size(); ++j) { 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webkit_bugs->Append(new base::FundamentalValue(entry->webkit_bugs()[j])); 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) problem->Set("webkitBugs", webkit_bugs); 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) problem_list->Append(problem); 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)size_t GpuControlList::num_entries() const { 1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return entries_.size(); 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32 GpuControlList::max_entry_id() const { 13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return max_entry_id_; 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string GpuControlList::version() const { 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return version_; 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsType GpuControlList::GetOsType() { 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsChromeOS; 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_WIN) 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsWin; 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_ANDROID) 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsAndroid; 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_LINUX) || defined(OS_OPENBSD) 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsLinux; 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_MACOSX) 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsMacosx; 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsUnknown; 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuControlList::Clear() { 1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entries_.clear(); 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_entries_.clear(); 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_entry_id_ = 0; 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::BrowserVersionSupport 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::IsEntrySupportedByCurrentBrowserVersion( 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* value) { 13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(value); 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* browser_version_value = NULL; 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("browser_version", &browser_version_value)) { 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string version_op = "any"; 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string version_string; 13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string version_string2; 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser_version_value->GetString(kOp, &version_op); 1398d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) browser_version_value->GetString("value", &version_string); 1399d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) browser_version_value->GetString("value2", &version_string2); 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<VersionInfo> browser_version_info; 1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser_version_info.reset(new VersionInfo( 1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) version_op, std::string(), version_string, version_string2)); 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!browser_version_info->IsValid()) 14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMalformed; 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (browser_version_info->Contains(browser_version_)) 14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kSupported; 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kUnsupported; 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kSupported; 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::NumericOp GpuControlList::StringToNumericOp( 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& op) { 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == "=") 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kEQ; 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == "<") 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kLT; 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == "<=") 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kLE; 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == ">") 14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kGT; 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == ">=") 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kGE; 14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == "any") 14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kAny; 14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == "between") 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kBetween; 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kUnknown; 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GpuControlList::AddSupportedFeature( 14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& feature_name, int feature_id) { 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) feature_map_[feature_name] = feature_id; 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GpuControlList::set_supports_feature_type_all(bool supported) { 1438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) supports_feature_type_all_ = supported; 1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 144190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace gpu 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1443