• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2013 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_driver_bug_list.h"
6 
7 #include "base/basictypes.h"
8 #include "base/logging.h"
9 #include "gpu/config/gpu_driver_bug_workaround_type.h"
10 
11 namespace gpu {
12 
13 namespace {
14 
15 struct GpuDriverBugWorkaroundInfo {
16   GpuDriverBugWorkaroundType type;
17   const char* name;
18 };
19 
20 const GpuDriverBugWorkaroundInfo kFeatureList[] = {
21 #define GPU_OP(type, name) { type, #name },
22   GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP)
23 #undef GPU_OP
24 };
25 
26 }  // namespace anonymous
27 
GpuDriverBugList()28 GpuDriverBugList::GpuDriverBugList()
29     : GpuControlList() {
30 }
31 
~GpuDriverBugList()32 GpuDriverBugList::~GpuDriverBugList() {
33 }
34 
35 // static
Create()36 GpuDriverBugList* GpuDriverBugList::Create() {
37   GpuDriverBugList* list = new GpuDriverBugList();
38 
39   DCHECK_EQ(static_cast<int>(arraysize(kFeatureList)),
40             NUMBER_OF_GPU_DRIVER_BUG_WORKAROUND_TYPES);
41   for (int i = 0; i < NUMBER_OF_GPU_DRIVER_BUG_WORKAROUND_TYPES; ++i) {
42     list->AddSupportedFeature(kFeatureList[i].name,
43                               kFeatureList[i].type);
44   }
45   return list;
46 }
47 
GpuDriverBugWorkaroundTypeToString(GpuDriverBugWorkaroundType type)48 std::string GpuDriverBugWorkaroundTypeToString(
49     GpuDriverBugWorkaroundType type) {
50   if (type < NUMBER_OF_GPU_DRIVER_BUG_WORKAROUND_TYPES)
51     return kFeatureList[type].name;
52   else
53     return "unknown";
54 }
55 
56 // static
AppendWorkaroundsFromCommandLine(std::set<int> * workarounds,const CommandLine & command_line)57 void GpuDriverBugList::AppendWorkaroundsFromCommandLine(
58     std::set<int>* workarounds, const CommandLine& command_line) {
59   DCHECK(workarounds);
60   for (int i = 0; i < NUMBER_OF_GPU_DRIVER_BUG_WORKAROUND_TYPES; i++) {
61     if (!command_line.HasSwitch(kFeatureList[i].name))
62       continue;
63     // Removing conflicting workarounds.
64     switch (kFeatureList[i].type) {
65       case FORCE_DISCRETE_GPU:
66         workarounds->erase(FORCE_INTEGRATED_GPU);
67         workarounds->insert(FORCE_DISCRETE_GPU);
68         break;
69       case FORCE_INTEGRATED_GPU:
70         workarounds->erase(FORCE_DISCRETE_GPU);
71         workarounds->insert(FORCE_INTEGRATED_GPU);
72         break;
73       case MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_512:
74       case MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_1024:
75       case MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_4096:
76         workarounds->erase(MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_512);
77         workarounds->erase(MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_1024);
78         workarounds->erase(MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_4096);
79         workarounds->insert(kFeatureList[i].type);
80         break;
81       default:
82         workarounds->insert(kFeatureList[i].type);
83         break;
84     }
85   }
86 }
87 
88 }  // namespace gpu
89 
90