gpu_control_list.cc revision 010d83a9304c5a91596085d917d248abff47903a
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)const char kMultiGpuStyleStringAMDSwitchable[] = "amd_switchable"; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMultiGpuStyleStringOptimus[] = "optimus"; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMultiGpuCategoryStringPrimary[] = "primary"; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMultiGpuCategoryStringSecondary[] = "secondary"; 94e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochconst char kMultiGpuCategoryStringActive[] = "active"; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMultiGpuCategoryStringAny[] = "any"; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kGLTypeStringGL[] = "gl"; 98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kGLTypeStringGLES[] = "gles"; 99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kGLTypeStringANGLE[] = "angle"; 100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kVersionStyleStringNumerical[] = "numerical"; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kVersionStyleStringLexical[] = "lexical"; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kOp[] = "op"; 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace anonymous 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::VersionInfo::VersionInfo( 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_op, 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_style, 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string2) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : version_style_(kVersionStyleNumerical) { 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = StringToNumericOp(version_op); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kUnknown || op_ == kAny) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) version_style_ = StringToVersionStyle(version_style); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ProcessVersionString(version_string, '.', &version_)) { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kBetween) { 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ProcessVersionString(version_string2, '.', &version2_)) 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::VersionInfo::~VersionInfo() { 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::VersionInfo::Contains( 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string) const { 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Contains(version_string, '.'); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::VersionInfo::Contains( 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, char splitter) const { 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kUnknown) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kAny) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> version; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ProcessVersionString(version_string, splitter, &version)) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int relation = Compare(version, version_, version_style_); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kEQ) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (relation == 0); 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (op_ == kLT) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (relation < 0); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (op_ == kLE) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (relation <= 0); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (op_ == kGT) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (relation > 0); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (op_ == kGE) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (relation >= 0); 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // op_ == kBetween 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (relation < 0) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Compare(version, version2_, version_style_) <= 0; 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::VersionInfo::IsValid() const { 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (op_ != kUnknown && version_style_ != kVersionStyleUnknown); 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::VersionInfo::IsLexical() const { 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return version_style_ == kVersionStyleLexical; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int GpuControlList::VersionInfo::Compare( 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& version, 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& version_ref, 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VersionStyle version_style) { 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(version.size() > 0 && version_ref.size() > 0); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(version_style != kVersionStyleUnknown); 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < version_ref.size(); ++i) { 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i >= version.size()) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int ret = 0; 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We assume both versions are checked by ProcessVersionString(). 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i > 0 && version_style == kVersionStyleLexical) 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret = CompareLexicalNumberStrings(version[i], version_ref[i]); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret = CompareNumericalNumberStrings(version[i], version_ref[i]); 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ret != 0) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ret; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::VersionInfo::VersionStyle 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::VersionInfo::StringToVersionStyle( 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_style) { 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (version_style.empty() || version_style == kVersionStyleStringNumerical) 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kVersionStyleNumerical; 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (version_style == kVersionStyleStringLexical) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kVersionStyleLexical; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kVersionStyleUnknown; 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsInfo::OsInfo(const std::string& os, 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_op, 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string2) { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = StringToOsType(os); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ != kOsUnknown) { 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) version_info_.reset(new VersionInfo( 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) version_op, std::string(), version_string, version_string2)); 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsInfo::~OsInfo() {} 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::OsInfo::Contains(OsType type, 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version) const { 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsValid()) 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ != type && type_ != kOsAny) 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return version_info_->Contains(version); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::OsInfo::IsValid() const { 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return type_ != kOsUnknown && version_info_->IsValid(); 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsType GpuControlList::OsInfo::type() const { 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return type_; 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsType GpuControlList::OsInfo::StringToOsType( 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& os) { 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os == "win") 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsWin; 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (os == "macosx") 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsMacosx; 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (os == "android") 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsAndroid; 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (os == "linux") 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsLinux; 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (os == "chromeos") 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsChromeOS; 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (os == "any") 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsAny; 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsUnknown; 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::StringInfo::StringInfo(const std::string& string_op, 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& string_value) { 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = StringToOp(string_op); 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value_ = StringToLowerASCII(string_value); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::StringInfo::Contains(const std::string& value) const { 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string my_value = StringToLowerASCII(value); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (op_) { 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kContains: 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return strstr(my_value.c_str(), value_.c_str()) != NULL; 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kBeginWith: 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return StartsWithASCII(my_value, value_, false); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kEndWith: 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return EndsWith(my_value, value_, false); 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kEQ: 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value_ == my_value; 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::StringInfo::IsValid() const { 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return op_ != kUnknown; 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::StringInfo::Op GpuControlList::StringInfo::StringToOp( 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& string_op) { 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (string_op == "=") 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kEQ; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (string_op == "contains") 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kContains; 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (string_op == "beginwith") 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kBeginWith; 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (string_op == "endwith") 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kEndWith; 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kUnknown; 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::FloatInfo::FloatInfo(const std::string& float_op, 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_value, 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_value2) 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : op_(kUnknown), 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value_(0.f), 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value2_(0.f) { 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) op_ = StringToNumericOp(float_op); 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (op_ == kAny) 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double dvalue = 0; 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!base::StringToDouble(float_value, &dvalue)) { 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value_ = static_cast<float>(dvalue); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kBetween) { 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!base::StringToDouble(float_value2, &dvalue)) { 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value2_ = static_cast<float>(dvalue); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::FloatInfo::Contains(float value) const { 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kUnknown) 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kAny) 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kEQ) 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value == value_); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kLT) 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value < value_); 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kLE) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value <= value_); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kGT) 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value > value_); 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kGE) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value >= value_); 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(op_ == kBetween); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ((value_ <= value && value <= value2_) || 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (value2_ <= value && value <= value_)); 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::FloatInfo::IsValid() const { 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return op_ != kUnknown; 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::IntInfo::IntInfo(const std::string& int_op, 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& int_value, 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& int_value2) 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : op_(kUnknown), 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value_(0), 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value2_(0) { 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) op_ = StringToNumericOp(int_op); 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (op_ == kAny) 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!base::StringToInt(int_value, &value_)) { 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kBetween && 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !base::StringToInt(int_value2, &value2_)) 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::IntInfo::Contains(int value) const { 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kUnknown) 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kAny) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kEQ) 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value == value_); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kLT) 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value < value_); 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kLE) 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value <= value_); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kGT) 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value > value_); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kGE) 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value >= value_); 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(op_ == kBetween); 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ((value_ <= value && value <= value2_) || 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (value2_ <= value && value <= value_)); 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::IntInfo::IsValid() const { 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return op_ != kUnknown; 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 379effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochGpuControlList::BoolInfo::BoolInfo(bool value) : value_(value) {} 380effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 381effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool GpuControlList::BoolInfo::Contains(bool value) const { 382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return value_ == value; 383effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 384effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::ScopedGpuControlListEntry 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::GetEntryFromValue( 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* value, bool top_level, 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FeatureMap& feature_map, 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool supports_feature_type_all) { 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(value); 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedGpuControlListEntry entry(new GpuControlListEntry()); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t dictionary_entry_count = 0; 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (top_level) { 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 id; 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value->GetInteger("id", reinterpret_cast<int*>(&id)) || 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !entry->SetId(id)) { 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed id entry " << entry->id(); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool disabled; 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetBoolean("disabled", &disabled)) { 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->SetDisabled(disabled); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string description; 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetString("description", &description)) { 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->description_ = description; 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->description_ = "The GPU is unavailable for an unexplained reason."; 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* cr_bugs; 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetList("cr_bugs", &cr_bugs)) { 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < cr_bugs->GetSize(); ++i) { 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int bug_id; 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (cr_bugs->GetInteger(i, &bug_id)) { 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->cr_bugs_.push_back(bug_id); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed cr_bugs entry " << entry->id(); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* webkit_bugs; 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetList("webkit_bugs", &webkit_bugs)) { 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < webkit_bugs->GetSize(); ++i) { 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int bug_id; 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (webkit_bugs->GetInteger(i, &bug_id)) { 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->webkit_bugs_.push_back(bug_id); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed webkit_bugs entry " << entry->id(); 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* os_value = NULL; 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("os", &os_value)) { 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string os_type; 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string os_version_op = "any"; 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string os_version_string; 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string os_version_string2; 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_value->GetString("type", &os_type); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* os_version_value = NULL; 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os_value->GetDictionary("version", &os_version_value)) { 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_version_value->GetString(kOp, &os_version_op); 458d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) os_version_value->GetString("value", &os_version_string); 459d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) os_version_value->GetString("value2", &os_version_string2); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetOsInfo(os_type, os_version_op, os_version_string, 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_version_string2)) { 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed os entry " << entry->id(); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string vendor_id; 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetString("vendor_id", &vendor_id)) { 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetVendorId(vendor_id)) { 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed vendor_id entry " << entry->id(); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* device_id_list; 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetList("device_id", &device_id_list)) { 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < device_id_list->GetSize(); ++i) { 4810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::string device_id; 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!device_id_list->GetString(i, &device_id) || 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !entry->AddDeviceId(device_id)) { 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed device_id entry " << entry->id(); 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string multi_gpu_style; 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetString("multi_gpu_style", &multi_gpu_style)) { 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetMultiGpuStyle(multi_gpu_style)) { 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed multi_gpu_style entry " << entry->id(); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string multi_gpu_category; 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetString("multi_gpu_category", &multi_gpu_category)) { 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetMultiGpuCategory(multi_gpu_category)) { 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed multi_gpu_category entry " << entry->id(); 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* driver_vendor_value = NULL; 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("driver_vendor", &driver_vendor_value)) { 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string vendor_op; 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string vendor_value; 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_vendor_value->GetString(kOp, &vendor_op); 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_vendor_value->GetString("value", &vendor_value); 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetDriverVendorInfo(vendor_op, vendor_value)) { 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed driver_vendor entry " << entry->id(); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* driver_version_value = NULL; 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("driver_version", &driver_version_value)) { 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_version_op = "any"; 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_version_style; 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_version_string; 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_version_string2; 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_value->GetString(kOp, &driver_version_op); 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_value->GetString("style", &driver_version_style); 530d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) driver_version_value->GetString("value", &driver_version_string); 531d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) driver_version_value->GetString("value2", &driver_version_string2); 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetDriverVersionInfo(driver_version_op, 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_style, 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_string, 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_string2)) { 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed driver_version entry " << entry->id(); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* driver_date_value = NULL; 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("driver_date", &driver_date_value)) { 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_date_op = "any"; 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_date_string; 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_date_string2; 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_date_value->GetString(kOp, &driver_date_op); 548d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) driver_date_value->GetString("value", &driver_date_string); 549d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) driver_date_value->GetString("value2", &driver_date_string2); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetDriverDateInfo(driver_date_op, driver_date_string, 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_date_string2)) { 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed driver_date entry " << entry->id(); 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string gl_type; 559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (value->GetString("gl_type", &gl_type)) { 560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!entry->SetGLType(gl_type)) { 561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(WARNING) << "Malformed gl_type entry " << entry->id(); 562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return NULL; 563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) dictionary_entry_count++; 565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::DictionaryValue* gl_version_value = NULL; 568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (value->GetDictionary("gl_version", &gl_version_value)) { 569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string version_op = "any"; 570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string version_string; 571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string version_string2; 572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_version_value->GetString(kOp, &version_op); 573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_version_value->GetString("value", &version_string); 574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_version_value->GetString("value2", &version_string2); 575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!entry->SetGLVersionInfo( 576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) version_op, version_string, version_string2)) { 577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(WARNING) << "Malformed gl_version entry " << entry->id(); 578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return NULL; 579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) dictionary_entry_count++; 581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* gl_vendor_value = NULL; 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("gl_vendor", &gl_vendor_value)) { 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string vendor_op; 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string vendor_value; 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_vendor_value->GetString(kOp, &vendor_op); 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_vendor_value->GetString("value", &vendor_value); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetGLVendorInfo(vendor_op, vendor_value)) { 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed gl_vendor entry " << entry->id(); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* gl_renderer_value = NULL; 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("gl_renderer", &gl_renderer_value)) { 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string renderer_op; 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string renderer_value; 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_renderer_value->GetString(kOp, &renderer_op); 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_renderer_value->GetString("value", &renderer_value); 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetGLRendererInfo(renderer_op, renderer_value)) { 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed gl_renderer entry " << entry->id(); 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 609b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const base::DictionaryValue* gl_extensions_value = NULL; 610b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (value->GetDictionary("gl_extensions", &gl_extensions_value)) { 611b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::string extensions_op; 612b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::string extensions_value; 613b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gl_extensions_value->GetString(kOp, &extensions_op); 614b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gl_extensions_value->GetString("value", &extensions_value); 615b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!entry->SetGLExtensionsInfo(extensions_op, extensions_value)) { 616b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LOG(WARNING) << "Malformed gl_extensions entry " << entry->id(); 617b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return NULL; 618b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 619b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) dictionary_entry_count++; 620b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 621b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 622a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::DictionaryValue* gl_reset_notification_strategy_value = NULL; 623a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (value->GetDictionary("gl_reset_notification_strategy", 624a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &gl_reset_notification_strategy_value)) { 625a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string op; 626a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string int_value; 627a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string int_value2; 628a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gl_reset_notification_strategy_value->GetString(kOp, &op); 629a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gl_reset_notification_strategy_value->GetString("value", &int_value); 630a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gl_reset_notification_strategy_value->GetString("value2", &int_value2); 631a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!entry->SetGLResetNotificationStrategyInfo( 632a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) op, int_value, int_value2)) { 633a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LOG(WARNING) << "Malformed gl_reset_notification_strategy entry " 634a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) << entry->id(); 635a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return NULL; 636a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 637a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dictionary_entry_count++; 638a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 639a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* cpu_brand_value = NULL; 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("cpu_info", &cpu_brand_value)) { 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string cpu_op; 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string cpu_value; 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cpu_brand_value->GetString(kOp, &cpu_op); 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cpu_brand_value->GetString("value", &cpu_value); 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetCpuBrand(cpu_op, cpu_value)) { 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed cpu_brand entry " << entry->id(); 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* perf_graphics_value = NULL; 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("perf_graphics", &perf_graphics_value)) { 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string op; 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value; 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value2; 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_graphics_value->GetString(kOp, &op); 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_graphics_value->GetString("value", &float_value); 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_graphics_value->GetString("value2", &float_value2); 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetPerfGraphicsInfo(op, float_value, float_value2)) { 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed perf_graphics entry " << entry->id(); 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* perf_gaming_value = NULL; 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("perf_gaming", &perf_gaming_value)) { 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string op; 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value; 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value2; 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_gaming_value->GetString(kOp, &op); 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_gaming_value->GetString("value", &float_value); 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_gaming_value->GetString("value2", &float_value2); 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetPerfGamingInfo(op, float_value, float_value2)) { 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed perf_gaming entry " << entry->id(); 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* perf_overall_value = NULL; 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("perf_overall", &perf_overall_value)) { 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string op; 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value; 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value2; 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_overall_value->GetString(kOp, &op); 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_overall_value->GetString("value", &float_value); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_overall_value->GetString("value2", &float_value2); 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetPerfOverallInfo(op, float_value, float_value2)) { 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed perf_overall entry " << entry->id(); 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::ListValue* machine_model_name_list; 6990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (value->GetList("machine_model_name", &machine_model_name_list)) { 7000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (size_t i = 0; i < machine_model_name_list->GetSize(); ++i) { 7010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::string model_name; 7020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!machine_model_name_list->GetString(i, &model_name) || 7030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch !entry->AddMachineModelName(model_name)) { 7040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LOG(WARNING) << "Malformed machine_model_name entry " << entry->id(); 7050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return NULL; 7060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch dictionary_entry_count++; 7090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::DictionaryValue* machine_model_version_value = NULL; 7120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (value->GetDictionary( 7130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "machine_model_version", &machine_model_version_value)) { 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string version_op = "any"; 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string version_string; 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string version_string2; 7170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch machine_model_version_value->GetString(kOp, &version_op); 7180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch machine_model_version_value->GetString("value", &version_string); 7190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch machine_model_version_value->GetString("value2", &version_string2); 7200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!entry->SetMachineModelVersionInfo( 7210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch version_op, version_string, version_string2)) { 7220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LOG(WARNING) << "Malformed machine_model_version entry " << entry->id(); 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* gpu_count_value = NULL; 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("gpu_count", &gpu_count_value)) { 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string op; 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string int_value; 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string int_value2; 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_count_value->GetString(kOp, &op); 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_count_value->GetString("value", &int_value); 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_count_value->GetString("value2", &int_value2); 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetGpuCountInfo(op, int_value, int_value2)) { 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed gpu_count entry " << entry->id(); 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 743effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool direct_rendering; 744effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (value->GetBoolean("direct_rendering", &direct_rendering)) { 745effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch entry->SetDirectRenderingInfo(direct_rendering); 746effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch dictionary_entry_count++; 747effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 748effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (top_level) { 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* feature_value = NULL; 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetList("features", &feature_value)) { 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> feature_list; 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < feature_value->GetSize(); ++i) { 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string feature; 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (feature_value->GetString(i, &feature)) { 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) feature_list.push_back(feature); 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed feature entry " << entry->id(); 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!entry->SetFeatures( 763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) feature_list, feature_map, supports_feature_type_all)) { 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed feature entry " << entry->id(); 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (top_level) { 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* exception_list_value = NULL; 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetList("exceptions", &exception_list_value)) { 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < exception_list_value->GetSize(); ++i) { 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* exception_value = NULL; 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!exception_list_value->GetDictionary(i, &exception_value)) { 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed exceptions entry " << entry->id(); 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedGpuControlListEntry exception(GetEntryFromValue( 781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) exception_value, false, feature_map, supports_feature_type_all)); 782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (exception.get() == NULL) { 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed exceptions entry " << entry->id(); 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 786868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Exception should inherit vendor_id from parent, otherwise if only 787868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // device_ids are specified in Exception, the info will be incomplete. 788868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (exception->vendor_id_ == 0 && entry->vendor_id_ != 0) 789868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) exception->vendor_id_ = entry->vendor_id_; 790d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) entry->AddException(exception); 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->size() != dictionary_entry_count) { 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Entry with unknown fields " << entry->id(); 798d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return NULL; 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 800010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 801010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // If GL_VERSION is specified, but no info about whether it's GL or GLES, 802010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // we use the default for the platform. See GLType enum declaration. 803010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (entry->gl_version_info_.get() != NULL && entry->gl_type_ == kGLTypeNone) 804010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) entry->gl_type_ = GetDefaultGLType(); 805010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return entry; 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::GpuControlListEntry() 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : id_(0), 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) disabled_(false), 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vendor_id_(0), 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) multi_gpu_style_(kMultiGpuStyleNone), 814010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) multi_gpu_category_(kMultiGpuCategoryPrimary), 815010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_type_(kGLTypeNone) { 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::~GpuControlListEntry() { } 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetId(uint32 id) { 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (id != 0) { 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) id_ = id; 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuControlList::GpuControlListEntry::SetDisabled(bool disabled) { 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) disabled_ = disabled; 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetOsInfo( 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& os, 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_op, 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string2) { 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_info_.reset(new OsInfo(os, version_op, version_string, version_string2)); 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return os_info_->IsValid(); 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetVendorId( 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& vendor_id_string) { 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vendor_id_ = 0; 844e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return base::HexStringToUInt(vendor_id_string, &vendor_id_) && 845e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch vendor_id_ != 0; 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::AddDeviceId( 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_id_string) { 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 device_id = 0; 851e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (base::HexStringToUInt(device_id_string, &device_id) && device_id != 0) { 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_id_list_.push_back(device_id); 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetMultiGpuStyle( 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& multi_gpu_style_string) { 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MultiGpuStyle style = StringToMultiGpuStyle(multi_gpu_style_string); 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (style == kMultiGpuStyleNone) 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) multi_gpu_style_ = style; 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetMultiGpuCategory( 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& multi_gpu_category_string) { 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MultiGpuCategory category = 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringToMultiGpuCategory(multi_gpu_category_string); 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (category == kMultiGpuCategoryNone) 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) multi_gpu_category_ = category; 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 877010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGLType( 878010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& gl_type_string) { 879010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLType gl_type = StringToGLType(gl_type_string); 880010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gl_type == kGLTypeNone) 881010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 882010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_type_ = gl_type; 883010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return true; 884010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 885010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetDriverVendorInfo( 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& vendor_op, 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& vendor_value) { 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_vendor_info_.reset(new StringInfo(vendor_op, vendor_value)); 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return driver_vendor_info_->IsValid(); 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetDriverVersionInfo( 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_op, 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_style, 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string2) { 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_info_.reset(new VersionInfo( 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) version_op, version_style, version_string, version_string2)); 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return driver_version_info_->IsValid(); 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetDriverDateInfo( 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& date_op, 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& date_string, 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& date_string2) { 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_date_info_.reset( 908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new VersionInfo(date_op, std::string(), date_string, date_string2)); 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return driver_date_info_->IsValid(); 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGLVersionInfo( 913010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& version_op, 914010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& version_string, 915010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& version_string2) { 916010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_version_info_.reset(new VersionInfo( 917010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) version_op, std::string(), version_string, version_string2)); 918010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return gl_version_info_->IsValid(); 919010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 920010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGLVendorInfo( 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& vendor_op, 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& vendor_value) { 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_vendor_info_.reset(new StringInfo(vendor_op, vendor_value)); 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gl_vendor_info_->IsValid(); 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGLRendererInfo( 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& renderer_op, 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& renderer_value) { 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_renderer_info_.reset(new StringInfo(renderer_op, renderer_value)); 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gl_renderer_info_->IsValid(); 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 935b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGLExtensionsInfo( 936b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const std::string& extensions_op, 937b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const std::string& extensions_value) { 938b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gl_extensions_info_.reset(new StringInfo(extensions_op, extensions_value)); 939b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return gl_extensions_info_->IsValid(); 940b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 941b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 942a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGLResetNotificationStrategyInfo( 943a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& op, 944a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& int_string, 945a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& int_string2) { 946a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gl_reset_notification_strategy_info_.reset( 947a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new IntInfo(op, int_string, int_string2)); 948a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return gl_reset_notification_strategy_info_->IsValid(); 949a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 950a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetCpuBrand( 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& cpu_op, 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& cpu_value) { 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cpu_brand_.reset(new StringInfo(cpu_op, cpu_value)); 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return cpu_brand_->IsValid(); 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetPerfGraphicsInfo( 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& op, 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string, 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string2) { 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_graphics_info_.reset(new FloatInfo(op, float_string, float_string2)); 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return perf_graphics_info_->IsValid(); 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetPerfGamingInfo( 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& op, 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string, 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string2) { 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_gaming_info_.reset(new FloatInfo(op, float_string, float_string2)); 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return perf_gaming_info_->IsValid(); 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetPerfOverallInfo( 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& op, 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string, 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string2) { 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_overall_info_.reset(new FloatInfo(op, float_string, float_string2)); 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return perf_overall_info_->IsValid(); 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool GpuControlList::GpuControlListEntry::AddMachineModelName( 9830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const std::string& model_name) { 9840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (model_name.empty()) 9850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; 9860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch machine_model_name_list_.push_back(model_name); 9870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return true; 9880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 9890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 9900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool GpuControlList::GpuControlListEntry::SetMachineModelVersionInfo( 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_op, 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string2) { 9940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch machine_model_version_info_.reset(new VersionInfo( 9950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch version_op, std::string(), version_string, version_string2)); 9960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return machine_model_version_info_->IsValid(); 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGpuCountInfo( 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& op, 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& int_string, 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& int_string2) { 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_count_info_.reset(new IntInfo(op, int_string, int_string2)); 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gpu_count_info_->IsValid(); 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1007effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid GpuControlList::GpuControlListEntry::SetDirectRenderingInfo(bool value) { 1008effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch direct_rendering_info_.reset(new BoolInfo(value)); 1009effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1010effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetFeatures( 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& feature_strings, 1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FeatureMap& feature_map, 1014c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool supports_feature_type_all) { 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t size = feature_strings.size(); 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (size == 0) 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) features_.clear(); 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < size; ++i) { 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int feature = 0; 1021c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (supports_feature_type_all && feature_strings[i] == "all") { 1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (FeatureMap::const_iterator iter = feature_map.begin(); 1023c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter != feature_map.end(); ++iter) 1024c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) features_.insert(iter->second); 1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) continue; 1026c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1027d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!StringToFeature(feature_strings[i], &feature, feature_map)) { 1028d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) features_.clear(); 1029d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return false; 1030d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1031d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) features_.insert(feature); 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuControlList::GpuControlListEntry::AddException( 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedGpuControlListEntry exception) { 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) exceptions_.push_back(exception); 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1041010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::GLVersionInfoMismatch( 1042010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& gl_version) const { 1043010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gl_version.empty()) 1044010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 1045010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1046010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gl_version_info_.get() == NULL && gl_type_ == kGLTypeNone) 1047010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 1048010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1049010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::vector<std::string> segments; 1050010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::SplitString(gl_version, ' ', &segments); 1051010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string number; 1052010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLType gl_type = kGLTypeNone; 1053010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (segments.size() > 2 && 1054010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) segments[0] == "OpenGL" && segments[1] == "ES") { 1055010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) number = segments[2]; 1056010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_type = kGLTypeGLES; 1057010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (segments.size() > 3 && 1058010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) StartsWithASCII(segments[3], "(ANGLE", false)) { 1059010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_type = kGLTypeANGLE; 1060010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1061010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 1062010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) number = segments[0]; 1063010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_type = kGLTypeGL; 1064010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1065010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1066010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gl_type_ != kGLTypeNone && gl_type_ != gl_type) 1067010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return true; 1068010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gl_version_info_.get() != NULL && !gl_version_info_->Contains(number)) 1069010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return true; 1070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 1071010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::MultiGpuStyle 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::StringToMultiGpuStyle( 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& style) { 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (style == kMultiGpuStyleStringOptimus) 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuStyleOptimus; 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (style == kMultiGpuStyleStringAMDSwitchable) 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuStyleAMDSwitchable; 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuStyleNone; 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::MultiGpuCategory 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::StringToMultiGpuCategory( 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& category) { 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (category == kMultiGpuCategoryStringPrimary) 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuCategoryPrimary; 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (category == kMultiGpuCategoryStringSecondary) 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuCategorySecondary; 1092e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (category == kMultiGpuCategoryStringActive) 1093e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return kMultiGpuCategoryActive; 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (category == kMultiGpuCategoryStringAny) 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuCategoryAny; 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuCategoryNone; 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1099010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// static 1100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GpuControlList::GpuControlListEntry::GLType 1101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GpuControlList::GpuControlListEntry::StringToGLType( 1102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& gl_type) { 1103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gl_type == kGLTypeStringGL) 1104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeGL; 1105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gl_type == kGLTypeStringGLES) 1106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeGLES; 1107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gl_type == kGLTypeStringANGLE) 1108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeANGLE; 1109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeNone; 1110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// static 1113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GpuControlList::GpuControlListEntry::GLType 1114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GpuControlList::GpuControlListEntry::GetDefaultGLType() { 1115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_CHROMEOS) 1116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeGL; 1117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#elif defined(OS_LINUX) || defined(OS_OPENBSD) 1118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeGL; 1119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#elif defined(OS_MACOSX) 1120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeGL; 1121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#elif defined(OS_WIN) 1122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeANGLE; 1123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#elif defined(OS_ANDROID) 1124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeGLES; 1125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else 1126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeNone; 1127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif 1128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 11304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void GpuControlList::GpuControlListEntry::LogControlListMatch( 11314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& control_list_logging_name) const { 11324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static const char kControlListMatchMessage[] = 11334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "Control list match for rule #%u in %s."; 11341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) VLOG(1) << base::StringPrintf(kControlListMatchMessage, id_, 11351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) control_list_logging_name.c_str()); 11364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 11374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::Contains( 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OsType os_type, const std::string& os_version, 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GPUInfo& gpu_info) const { 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(os_type != kOsAny); 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os_info_.get() != NULL && !os_info_->Contains(os_type, os_version)) 11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1144e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (vendor_id_ != 0) { 1145e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch std::vector<GPUInfo::GPUDevice> candidates; 1146e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch switch (multi_gpu_category_) { 1147e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch case kMultiGpuCategoryPrimary: 1148e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch candidates.push_back(gpu_info.gpu); 1149e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch break; 1150e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch case kMultiGpuCategorySecondary: 1151e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch candidates = gpu_info.secondary_gpus; 1152e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch break; 1153e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch case kMultiGpuCategoryAny: 1154e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch candidates = gpu_info.secondary_gpus; 1155e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch candidates.push_back(gpu_info.gpu); 1156e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch break; 1157e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch case kMultiGpuCategoryActive: 1158e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (gpu_info.gpu.active) 1159e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch candidates.push_back(gpu_info.gpu); 1160e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (size_t ii = 0; ii < gpu_info.secondary_gpus.size(); ++ii) { 1161e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (gpu_info.secondary_gpus[ii].active) 1162e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch candidates.push_back(gpu_info.secondary_gpus[ii]); 1163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1164e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch default: 1165e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch break; 1166e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1167e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1168e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch GPUInfo::GPUDevice gpu; 1169e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch gpu.vendor_id = vendor_id_; 1170e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bool found = false; 1171e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (device_id_list_.empty()) { 1172e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (size_t ii = 0; ii < candidates.size(); ++ii) { 1173e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (gpu.vendor_id == candidates[ii].vendor_id) { 1174e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch found = true; 1175e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch break; 1176e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1177e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1178e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } else { 1179e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (size_t ii = 0; ii < device_id_list_.size(); ++ii) { 1180e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch gpu.device_id = device_id_list_[ii]; 1181e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (size_t jj = 0; jj < candidates.size(); ++jj) { 1182e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (gpu.vendor_id == candidates[jj].vendor_id && 1183e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch gpu.device_id == candidates[jj].device_id) { 1184e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch found = true; 1185e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch break; 1186e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1187e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1188e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1189e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1190e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (!found) 1191e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return false; 11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (multi_gpu_style_) { 11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kMultiGpuStyleOptimus: 11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!gpu_info.optimus) 11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kMultiGpuStyleAMDSwitchable: 11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!gpu_info.amd_switchable) 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kMultiGpuStyleNone: 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (driver_vendor_info_.get() != NULL && !gpu_info.driver_vendor.empty() && 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !driver_vendor_info_->Contains(gpu_info.driver_vendor)) 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (driver_version_info_.get() != NULL && !gpu_info.driver_version.empty()) { 12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!driver_version_info_->Contains(gpu_info.driver_version)) 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (driver_date_info_.get() != NULL && !gpu_info.driver_date.empty()) { 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!driver_date_info_->Contains(gpu_info.driver_date, '-')) 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (GLVersionInfoMismatch(gpu_info.gl_version)) 1217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gl_vendor_info_.get() != NULL && !gpu_info.gl_vendor.empty() && 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !gl_vendor_info_->Contains(gpu_info.gl_vendor)) 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gl_renderer_info_.get() != NULL && !gpu_info.gl_renderer.empty() && 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !gl_renderer_info_->Contains(gpu_info.gl_renderer)) 12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1224b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (gl_extensions_info_.get() != NULL && !gpu_info.gl_extensions.empty() && 1225b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) !gl_extensions_info_->Contains(gpu_info.gl_extensions)) 1226b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return false; 1227a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (gl_reset_notification_strategy_info_.get() != NULL && 1228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) !gl_reset_notification_strategy_info_->Contains( 1229a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gpu_info.gl_reset_notification_strategy)) 1230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (perf_graphics_info_.get() != NULL && 12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (gpu_info.performance_stats.graphics == 0.0 || 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !perf_graphics_info_->Contains(gpu_info.performance_stats.graphics))) 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (perf_gaming_info_.get() != NULL && 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (gpu_info.performance_stats.gaming == 0.0 || 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !perf_gaming_info_->Contains(gpu_info.performance_stats.gaming))) 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (perf_overall_info_.get() != NULL && 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (gpu_info.performance_stats.overall == 0.0 || 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !perf_overall_info_->Contains(gpu_info.performance_stats.overall))) 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!machine_model_name_list_.empty()) { 12445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (gpu_info.machine_model_name.empty()) 12455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return false; 12460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool found_match = false; 12470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (size_t ii = 0; ii < machine_model_name_list_.size(); ++ii) { 12480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (machine_model_name_list_[ii] == gpu_info.machine_model_name) { 12490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch found_match = true; 12500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 12510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 12520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 12530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!found_match) 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (machine_model_version_info_.get() != NULL && 12575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu (gpu_info.machine_model_version.empty() || 12585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu !machine_model_version_info_->Contains(gpu_info.machine_model_version))) 12590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gpu_count_info_.get() != NULL && 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !gpu_count_info_->Contains(gpu_info.secondary_gpus.size() + 1)) 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (direct_rendering_info_.get() != NULL && 1264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch !direct_rendering_info_->Contains(gpu_info.direct_rendering)) 1265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (cpu_brand_.get() != NULL) { 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::CPU cpu_info; 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!cpu_brand_->Contains(cpu_info.cpu_brand())) 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < exceptions_.size(); ++i) { 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (exceptions_[i]->Contains(os_type, os_version, gpu_info) && 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !exceptions_[i]->NeedsMoreInfo(gpu_info)) 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::NeedsMoreInfo( 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GPUInfo& gpu_info) const { 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We only check for missing info that might be collected with a gl context. 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If certain info is missing due to some error, say, we fail to collect 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // vendor_id/device_id, then even if we launch GPU process and create a gl 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // context, we won't gather such missing info, so we still return false. 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (driver_vendor_info_.get() && gpu_info.driver_vendor.empty()) 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (driver_version_info_.get() && gpu_info.driver_version.empty()) 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gl_vendor_info_.get() && gpu_info.gl_vendor.empty()) 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gl_renderer_info_.get() && gpu_info.gl_renderer.empty()) 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < exceptions_.size(); ++i) { 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (exceptions_[i]->NeedsMoreInfo(gpu_info)) 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsType GpuControlList::GpuControlListEntry::GetOsType() const { 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os_info_.get() == NULL) 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsAny; 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return os_info_->type(); 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32 GpuControlList::GpuControlListEntry::id() const { 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return id_; 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::disabled() const { 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return disabled_; 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const std::set<int>& GpuControlList::GpuControlListEntry::features() const { 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return features_; 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1319a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void GpuControlList::GpuControlListEntry::GetFeatureNames( 1320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ListValue* feature_names, 1321a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const FeatureMap& feature_map, 1322a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool supports_feature_type_all) const { 1323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(feature_names); 1324a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (supports_feature_type_all && features_.size() == feature_map.size()) { 1325a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) feature_names->AppendString("all"); 1326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 1327a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1328a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (FeatureMap::const_iterator iter = feature_map.begin(); 1329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) iter != feature_map.end(); ++iter) { 1330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (features_.count(iter->second) > 0) 1331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) feature_names->AppendString(iter->first); 1332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1334a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::StringToFeature( 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& feature_name, int* feature_id, 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FeatureMap& feature_map) { 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FeatureMap::const_iterator iter = feature_map.find(feature_name); 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter != feature_map.end()) { 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *feature_id = iter->second; 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlList() 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : max_entry_id_(0), 1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) needs_more_info_(false), 13504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) supports_feature_type_all_(false), 13514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) control_list_logging_enabled_(false) { 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::~GpuControlList() { 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Clear(); 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::LoadList( 13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& json_context, 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuControlList::OsFilter os_filter) { 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> root; 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root.reset(base::JSONReader::Read(json_context)); 13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root.get() == NULL || !root->IsType(base::Value::TYPE_DICTIONARY)) 13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* root_dictionary = 1367eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static_cast<base::DictionaryValue*>(root.get()); 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(root_dictionary); 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return LoadList(*root_dictionary, os_filter); 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::LoadList(const base::DictionaryValue& parsed_json, 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuControlList::OsFilter os_filter) { 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<ScopedGpuControlListEntry> entries; 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parsed_json.GetString("version", &version_); 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> pieces; 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ProcessVersionString(version_, '.', &pieces)) 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* list = NULL; 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!parsed_json.GetList("entries", &list)) 13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 max_entry_id = 0; 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < list->GetSize(); ++i) { 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* list_item = NULL; 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool valid = list->GetDictionary(i, &list_item); 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!valid || list_item == NULL) 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedGpuControlListEntry entry(GpuControlListEntry::GetEntryFromValue( 1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) list_item, true, feature_map_, supports_feature_type_all_)); 1393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (entry.get() == NULL) 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (entry->id() > max_entry_id) 13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_entry_id = entry->id(); 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entries.push_back(entry); 13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Clear(); 14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OsType my_os = GetOsType(); 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < entries.size(); ++i) { 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OsType entry_os = entries[i]->GetOsType(); 14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os_filter == GpuControlList::kAllOs || 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry_os == kOsAny || entry_os == my_os) 1406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entries_.push_back(entries[i]); 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_entry_id_ = max_entry_id; 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::set<int> GpuControlList::MakeDecision( 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuControlList::OsType os, 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string os_version, 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GPUInfo& gpu_info) { 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_entries_.clear(); 1417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<int> features; 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_more_info_ = false; 1420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<int> possible_features; 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os == kOsAny) 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os = GetOsType(); 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os_version.empty()) { 14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_version = base::SysInfo::OperatingSystemVersion(); 14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t pos = os_version.find_first_not_of("0123456789."); 14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (pos != std::string::npos) 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_version = os_version.substr(0, pos); 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> pieces; 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ProcessVersionString(os_version, '.', &pieces)) 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_version = "0"; 14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < entries_.size(); ++i) { 1435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (entries_[i]->Contains(os, os_version, gpu_info)) { 1436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!entries_[i]->disabled()) { 14374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (control_list_logging_enabled_) 14384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) entries_[i]->LogControlListMatch(control_list_logging_name_); 1439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MergeFeatureSets(&possible_features, entries_[i]->features()); 1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!entries_[i]->NeedsMoreInfo(gpu_info)) 1441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MergeFeatureSets(&features, entries_[i]->features()); 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_entries_.push_back(entries_[i]); 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (possible_features.size() > features.size()) 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_more_info_ = true; 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return features; 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuControlList::GetDecisionEntries( 14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<uint32>* entry_ids, bool disabled) const { 14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(entry_ids); 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry_ids->clear(); 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < active_entries_.size(); ++i) { 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (disabled == active_entries_[i]->disabled()) 14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry_ids->push_back(active_entries_[i]->id()); 14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1463a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void GpuControlList::GetReasons(base::ListValue* problem_list, 1464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& tag) const { 14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(problem_list); 14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < active_entries_.size(); ++i) { 1467868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GpuControlListEntry* entry = active_entries_[i].get(); 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (entry->disabled()) 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* problem = new base::DictionaryValue(); 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) problem->SetString("description", entry->description()); 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ListValue* cr_bugs = new base::ListValue(); 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t j = 0; j < entry->cr_bugs().size(); ++j) 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cr_bugs->Append(new base::FundamentalValue(entry->cr_bugs()[j])); 14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) problem->Set("crBugs", cr_bugs); 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ListValue* webkit_bugs = new base::ListValue(); 14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t j = 0; j < entry->webkit_bugs().size(); ++j) { 14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webkit_bugs->Append(new base::FundamentalValue(entry->webkit_bugs()[j])); 14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) problem->Set("webkitBugs", webkit_bugs); 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ListValue* features = new base::ListValue(); 1486a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) entry->GetFeatureNames(features, feature_map_, supports_feature_type_all_); 1487a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) problem->Set("affectedGpuSettings", features); 1488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1489a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(tag == "workarounds" || tag == "disabledFeatures"); 1490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) problem->SetString("tag", tag); 1491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) problem_list->Append(problem); 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)size_t GpuControlList::num_entries() const { 1497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return entries_.size(); 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32 GpuControlList::max_entry_id() const { 15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return max_entry_id_; 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string GpuControlList::version() const { 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return version_; 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsType GpuControlList::GetOsType() { 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsChromeOS; 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_WIN) 15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsWin; 15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_ANDROID) 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsAndroid; 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_LINUX) || defined(OS_OPENBSD) 15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsLinux; 15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_MACOSX) 15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsMacosx; 15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsUnknown; 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuControlList::Clear() { 1525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entries_.clear(); 15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_entries_.clear(); 15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_entry_id_ = 0; 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::NumericOp GpuControlList::StringToNumericOp( 15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& op) { 15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == "=") 15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kEQ; 15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == "<") 15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kLT; 15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == "<=") 15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kLE; 15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == ">") 15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kGT; 15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == ">=") 15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kGE; 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == "any") 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kAny; 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == "between") 15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kBetween; 15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kUnknown; 15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GpuControlList::AddSupportedFeature( 15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& feature_name, int feature_id) { 15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) feature_map_[feature_name] = feature_id; 15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GpuControlList::set_supports_feature_type_all(bool supported) { 1556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) supports_feature_type_all_ = supported; 1557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 155990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace gpu 15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1561