• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
19 namespace gpu {
20 
21 namespace {
22 
23 // Combine the integers into a string, seperated by ','.
IntSetToString(const std::set<int> & list)24 std::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 
StringToIntSet(const std::string & str,std::set<int> * list)35 void 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 
MergeFeatureSets(std::set<int> * dst,const std::set<int> & src)49 void 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 
ApplyGpuDriverBugWorkarounds(CommandLine * command_line)56 void ApplyGpuDriverBugWorkarounds(CommandLine* command_line) {
57   GPUInfo gpu_info;
58   CollectBasicGraphicsInfo(&gpu_info);
59 
60   ApplyGpuDriverBugWorkarounds(gpu_info, command_line);
61 }
62 
ApplyGpuDriverBugWorkarounds(const GPUInfo & gpu_info,CommandLine * command_line)63 void 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 
StringToFeatureSet(const std::string & str,std::set<int> * feature_set)78 void StringToFeatureSet(
79     const std::string& str, std::set<int>* feature_set) {
80   StringToIntSet(str, feature_set);
81 }
82 
83 }  // namespace gpu
84