gpu_control_list.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// a valid number, and not all segment is 0. 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) } 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool all_zero = true; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < version->size(); ++i) { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned num = 0; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!base::StringToUint((*version)[i], &num)) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (num) 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch all_zero = false; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return !all_zero; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Compare two number strings using numerical ordering. 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Return 0 if number = number_ref, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1 if number > number_ref, 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// -1 if number < number_ref. 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int CompareNumericalNumberStrings( 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& number, const std::string& number_ref) { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned value1 = 0; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned value2 = 0; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool valid = base::StringToUint(number, &value1); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(valid); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) valid = base::StringToUint(number_ref, &value2); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(valid); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value1 == value2) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value1 > value2) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 1; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Compare two number strings using lexical ordering. 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Return 0 if number = number_ref, 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 1 if number > number_ref, 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// -1 if number < number_ref. 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We only compare as many digits as number_ref contains. 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// If number_ref is xxx, it's considered as xxx* 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// For example: CompareLexicalNumberStrings("121", "12") returns 0, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CompareLexicalNumberStrings("12", "121") returns -1. 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int CompareLexicalNumberStrings( 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& number, const std::string& number_ref) { 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < number_ref.length(); ++i) { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned value1 = 0; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i < number.length()) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value1 = number[i] - '0'; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned value2 = number_ref[i] - '0'; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value1 > value2) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 1; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value1 < value2) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return -1; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMultiGpuStyleStringAMDSwitchable[] = "amd_switchable"; 936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const char kMultiGpuStyleStringAMDSwitchableDiscrete[] = 946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "amd_switchable_discrete"; 956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const char kMultiGpuStyleStringAMDSwitchableIntegrated[] = 966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) "amd_switchable_integrated"; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMultiGpuStyleStringOptimus[] = "optimus"; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMultiGpuCategoryStringPrimary[] = "primary"; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMultiGpuCategoryStringSecondary[] = "secondary"; 101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochconst char kMultiGpuCategoryStringActive[] = "active"; 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kMultiGpuCategoryStringAny[] = "any"; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kGLTypeStringGL[] = "gl"; 105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kGLTypeStringGLES[] = "gles"; 106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const char kGLTypeStringANGLE[] = "angle"; 107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kVersionStyleStringNumerical[] = "numerical"; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kVersionStyleStringLexical[] = "lexical"; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kOp[] = "op"; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace anonymous 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::VersionInfo::VersionInfo( 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_op, 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_style, 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string2) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : version_style_(kVersionStyleNumerical) { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = StringToNumericOp(version_op); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kUnknown || op_ == kAny) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) version_style_ = StringToVersionStyle(version_style); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ProcessVersionString(version_string, '.', &version_)) { 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kBetween) { 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ProcessVersionString(version_string2, '.', &version2_)) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::VersionInfo::~VersionInfo() { 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::VersionInfo::Contains( 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string) const { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Contains(version_string, '.'); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::VersionInfo::Contains( 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, char splitter) const { 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kUnknown) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kAny) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> version; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ProcessVersionString(version_string, splitter, &version)) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int relation = Compare(version, version_, version_style_); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kEQ) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (relation == 0); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (op_ == kLT) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (relation < 0); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (op_ == kLE) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (relation <= 0); 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (op_ == kGT) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (relation > 0); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (op_ == kGE) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (relation >= 0); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // op_ == kBetween 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (relation < 0) 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return Compare(version, version2_, version_style_) <= 0; 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::VersionInfo::IsValid() const { 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (op_ != kUnknown && version_style_ != kVersionStyleUnknown); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::VersionInfo::IsLexical() const { 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return version_style_ == kVersionStyleLexical; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int GpuControlList::VersionInfo::Compare( 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& version, 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& version_ref, 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VersionStyle version_style) { 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(version.size() > 0 && version_ref.size() > 0); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(version_style != kVersionStyleUnknown); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < version_ref.size(); ++i) { 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i >= version.size()) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int ret = 0; 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We assume both versions are checked by ProcessVersionString(). 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i > 0 && version_style == kVersionStyleLexical) 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret = CompareLexicalNumberStrings(version[i], version_ref[i]); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ret = CompareNumericalNumberStrings(version[i], version_ref[i]); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ret != 0) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ret; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return 0; 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::VersionInfo::VersionStyle 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::VersionInfo::StringToVersionStyle( 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_style) { 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (version_style.empty() || version_style == kVersionStyleStringNumerical) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kVersionStyleNumerical; 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (version_style == kVersionStyleStringLexical) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kVersionStyleLexical; 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kVersionStyleUnknown; 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsInfo::OsInfo(const std::string& os, 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_op, 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string2) { 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = StringToOsType(os); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ != kOsUnknown) { 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) version_info_.reset(new VersionInfo( 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) version_op, std::string(), version_string, version_string2)); 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsInfo::~OsInfo() {} 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 223116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool GpuControlList::OsInfo::Contains( 224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OsType type, const std::string& version) const { 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsValid()) 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ != type && type_ != kOsAny) 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string processed_version; 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch size_t pos = version.find_first_not_of("0123456789."); 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (pos != std::string::npos) 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch processed_version = version.substr(0, pos); 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch processed_version = version; 235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return version_info_->Contains(processed_version); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::OsInfo::IsValid() const { 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return type_ != kOsUnknown && version_info_->IsValid(); 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsType GpuControlList::OsInfo::type() const { 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return type_; 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsType GpuControlList::OsInfo::StringToOsType( 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& os) { 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os == "win") 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsWin; 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (os == "macosx") 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsMacosx; 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (os == "android") 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsAndroid; 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (os == "linux") 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsLinux; 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (os == "chromeos") 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsChromeOS; 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (os == "any") 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsAny; 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsUnknown; 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::StringInfo::StringInfo(const std::string& string_op, 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& string_value) { 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = StringToOp(string_op); 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value_ = StringToLowerASCII(string_value); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::StringInfo::Contains(const std::string& value) const { 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string my_value = StringToLowerASCII(value); 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (op_) { 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kContains: 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return strstr(my_value.c_str(), value_.c_str()) != NULL; 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kBeginWith: 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return StartsWithASCII(my_value, value_, false); 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kEndWith: 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return EndsWith(my_value, value_, false); 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kEQ: 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return value_ == my_value; 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::StringInfo::IsValid() const { 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return op_ != kUnknown; 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::StringInfo::Op GpuControlList::StringInfo::StringToOp( 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& string_op) { 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (string_op == "=") 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kEQ; 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (string_op == "contains") 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kContains; 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (string_op == "beginwith") 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kBeginWith; 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (string_op == "endwith") 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kEndWith; 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kUnknown; 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::FloatInfo::FloatInfo(const std::string& float_op, 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_value, 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_value2) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : op_(kUnknown), 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value_(0.f), 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value2_(0.f) { 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) op_ = StringToNumericOp(float_op); 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (op_ == kAny) 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double dvalue = 0; 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!base::StringToDouble(float_value, &dvalue)) { 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value_ = static_cast<float>(dvalue); 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kBetween) { 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!base::StringToDouble(float_value2, &dvalue)) { 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value2_ = static_cast<float>(dvalue); 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::FloatInfo::Contains(float value) const { 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kUnknown) 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kAny) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kEQ) 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value == value_); 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kLT) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value < value_); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kLE) 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value <= value_); 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kGT) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value > value_); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kGE) 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value >= value_); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(op_ == kBetween); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ((value_ <= value && value <= value2_) || 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (value2_ <= value && value <= value_)); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::FloatInfo::IsValid() const { 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return op_ != kUnknown; 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::IntInfo::IntInfo(const std::string& int_op, 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& int_value, 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& int_value2) 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : op_(kUnknown), 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value_(0), 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) value2_(0) { 357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) op_ = StringToNumericOp(int_op); 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (op_ == kAny) 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!base::StringToInt(int_value, &value_)) { 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kBetween && 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !base::StringToInt(int_value2, &value2_)) 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) op_ = kUnknown; 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::IntInfo::Contains(int value) const { 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kUnknown) 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kAny) 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kEQ) 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value == value_); 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kLT) 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value < value_); 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kLE) 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value <= value_); 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kGT) 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value > value_); 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op_ == kGE) 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (value >= value_); 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(op_ == kBetween); 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ((value_ <= value && value <= value2_) || 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (value2_ <= value && value <= value_)); 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::IntInfo::IsValid() const { 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return op_ != kUnknown; 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 393effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochGpuControlList::BoolInfo::BoolInfo(bool value) : value_(value) {} 394effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool GpuControlList::BoolInfo::Contains(bool value) const { 396effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return value_ == value; 397effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 398effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::ScopedGpuControlListEntry 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::GetEntryFromValue( 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* value, bool top_level, 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FeatureMap& feature_map, 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool supports_feature_type_all) { 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(value); 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedGpuControlListEntry entry(new GpuControlListEntry()); 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t dictionary_entry_count = 0; 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (top_level) { 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 id; 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!value->GetInteger("id", reinterpret_cast<int*>(&id)) || 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !entry->SetId(id)) { 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed id entry " << entry->id(); 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool disabled; 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetBoolean("disabled", &disabled)) { 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->SetDisabled(disabled); 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string description; 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetString("description", &description)) { 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->description_ = description; 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->description_ = "The GPU is unavailable for an unexplained reason."; 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* cr_bugs; 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetList("cr_bugs", &cr_bugs)) { 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < cr_bugs->GetSize(); ++i) { 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int bug_id; 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (cr_bugs->GetInteger(i, &bug_id)) { 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->cr_bugs_.push_back(bug_id); 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed cr_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::ListValue* webkit_bugs; 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetList("webkit_bugs", &webkit_bugs)) { 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < webkit_bugs->GetSize(); ++i) { 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int bug_id; 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (webkit_bugs->GetInteger(i, &bug_id)) { 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry->webkit_bugs_.push_back(bug_id); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed webkit_bugs entry " << entry->id(); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* os_value = NULL; 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("os", &os_value)) { 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string os_type; 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string os_version_op = "any"; 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string os_version_string; 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string os_version_string2; 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_value->GetString("type", &os_type); 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* os_version_value = NULL; 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os_value->GetDictionary("version", &os_version_value)) { 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_version_value->GetString(kOp, &os_version_op); 472d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) os_version_value->GetString("value", &os_version_string); 473d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) os_version_value->GetString("value2", &os_version_string2); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetOsInfo(os_type, os_version_op, os_version_string, 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_version_string2)) { 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed os entry " << entry->id(); 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string vendor_id; 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetString("vendor_id", &vendor_id)) { 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetVendorId(vendor_id)) { 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed vendor_id entry " << entry->id(); 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* device_id_list; 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetList("device_id", &device_id_list)) { 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < device_id_list->GetSize(); ++i) { 4950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::string device_id; 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!device_id_list->GetString(i, &device_id) || 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !entry->AddDeviceId(device_id)) { 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed device_id entry " << entry->id(); 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string multi_gpu_style; 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetString("multi_gpu_style", &multi_gpu_style)) { 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetMultiGpuStyle(multi_gpu_style)) { 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed multi_gpu_style entry " << entry->id(); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string multi_gpu_category; 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetString("multi_gpu_category", &multi_gpu_category)) { 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetMultiGpuCategory(multi_gpu_category)) { 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed multi_gpu_category entry " << entry->id(); 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* driver_vendor_value = NULL; 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("driver_vendor", &driver_vendor_value)) { 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string vendor_op; 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string vendor_value; 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_vendor_value->GetString(kOp, &vendor_op); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_vendor_value->GetString("value", &vendor_value); 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetDriverVendorInfo(vendor_op, vendor_value)) { 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed driver_vendor entry " << entry->id(); 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* driver_version_value = NULL; 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("driver_version", &driver_version_value)) { 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_version_op = "any"; 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_version_style; 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_version_string; 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_version_string2; 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_value->GetString(kOp, &driver_version_op); 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_value->GetString("style", &driver_version_style); 544d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) driver_version_value->GetString("value", &driver_version_string); 545d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) driver_version_value->GetString("value2", &driver_version_string2); 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetDriverVersionInfo(driver_version_op, 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_style, 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_string, 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_string2)) { 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed driver_version entry " << entry->id(); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* driver_date_value = NULL; 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("driver_date", &driver_date_value)) { 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_date_op = "any"; 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_date_string; 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string driver_date_string2; 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_date_value->GetString(kOp, &driver_date_op); 562d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) driver_date_value->GetString("value", &driver_date_string); 563d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) driver_date_value->GetString("value2", &driver_date_string2); 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetDriverDateInfo(driver_date_op, driver_date_string, 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_date_string2)) { 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed driver_date entry " << entry->id(); 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string gl_type; 573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (value->GetString("gl_type", &gl_type)) { 574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!entry->SetGLType(gl_type)) { 575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(WARNING) << "Malformed gl_type entry " << entry->id(); 576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return NULL; 577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) dictionary_entry_count++; 579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const base::DictionaryValue* gl_version_value = NULL; 582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (value->GetDictionary("gl_version", &gl_version_value)) { 583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string version_op = "any"; 584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string version_string; 585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string version_string2; 586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_version_value->GetString(kOp, &version_op); 587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_version_value->GetString("value", &version_string); 588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_version_value->GetString("value2", &version_string2); 589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!entry->SetGLVersionInfo( 590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) version_op, version_string, version_string2)) { 591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) LOG(WARNING) << "Malformed gl_version entry " << entry->id(); 592010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return NULL; 593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) dictionary_entry_count++; 595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* gl_vendor_value = NULL; 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("gl_vendor", &gl_vendor_value)) { 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string vendor_op; 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string vendor_value; 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_vendor_value->GetString(kOp, &vendor_op); 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_vendor_value->GetString("value", &vendor_value); 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetGLVendorInfo(vendor_op, vendor_value)) { 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed gl_vendor entry " << entry->id(); 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* gl_renderer_value = NULL; 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("gl_renderer", &gl_renderer_value)) { 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string renderer_op; 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string renderer_value; 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_renderer_value->GetString(kOp, &renderer_op); 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_renderer_value->GetString("value", &renderer_value); 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetGLRendererInfo(renderer_op, renderer_value)) { 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed gl_renderer entry " << entry->id(); 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 623b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const base::DictionaryValue* gl_extensions_value = NULL; 624b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (value->GetDictionary("gl_extensions", &gl_extensions_value)) { 625b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::string extensions_op; 626b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) std::string extensions_value; 627b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gl_extensions_value->GetString(kOp, &extensions_op); 628b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gl_extensions_value->GetString("value", &extensions_value); 629b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (!entry->SetGLExtensionsInfo(extensions_op, extensions_value)) { 630b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) LOG(WARNING) << "Malformed gl_extensions entry " << entry->id(); 631b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return NULL; 632b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 633b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) dictionary_entry_count++; 634b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 635b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 636a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const base::DictionaryValue* gl_reset_notification_strategy_value = NULL; 637a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (value->GetDictionary("gl_reset_notification_strategy", 638a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &gl_reset_notification_strategy_value)) { 639a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string op; 640a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string int_value; 641a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::string int_value2; 642a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gl_reset_notification_strategy_value->GetString(kOp, &op); 643a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gl_reset_notification_strategy_value->GetString("value", &int_value); 644a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gl_reset_notification_strategy_value->GetString("value2", &int_value2); 645a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!entry->SetGLResetNotificationStrategyInfo( 646a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) op, int_value, int_value2)) { 647a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LOG(WARNING) << "Malformed gl_reset_notification_strategy entry " 648a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) << entry->id(); 649a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return NULL; 650a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 651a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dictionary_entry_count++; 652a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 653a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* cpu_brand_value = NULL; 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("cpu_info", &cpu_brand_value)) { 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string cpu_op; 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string cpu_value; 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cpu_brand_value->GetString(kOp, &cpu_op); 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cpu_brand_value->GetString("value", &cpu_value); 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetCpuBrand(cpu_op, cpu_value)) { 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed cpu_brand entry " << entry->id(); 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* perf_graphics_value = NULL; 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("perf_graphics", &perf_graphics_value)) { 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string op; 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value; 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value2; 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_graphics_value->GetString(kOp, &op); 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_graphics_value->GetString("value", &float_value); 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_graphics_value->GetString("value2", &float_value2); 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetPerfGraphicsInfo(op, float_value, float_value2)) { 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed perf_graphics entry " << entry->id(); 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* perf_gaming_value = NULL; 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("perf_gaming", &perf_gaming_value)) { 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string op; 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value; 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value2; 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_gaming_value->GetString(kOp, &op); 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_gaming_value->GetString("value", &float_value); 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_gaming_value->GetString("value2", &float_value2); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetPerfGamingInfo(op, float_value, float_value2)) { 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed perf_gaming entry " << entry->id(); 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* perf_overall_value = NULL; 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("perf_overall", &perf_overall_value)) { 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string op; 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value; 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string float_value2; 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_overall_value->GetString(kOp, &op); 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_overall_value->GetString("value", &float_value); 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_overall_value->GetString("value2", &float_value2); 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetPerfOverallInfo(op, float_value, float_value2)) { 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed perf_overall entry " << entry->id(); 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::ListValue* machine_model_name_list; 7130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (value->GetList("machine_model_name", &machine_model_name_list)) { 7140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (size_t i = 0; i < machine_model_name_list->GetSize(); ++i) { 7150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::string model_name; 7160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!machine_model_name_list->GetString(i, &model_name) || 7170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch !entry->AddMachineModelName(model_name)) { 7180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LOG(WARNING) << "Malformed machine_model_name entry " << entry->id(); 7190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return NULL; 7200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch dictionary_entry_count++; 7230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const base::DictionaryValue* machine_model_version_value = NULL; 7260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (value->GetDictionary( 7270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "machine_model_version", &machine_model_version_value)) { 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string version_op = "any"; 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string version_string; 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string version_string2; 7310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch machine_model_version_value->GetString(kOp, &version_op); 7320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch machine_model_version_value->GetString("value", &version_string); 7330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch machine_model_version_value->GetString("value2", &version_string2); 7340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!entry->SetMachineModelVersionInfo( 7350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch version_op, version_string, version_string2)) { 7360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LOG(WARNING) << "Malformed machine_model_version entry " << entry->id(); 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* gpu_count_value = NULL; 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetDictionary("gpu_count", &gpu_count_value)) { 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string op; 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string int_value; 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string int_value2; 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_count_value->GetString(kOp, &op); 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_count_value->GetString("value", &int_value); 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_count_value->GetString("value2", &int_value2); 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!entry->SetGpuCountInfo(op, int_value, int_value2)) { 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed gpu_count entry " << entry->id(); 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 757effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool direct_rendering; 758effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (value->GetBoolean("direct_rendering", &direct_rendering)) { 759effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch entry->SetDirectRenderingInfo(direct_rendering); 760effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch dictionary_entry_count++; 761effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 762effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (top_level) { 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* feature_value = NULL; 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetList("features", &feature_value)) { 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> feature_list; 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < feature_value->GetSize(); ++i) { 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string feature; 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (feature_value->GetString(i, &feature)) { 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) feature_list.push_back(feature); 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed feature entry " << entry->id(); 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!entry->SetFeatures( 777c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) feature_list, feature_map, supports_feature_type_all)) { 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed feature entry " << entry->id(); 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (top_level) { 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* exception_list_value = NULL; 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->GetList("exceptions", &exception_list_value)) { 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < exception_list_value->GetSize(); ++i) { 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* exception_value = NULL; 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!exception_list_value->GetDictionary(i, &exception_value)) { 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed exceptions entry " << entry->id(); 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedGpuControlListEntry exception(GetEntryFromValue( 795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) exception_value, false, feature_map, supports_feature_type_all)); 796868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (exception.get() == NULL) { 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Malformed exceptions entry " << entry->id(); 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 800868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Exception should inherit vendor_id from parent, otherwise if only 801868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // device_ids are specified in Exception, the info will be incomplete. 802868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (exception->vendor_id_ == 0 && entry->vendor_id_ != 0) 803868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) exception->vendor_id_ = entry->vendor_id_; 804d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) entry->AddException(exception); 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dictionary_entry_count++; 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (value->size() != dictionary_entry_count) { 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(WARNING) << "Entry with unknown fields " << entry->id(); 812d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return NULL; 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 814010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 815010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // If GL_VERSION is specified, but no info about whether it's GL or GLES, 816010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // we use the default for the platform. See GLType enum declaration. 817010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (entry->gl_version_info_.get() != NULL && entry->gl_type_ == kGLTypeNone) 818010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) entry->gl_type_ = GetDefaultGLType(); 819010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return entry; 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::GpuControlListEntry() 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : id_(0), 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) disabled_(false), 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vendor_id_(0), 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) multi_gpu_style_(kMultiGpuStyleNone), 828010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) multi_gpu_category_(kMultiGpuCategoryPrimary), 829010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_type_(kGLTypeNone) { 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::~GpuControlListEntry() { } 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetId(uint32 id) { 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (id != 0) { 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) id_ = id; 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuControlList::GpuControlListEntry::SetDisabled(bool disabled) { 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) disabled_ = disabled; 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetOsInfo( 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& os, 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_op, 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string2) { 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_info_.reset(new OsInfo(os, version_op, version_string, version_string2)); 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return os_info_->IsValid(); 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetVendorId( 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& vendor_id_string) { 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) vendor_id_ = 0; 858e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return base::HexStringToUInt(vendor_id_string, &vendor_id_) && 859e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch vendor_id_ != 0; 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::AddDeviceId( 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& device_id_string) { 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 device_id = 0; 865e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (base::HexStringToUInt(device_id_string, &device_id) && device_id != 0) { 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_id_list_.push_back(device_id); 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetMultiGpuStyle( 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& multi_gpu_style_string) { 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MultiGpuStyle style = StringToMultiGpuStyle(multi_gpu_style_string); 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (style == kMultiGpuStyleNone) 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) multi_gpu_style_ = style; 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetMultiGpuCategory( 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& multi_gpu_category_string) { 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MultiGpuCategory category = 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StringToMultiGpuCategory(multi_gpu_category_string); 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (category == kMultiGpuCategoryNone) 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) multi_gpu_category_ = category; 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 891010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGLType( 892010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& gl_type_string) { 893010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLType gl_type = StringToGLType(gl_type_string); 894010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gl_type == kGLTypeNone) 895010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 896010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_type_ = gl_type; 897010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return true; 898010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 899010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetDriverVendorInfo( 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& vendor_op, 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& vendor_value) { 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_vendor_info_.reset(new StringInfo(vendor_op, vendor_value)); 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return driver_vendor_info_->IsValid(); 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetDriverVersionInfo( 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_op, 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_style, 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string2) { 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_version_info_.reset(new VersionInfo( 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) version_op, version_style, version_string, version_string2)); 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return driver_version_info_->IsValid(); 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetDriverDateInfo( 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& date_op, 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& date_string, 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& date_string2) { 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) driver_date_info_.reset( 922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new VersionInfo(date_op, std::string(), date_string, date_string2)); 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return driver_date_info_->IsValid(); 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 926010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGLVersionInfo( 927010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& version_op, 928010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& version_string, 929010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& version_string2) { 930010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_version_info_.reset(new VersionInfo( 931010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) version_op, std::string(), version_string, version_string2)); 932010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return gl_version_info_->IsValid(); 933010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 934010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGLVendorInfo( 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& vendor_op, 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& vendor_value) { 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_vendor_info_.reset(new StringInfo(vendor_op, vendor_value)); 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gl_vendor_info_->IsValid(); 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGLRendererInfo( 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& renderer_op, 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& renderer_value) { 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gl_renderer_info_.reset(new StringInfo(renderer_op, renderer_value)); 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gl_renderer_info_->IsValid(); 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 949b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGLExtensionsInfo( 950b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const std::string& extensions_op, 951b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) const std::string& extensions_value) { 952b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) gl_extensions_info_.reset(new StringInfo(extensions_op, extensions_value)); 953b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return gl_extensions_info_->IsValid(); 954b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)} 955b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 956a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGLResetNotificationStrategyInfo( 957a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& op, 958a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& int_string, 959a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& int_string2) { 960a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gl_reset_notification_strategy_info_.reset( 961a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new IntInfo(op, int_string, int_string2)); 962a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return gl_reset_notification_strategy_info_->IsValid(); 963a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 964a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetCpuBrand( 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& cpu_op, 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& cpu_value) { 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cpu_brand_.reset(new StringInfo(cpu_op, cpu_value)); 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return cpu_brand_->IsValid(); 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetPerfGraphicsInfo( 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& op, 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string, 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string2) { 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_graphics_info_.reset(new FloatInfo(op, float_string, float_string2)); 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return perf_graphics_info_->IsValid(); 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetPerfGamingInfo( 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& op, 9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string, 9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string2) { 9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_gaming_info_.reset(new FloatInfo(op, float_string, float_string2)); 9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return perf_gaming_info_->IsValid(); 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetPerfOverallInfo( 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& op, 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string, 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& float_string2) { 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) perf_overall_info_.reset(new FloatInfo(op, float_string, float_string2)); 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return perf_overall_info_->IsValid(); 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool GpuControlList::GpuControlListEntry::AddMachineModelName( 9970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const std::string& model_name) { 9980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (model_name.empty()) 9990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; 10000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch machine_model_name_list_.push_back(model_name); 10010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return true; 10020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 10030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 10040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool GpuControlList::GpuControlListEntry::SetMachineModelVersionInfo( 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_op, 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string, 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& version_string2) { 10080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch machine_model_version_info_.reset(new VersionInfo( 10090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch version_op, std::string(), version_string, version_string2)); 10100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return machine_model_version_info_->IsValid(); 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetGpuCountInfo( 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& op, 10152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& int_string, 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& int_string2) { 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gpu_count_info_.reset(new IntInfo(op, int_string, int_string2)); 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gpu_count_info_->IsValid(); 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1021effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid GpuControlList::GpuControlListEntry::SetDirectRenderingInfo(bool value) { 1022effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch direct_rendering_info_.reset(new BoolInfo(value)); 1023effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1024effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::SetFeatures( 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<std::string>& feature_strings, 1027c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const FeatureMap& feature_map, 1028c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool supports_feature_type_all) { 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t size = feature_strings.size(); 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (size == 0) 10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1032c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) features_.clear(); 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < size; ++i) { 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int feature = 0; 1035c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (supports_feature_type_all && feature_strings[i] == "all") { 1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (FeatureMap::const_iterator iter = feature_map.begin(); 1037c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) iter != feature_map.end(); ++iter) 1038c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) features_.insert(iter->second); 1039c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) continue; 1040c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1041d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (!StringToFeature(feature_strings[i], &feature, feature_map)) { 1042d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) features_.clear(); 1043d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return false; 1044d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1045d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) features_.insert(feature); 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuControlList::GpuControlListEntry::AddException( 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ScopedGpuControlListEntry exception) { 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) exceptions_.push_back(exception); 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1055010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::GLVersionInfoMismatch( 1056010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& gl_version) const { 1057010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gl_version.empty()) 1058010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 1059010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1060010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gl_version_info_.get() == NULL && gl_type_ == kGLTypeNone) 1061010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 1062010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1063010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::vector<std::string> segments; 1064010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::SplitString(gl_version, ' ', &segments); 1065010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string number; 1066010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) GLType gl_type = kGLTypeNone; 1067010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (segments.size() > 2 && 1068010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) segments[0] == "OpenGL" && segments[1] == "ES") { 1069010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) number = segments[2]; 1070010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_type = kGLTypeGLES; 1071010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (segments.size() > 3 && 1072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) StartsWithASCII(segments[3], "(ANGLE", false)) { 1073010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_type = kGLTypeANGLE; 1074010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1075010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } else { 1076010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) number = segments[0]; 1077010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) gl_type = kGLTypeGL; 1078010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1079010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1080010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gl_type_ != kGLTypeNone && gl_type_ != gl_type) 1081010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return true; 1082010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gl_version_info_.get() != NULL && !gl_version_info_->Contains(number)) 1083010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return true; 1084010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 1085010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1086010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::MultiGpuStyle 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::StringToMultiGpuStyle( 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& style) { 10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (style == kMultiGpuStyleStringOptimus) 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuStyleOptimus; 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (style == kMultiGpuStyleStringAMDSwitchable) 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuStyleAMDSwitchable; 10956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (style == kMultiGpuStyleStringAMDSwitchableIntegrated) 10966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return kMultiGpuStyleAMDSwitchableIntegrated; 10976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (style == kMultiGpuStyleStringAMDSwitchableDiscrete) 10986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return kMultiGpuStyleAMDSwitchableDiscrete; 10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuStyleNone; 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::MultiGpuCategory 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlListEntry::StringToMultiGpuCategory( 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& category) { 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (category == kMultiGpuCategoryStringPrimary) 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuCategoryPrimary; 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (category == kMultiGpuCategoryStringSecondary) 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuCategorySecondary; 1110e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (category == kMultiGpuCategoryStringActive) 1111e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return kMultiGpuCategoryActive; 11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (category == kMultiGpuCategoryStringAny) 11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuCategoryAny; 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kMultiGpuCategoryNone; 11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// static 1118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GpuControlList::GpuControlListEntry::GLType 1119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GpuControlList::GpuControlListEntry::StringToGLType( 1120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& gl_type) { 1121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gl_type == kGLTypeStringGL) 1122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeGL; 1123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gl_type == kGLTypeStringGLES) 1124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeGLES; 1125010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (gl_type == kGLTypeStringANGLE) 1126010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeANGLE; 1127010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeNone; 1128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 1130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// static 1131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GpuControlList::GpuControlListEntry::GLType 1132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)GpuControlList::GpuControlListEntry::GetDefaultGLType() { 1133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(OS_CHROMEOS) 1134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeGL; 1135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#elif defined(OS_LINUX) || defined(OS_OPENBSD) 1136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeGL; 1137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#elif defined(OS_MACOSX) 1138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeGL; 1139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#elif defined(OS_WIN) 1140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeANGLE; 1141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#elif defined(OS_ANDROID) 1142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeGLES; 1143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else 1144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return kGLTypeNone; 1145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif 1146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 1147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 11484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void GpuControlList::GpuControlListEntry::LogControlListMatch( 11494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& control_list_logging_name) const { 11504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static const char kControlListMatchMessage[] = 11514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "Control list match for rule #%u in %s."; 11521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) VLOG(1) << base::StringPrintf(kControlListMatchMessage, id_, 11531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) control_list_logging_name.c_str()); 11544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 11554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::Contains( 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OsType os_type, const std::string& os_version, 11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GPUInfo& gpu_info) const { 11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(os_type != kOsAny); 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os_info_.get() != NULL && !os_info_->Contains(os_type, os_version)) 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1162e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (vendor_id_ != 0) { 1163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch std::vector<GPUInfo::GPUDevice> candidates; 1164e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch switch (multi_gpu_category_) { 1165e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch case kMultiGpuCategoryPrimary: 1166e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch candidates.push_back(gpu_info.gpu); 1167e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch break; 1168e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch case kMultiGpuCategorySecondary: 1169e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch candidates = gpu_info.secondary_gpus; 1170e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch break; 1171e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch case kMultiGpuCategoryAny: 1172e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch candidates = gpu_info.secondary_gpus; 1173e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch candidates.push_back(gpu_info.gpu); 1174e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch break; 1175e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch case kMultiGpuCategoryActive: 1176e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (gpu_info.gpu.active) 1177e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch candidates.push_back(gpu_info.gpu); 1178e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (size_t ii = 0; ii < gpu_info.secondary_gpus.size(); ++ii) { 1179e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (gpu_info.secondary_gpus[ii].active) 1180e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch candidates.push_back(gpu_info.secondary_gpus[ii]); 1181e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1182e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch default: 1183e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch break; 1184e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1185e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1186e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch GPUInfo::GPUDevice gpu; 1187e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch gpu.vendor_id = vendor_id_; 1188e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch bool found = false; 1189e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (device_id_list_.empty()) { 1190e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (size_t ii = 0; ii < candidates.size(); ++ii) { 1191e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (gpu.vendor_id == candidates[ii].vendor_id) { 1192e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch found = true; 1193e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch break; 1194e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1195e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1196e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } else { 1197e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (size_t ii = 0; ii < device_id_list_.size(); ++ii) { 1198e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch gpu.device_id = device_id_list_[ii]; 1199e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch for (size_t jj = 0; jj < candidates.size(); ++jj) { 1200e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (gpu.vendor_id == candidates[jj].vendor_id && 1201e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch gpu.device_id == candidates[jj].device_id) { 1202e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch found = true; 1203e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch break; 1204e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1205e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1206e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1207e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1208e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (!found) 1209e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return false; 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (multi_gpu_style_) { 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kMultiGpuStyleOptimus: 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!gpu_info.optimus) 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kMultiGpuStyleAMDSwitchable: 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!gpu_info.amd_switchable) 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) break; 12206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) case kMultiGpuStyleAMDSwitchableDiscrete: 12216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!gpu_info.amd_switchable) 12226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return false; 12236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // The discrete GPU is always the primary GPU. 12246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // This is guaranteed by GpuInfoCollector. 12256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!gpu_info.gpu.active) 12266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return false; 12276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) break; 12286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) case kMultiGpuStyleAMDSwitchableIntegrated: 12296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (!gpu_info.amd_switchable) 12306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return false; 12316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Assume the integrated GPU is the first in the secondary GPU list. 12326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (gpu_info.secondary_gpus.size() == 0 || 12336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) !gpu_info.secondary_gpus[0].active) 12346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return false; 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case kMultiGpuStyleNone: 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (driver_vendor_info_.get() != NULL && !gpu_info.driver_vendor.empty() && 12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !driver_vendor_info_->Contains(gpu_info.driver_vendor)) 12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (driver_version_info_.get() != NULL && !gpu_info.driver_version.empty()) { 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!driver_version_info_->Contains(gpu_info.driver_version)) 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (driver_date_info_.get() != NULL && !gpu_info.driver_date.empty()) { 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!driver_date_info_->Contains(gpu_info.driver_date, '-')) 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1250010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (GLVersionInfoMismatch(gpu_info.gl_version)) 1251010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gl_vendor_info_.get() != NULL && !gpu_info.gl_vendor.empty() && 12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !gl_vendor_info_->Contains(gpu_info.gl_vendor)) 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gl_renderer_info_.get() != NULL && !gpu_info.gl_renderer.empty() && 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !gl_renderer_info_->Contains(gpu_info.gl_renderer)) 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1258b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (gl_extensions_info_.get() != NULL && !gpu_info.gl_extensions.empty() && 1259b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) !gl_extensions_info_->Contains(gpu_info.gl_extensions)) 1260b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return false; 1261a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (gl_reset_notification_strategy_info_.get() != NULL && 1262a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) !gl_reset_notification_strategy_info_->Contains( 1263a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) gpu_info.gl_reset_notification_strategy)) 1264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return false; 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (perf_graphics_info_.get() != NULL && 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (gpu_info.performance_stats.graphics == 0.0 || 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !perf_graphics_info_->Contains(gpu_info.performance_stats.graphics))) 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (perf_gaming_info_.get() != NULL && 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (gpu_info.performance_stats.gaming == 0.0 || 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !perf_gaming_info_->Contains(gpu_info.performance_stats.gaming))) 12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (perf_overall_info_.get() != NULL && 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (gpu_info.performance_stats.overall == 0.0 || 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !perf_overall_info_->Contains(gpu_info.performance_stats.overall))) 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!machine_model_name_list_.empty()) { 12785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (gpu_info.machine_model_name.empty()) 12795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return false; 12800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool found_match = false; 12810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (size_t ii = 0; ii < machine_model_name_list_.size(); ++ii) { 12820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (machine_model_name_list_[ii] == gpu_info.machine_model_name) { 12830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch found_match = true; 12840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch break; 12850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 12860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 12870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!found_match) 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (machine_model_version_info_.get() != NULL && 12915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu (gpu_info.machine_model_version.empty() || 12925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu !machine_model_version_info_->Contains(gpu_info.machine_model_version))) 12930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gpu_count_info_.get() != NULL && 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !gpu_count_info_->Contains(gpu_info.secondary_gpus.size() + 1)) 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (direct_rendering_info_.get() != NULL && 1298effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch !direct_rendering_info_->Contains(gpu_info.direct_rendering)) 1299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return false; 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (cpu_brand_.get() != NULL) { 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::CPU cpu_info; 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!cpu_brand_->Contains(cpu_info.cpu_brand())) 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < exceptions_.size(); ++i) { 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (exceptions_[i]->Contains(os_type, os_version, gpu_info) && 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) !exceptions_[i]->NeedsMoreInfo(gpu_info)) 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::NeedsMoreInfo( 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GPUInfo& gpu_info) const { 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We only check for missing info that might be collected with a gl context. 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If certain info is missing due to some error, say, we fail to collect 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // vendor_id/device_id, then even if we launch GPU process and create a gl 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // context, we won't gather such missing info, so we still return false. 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (driver_vendor_info_.get() && gpu_info.driver_vendor.empty()) 13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (driver_version_info_.get() && gpu_info.driver_version.empty()) 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gl_vendor_info_.get() && gpu_info.gl_vendor.empty()) 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (gl_renderer_info_.get() && gpu_info.gl_renderer.empty()) 13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < exceptions_.size(); ++i) { 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (exceptions_[i]->NeedsMoreInfo(gpu_info)) 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsType GpuControlList::GpuControlListEntry::GetOsType() const { 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os_info_.get() == NULL) 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsAny; 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return os_info_->type(); 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32 GpuControlList::GpuControlListEntry::id() const { 13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return id_; 13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::disabled() const { 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return disabled_; 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const std::set<int>& GpuControlList::GpuControlListEntry::features() const { 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return features_; 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1353a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void GpuControlList::GpuControlListEntry::GetFeatureNames( 1354a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ListValue* feature_names, 1355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const FeatureMap& feature_map, 1356a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool supports_feature_type_all) const { 1357a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(feature_names); 1358a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (supports_feature_type_all && features_.size() == feature_map.size()) { 1359a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) feature_names->AppendString("all"); 1360a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 1361a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1362a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (FeatureMap::const_iterator iter = feature_map.begin(); 1363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) iter != feature_map.end(); ++iter) { 1364a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (features_.count(iter->second) > 0) 1365a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) feature_names->AppendString(iter->first); 1366a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1367a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 1368a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::GpuControlListEntry::StringToFeature( 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& feature_name, int* feature_id, 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const FeatureMap& feature_map) { 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FeatureMap::const_iterator iter = feature_map.find(feature_name); 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (iter != feature_map.end()) { 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *feature_id = iter->second; 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::GpuControlList() 13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : max_entry_id_(0), 1383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) needs_more_info_(false), 13844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) supports_feature_type_all_(false), 13854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) control_list_logging_enabled_(false) { 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::~GpuControlList() { 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Clear(); 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::LoadList( 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& json_context, 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuControlList::OsFilter os_filter) { 13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> root; 13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root.reset(base::JSONReader::Read(json_context)); 13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root.get() == NULL || !root->IsType(base::Value::TYPE_DICTIONARY)) 13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* root_dictionary = 1401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static_cast<base::DictionaryValue*>(root.get()); 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(root_dictionary); 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return LoadList(*root_dictionary, os_filter); 14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GpuControlList::LoadList(const base::DictionaryValue& parsed_json, 14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuControlList::OsFilter os_filter) { 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<ScopedGpuControlListEntry> entries; 14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parsed_json.GetString("version", &version_); 14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> pieces; 14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!ProcessVersionString(version_, '.', &pieces)) 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::ListValue* list = NULL; 14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!parsed_json.GetList("entries", &list)) 14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 max_entry_id = 0; 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < list->GetSize(); ++i) { 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::DictionaryValue* list_item = NULL; 14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool valid = list->GetDictionary(i, &list_item); 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!valid || list_item == NULL) 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedGpuControlListEntry entry(GpuControlListEntry::GetEntryFromValue( 1426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) list_item, true, feature_map_, supports_feature_type_all_)); 1427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (entry.get() == NULL) 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (entry->id() > max_entry_id) 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_entry_id = entry->id(); 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entries.push_back(entry); 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Clear(); 14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OsType my_os = GetOsType(); 14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < entries.size(); ++i) { 14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OsType entry_os = entries[i]->GetOsType(); 14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os_filter == GpuControlList::kAllOs || 14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry_os == kOsAny || entry_os == my_os) 1440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entries_.push_back(entries[i]); 14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_entry_id_ = max_entry_id; 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::set<int> GpuControlList::MakeDecision( 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GpuControlList::OsType os, 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string os_version, 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GPUInfo& gpu_info) { 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_entries_.clear(); 1451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<int> features; 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_more_info_ = false; 1454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::set<int> possible_features; 14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (os == kOsAny) 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os = GetOsType(); 1458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (os_version.empty()) 14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) os_version = base::SysInfo::OperatingSystemVersion(); 14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < entries_.size(); ++i) { 1462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (entries_[i]->Contains(os, os_version, gpu_info)) { 1463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!entries_[i]->disabled()) { 14644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (control_list_logging_enabled_) 14654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) entries_[i]->LogControlListMatch(control_list_logging_name_); 1466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MergeFeatureSets(&possible_features, entries_[i]->features()); 1467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!entries_[i]->NeedsMoreInfo(gpu_info)) 1468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MergeFeatureSets(&features, entries_[i]->features()); 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) active_entries_.push_back(entries_[i]); 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (possible_features.size() > features.size()) 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) needs_more_info_ = true; 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return features; 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuControlList::GetDecisionEntries( 14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<uint32>* entry_ids, bool disabled) const { 14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(entry_ids); 14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry_ids->clear(); 14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < active_entries_.size(); ++i) { 14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (disabled == active_entries_[i]->disabled()) 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry_ids->push_back(active_entries_[i]->id()); 14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1490a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void GpuControlList::GetReasons(base::ListValue* problem_list, 1491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& tag) const { 14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(problem_list); 14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < active_entries_.size(); ++i) { 1494868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GpuControlListEntry* entry = active_entries_[i].get(); 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (entry->disabled()) 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* problem = new base::DictionaryValue(); 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) problem->SetString("description", entry->description()); 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ListValue* cr_bugs = new base::ListValue(); 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t j = 0; j < entry->cr_bugs().size(); ++j) 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cr_bugs->Append(new base::FundamentalValue(entry->cr_bugs()[j])); 15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) problem->Set("crBugs", cr_bugs); 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ListValue* webkit_bugs = new base::ListValue(); 15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t j = 0; j < entry->webkit_bugs().size(); ++j) { 15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webkit_bugs->Append(new base::FundamentalValue(entry->webkit_bugs()[j])); 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) problem->Set("webkitBugs", webkit_bugs); 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ListValue* features = new base::ListValue(); 1513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) entry->GetFeatureNames(features, feature_map_, supports_feature_type_all_); 1514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) problem->Set("affectedGpuSettings", features); 1515a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1516a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(tag == "workarounds" || tag == "disabledFeatures"); 1517a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) problem->SetString("tag", tag); 1518a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) problem_list->Append(problem); 15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)size_t GpuControlList::num_entries() const { 1524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return entries_.size(); 15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)uint32 GpuControlList::max_entry_id() const { 15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return max_entry_id_; 15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string GpuControlList::version() const { 15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return version_; 15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::OsType GpuControlList::GetOsType() { 15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsChromeOS; 15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_WIN) 15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsWin; 15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_ANDROID) 15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsAndroid; 15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_LINUX) || defined(OS_OPENBSD) 15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsLinux; 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_MACOSX) 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsMacosx; 15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kOsUnknown; 15482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void GpuControlList::Clear() { 1552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) entries_.clear(); 15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) active_entries_.clear(); 15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) max_entry_id_ = 0; 15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GpuControlList::NumericOp GpuControlList::StringToNumericOp( 15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& op) { 15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == "=") 15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kEQ; 15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == "<") 15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kLT; 15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == "<=") 15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kLE; 15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == ">") 15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kGT; 15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == ">=") 15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kGE; 15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == "any") 15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kAny; 15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (op == "between") 15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kBetween; 15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kUnknown; 15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GpuControlList::AddSupportedFeature( 15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& feature_name, int feature_id) { 15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) feature_map_[feature_name] = feature_id; 15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void GpuControlList::set_supports_feature_type_all(bool supported) { 1583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) supports_feature_type_all_ = supported; 1584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 158690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace gpu 15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1588