1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "gpu/config/gpu_util.h" 6 7#include <vector> 8 9#include "base/command_line.h" 10#include "base/logging.h" 11#include "base/strings/string_number_conversions.h" 12#include "base/strings/string_split.h" 13#include "gpu/command_buffer/service/gpu_switches.h" 14#include "gpu/config/gpu_control_list_jsons.h" 15#include "gpu/config/gpu_driver_bug_list.h" 16#include "gpu/config/gpu_info_collector.h" 17#include "ui/gl/gl_switches.h" 18 19namespace gpu { 20 21namespace { 22 23// Combine the integers into a string, seperated by ','. 24std::string IntSetToString(const std::set<int>& list) { 25 std::string rt; 26 for (std::set<int>::const_iterator it = list.begin(); 27 it != list.end(); ++it) { 28 if (!rt.empty()) 29 rt += ","; 30 rt += base::IntToString(*it); 31 } 32 return rt; 33} 34 35void StringToIntSet(const std::string& str, std::set<int>* list) { 36 DCHECK(list); 37 std::vector<std::string> pieces; 38 base::SplitString(str, ',', &pieces); 39 for (size_t i = 0; i < pieces.size(); ++i) { 40 int number = 0; 41 bool succeed = base::StringToInt(pieces[i], &number); 42 DCHECK(succeed); 43 list->insert(number); 44 } 45} 46 47} // namespace anonymous 48 49void MergeFeatureSets(std::set<int>* dst, const std::set<int>& src) { 50 DCHECK(dst); 51 if (src.empty()) 52 return; 53 dst->insert(src.begin(), src.end()); 54} 55 56void ApplyGpuDriverBugWorkarounds(CommandLine* command_line) { 57 GPUInfo gpu_info; 58 CollectBasicGraphicsInfo(&gpu_info); 59 60 ApplyGpuDriverBugWorkarounds(gpu_info, command_line); 61} 62 63void ApplyGpuDriverBugWorkarounds( 64 const GPUInfo& gpu_info, CommandLine* command_line) { 65 scoped_ptr<GpuDriverBugList> list(GpuDriverBugList::Create()); 66 list->LoadList(kGpuDriverBugListJson, 67 GpuControlList::kCurrentOsOnly); 68 std::set<int> workarounds = list->MakeDecision( 69 GpuControlList::kOsAny, std::string(), gpu_info); 70 GpuDriverBugList::AppendWorkaroundsFromCommandLine( 71 &workarounds, *command_line); 72 if (!workarounds.empty()) { 73 command_line->AppendSwitchASCII(switches::kGpuDriverBugWorkarounds, 74 IntSetToString(workarounds)); 75 } 76} 77 78void StringToFeatureSet( 79 const std::string& str, std::set<int>* feature_set) { 80 StringToIntSet(str, feature_set); 81} 82 83} // namespace gpu 84