summaryrefslogtreecommitdiffstats
path: root/gpu/config/gpu_driver_bug_list.cc
blob: a091c4218f711be9dd6eb1568fe685033763f697 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "gpu/config/gpu_driver_bug_list.h"

#include "base/basictypes.h"
#include "base/logging.h"
#include "gpu/config/gpu_driver_bug_workaround_type.h"

namespace gpu {

namespace {

struct GpuDriverBugWorkaroundInfo {
  GpuDriverBugWorkaroundType type;
  const char* name;
};

const GpuDriverBugWorkaroundInfo kFeatureList[] = {
#define GPU_OP(type, name) { type, #name },
  GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP)
#undef GPU_OP
};

}  // namespace anonymous

GpuDriverBugList::GpuDriverBugList()
    : GpuControlList() {
}

GpuDriverBugList::~GpuDriverBugList() {
}

// static
GpuDriverBugList* GpuDriverBugList::Create() {
  GpuDriverBugList* list = new GpuDriverBugList();

  DCHECK_EQ(static_cast<int>(arraysize(kFeatureList)),
            NUMBER_OF_GPU_DRIVER_BUG_WORKAROUND_TYPES);
  for (int i = 0; i < NUMBER_OF_GPU_DRIVER_BUG_WORKAROUND_TYPES; ++i) {
    list->AddSupportedFeature(kFeatureList[i].name,
                              kFeatureList[i].type);
  }
  return list;
}

std::string GpuDriverBugWorkaroundTypeToString(
    GpuDriverBugWorkaroundType type) {
  if (type < NUMBER_OF_GPU_DRIVER_BUG_WORKAROUND_TYPES)
    return kFeatureList[type].name;
  else
    return "unknown";
}

// static
void GpuDriverBugList::AppendWorkaroundsFromCommandLine(
    std::set<int>* workarounds, const CommandLine& command_line) {
  DCHECK(workarounds);
  for (int i = 0; i < NUMBER_OF_GPU_DRIVER_BUG_WORKAROUND_TYPES; i++) {
    if (!command_line.HasSwitch(kFeatureList[i].name))
      continue;
    // Removing conflicting workarounds.
    switch (kFeatureList[i].type) {
      case FORCE_DISCRETE_GPU:
        workarounds->erase(FORCE_INTEGRATED_GPU);
        workarounds->insert(FORCE_DISCRETE_GPU);
        break;
      case FORCE_INTEGRATED_GPU:
        workarounds->erase(FORCE_DISCRETE_GPU);
        workarounds->insert(FORCE_INTEGRATED_GPU);
        break;
      case MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_512:
      case MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_1024:
      case MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_4096:
        workarounds->erase(MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_512);
        workarounds->erase(MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_1024);
        workarounds->erase(MAX_CUBE_MAP_TEXTURE_SIZE_LIMIT_4096);
        workarounds->insert(kFeatureList[i].type);
        break;
      default:
        workarounds->insert(kFeatureList[i].type);
        break;
    }
  }
}

}  // namespace gpu