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.
5 #include "gpu/config/gpu_test_config.h"
7 #include "base/logging.h"
8 #include "base/sys_info.h"
9 #include "gpu/config/gpu_info.h"
10 #include "gpu/config/gpu_info_collector.h"
11 #include "gpu/config/gpu_test_expectations_parser.h"
17 GPUTestConfig::OS
GetCurrentOS() {
18 #if defined(OS_CHROMEOS)
19 return GPUTestConfig::kOsChromeOS
;
20 #elif defined(OS_LINUX) || defined(OS_OPENBSD)
21 return GPUTestConfig::kOsLinux
;
23 int32 major_version
= 0;
24 int32 minor_version
= 0;
25 int32 bugfix_version
= 0;
26 base::SysInfo::OperatingSystemVersionNumbers(
27 &major_version
, &minor_version
, &bugfix_version
);
28 if (major_version
== 5)
29 return GPUTestConfig::kOsWinXP
;
30 if (major_version
== 6 && minor_version
== 0)
31 return GPUTestConfig::kOsWinVista
;
32 if (major_version
== 6 && minor_version
== 1)
33 return GPUTestConfig::kOsWin7
;
34 if (major_version
== 6 && minor_version
== 2)
35 return GPUTestConfig::kOsWin8
;
36 #elif defined(OS_MACOSX)
37 int32 major_version
= 0;
38 int32 minor_version
= 0;
39 int32 bugfix_version
= 0;
40 base::SysInfo::OperatingSystemVersionNumbers(
41 &major_version
, &minor_version
, &bugfix_version
);
42 if (major_version
== 10) {
43 switch (minor_version
) {
45 return GPUTestConfig::kOsMacLeopard
;
47 return GPUTestConfig::kOsMacSnowLeopard
;
49 return GPUTestConfig::kOsMacLion
;
51 return GPUTestConfig::kOsMacMountainLion
;
54 #elif defined(OS_ANDROID)
55 return GPUTestConfig::kOsAndroid
;
57 return GPUTestConfig::kOsUnknown
;
60 } // namespace anonymous
62 GPUTestConfig::GPUTestConfig()
63 : validate_gpu_info_(true),
66 build_type_(kBuildTypeUnknown
) {
69 GPUTestConfig::~GPUTestConfig() {
72 void GPUTestConfig::set_os(int32 os
) {
73 DCHECK_EQ(0, os
& ~(kOsAndroid
| kOsWin
| kOsMac
| kOsLinux
| kOsChromeOS
));
77 void GPUTestConfig::AddGPUVendor(uint32 gpu_vendor
) {
78 DCHECK_NE(0u, gpu_vendor
);
79 for (size_t i
= 0; i
< gpu_vendor_
.size(); ++i
)
80 DCHECK_NE(gpu_vendor_
[i
], gpu_vendor
);
81 gpu_vendor_
.push_back(gpu_vendor
);
84 void GPUTestConfig::set_gpu_device_id(uint32 id
) {
88 void GPUTestConfig::set_build_type(int32 build_type
) {
89 DCHECK_EQ(0, build_type
& ~(kBuildTypeRelease
| kBuildTypeDebug
));
90 build_type_
= build_type
;
93 bool GPUTestConfig::IsValid() const {
94 if (!validate_gpu_info_
)
96 if (gpu_device_id_
!= 0 && (gpu_vendor_
.size() != 1 || gpu_vendor_
[0] == 0))
101 bool GPUTestConfig::OverlapsWith(const GPUTestConfig
& config
) const {
103 DCHECK(config
.IsValid());
104 if (config
.os_
!= kOsUnknown
&& os_
!= kOsUnknown
&&
105 (os_
& config
.os_
) == 0)
107 if (config
.gpu_vendor_
.size() > 0 && gpu_vendor_
.size() > 0) {
109 for (size_t i
= 0; i
< config
.gpu_vendor_
.size() && !shared
; ++i
) {
110 for (size_t j
= 0; j
< gpu_vendor_
.size(); ++j
) {
111 if (config
.gpu_vendor_
[i
] == gpu_vendor_
[j
]) {
120 if (config
.gpu_device_id_
!= 0 && gpu_device_id_
!= 0 &&
121 gpu_device_id_
!= config
.gpu_device_id_
)
123 if (config
.build_type_
!= kBuildTypeUnknown
&&
124 build_type_
!= kBuildTypeUnknown
&&
125 (build_type_
& config
.build_type_
) == 0)
130 void GPUTestConfig::DisableGPUInfoValidation() {
131 validate_gpu_info_
= false;
134 void GPUTestConfig::ClearGPUVendor() {
138 GPUTestBotConfig::~GPUTestBotConfig() {
141 void GPUTestBotConfig::AddGPUVendor(uint32 gpu_vendor
) {
142 DCHECK_EQ(0u, GPUTestConfig::gpu_vendor().size());
143 GPUTestConfig::AddGPUVendor(gpu_vendor
);
146 bool GPUTestBotConfig::SetGPUInfo(const GPUInfo
& gpu_info
) {
147 DCHECK(validate_gpu_info_
);
148 if (gpu_info
.gpu
.device_id
== 0 || gpu_info
.gpu
.vendor_id
== 0)
151 AddGPUVendor(gpu_info
.gpu
.vendor_id
);
152 set_gpu_device_id(gpu_info
.gpu
.device_id
);
156 bool GPUTestBotConfig::IsValid() const {
163 case kOsMacSnowLeopard
:
165 case kOsMacMountainLion
:
173 if (validate_gpu_info_
) {
174 if (gpu_vendor().size() != 1 || gpu_vendor()[0] == 0)
176 if (gpu_device_id() == 0)
179 switch (build_type()) {
180 case kBuildTypeRelease
:
181 case kBuildTypeDebug
:
189 bool GPUTestBotConfig::Matches(const GPUTestConfig
& config
) const {
191 DCHECK(config
.IsValid());
192 if (config
.os() != kOsUnknown
&& (os() & config
.os()) == 0)
194 if (config
.gpu_vendor().size() > 0) {
195 bool contained
= false;
196 for (size_t i
= 0; i
< config
.gpu_vendor().size(); ++i
) {
197 if (config
.gpu_vendor()[i
] == gpu_vendor()[0]) {
205 if (config
.gpu_device_id() != 0 &&
206 gpu_device_id() != config
.gpu_device_id())
208 if (config
.build_type() != kBuildTypeUnknown
&&
209 (build_type() & config
.build_type()) == 0)
214 bool GPUTestBotConfig::Matches(const std::string
& config_data
) const {
215 GPUTestExpectationsParser parser
;
216 GPUTestConfig config
;
218 if (!parser
.ParseConfig(config_data
, &config
))
220 return Matches(config
);
223 bool GPUTestBotConfig::LoadCurrentConfig(const GPUInfo
* gpu_info
) {
225 if (gpu_info
== NULL
) {
228 result
= CollectGpuID(&my_gpu_info
.gpu
.vendor_id
,
229 &my_gpu_info
.gpu
.device_id
);
230 if (result
== kGpuIDNotSupported
) {
231 DisableGPUInfoValidation();
234 rt
= SetGPUInfo(my_gpu_info
);
237 rt
= SetGPUInfo(*gpu_info
);
239 set_os(GetCurrentOS());
240 if (os() == kOsUnknown
)
243 set_build_type(kBuildTypeRelease
);
245 set_build_type(kBuildTypeDebug
);
251 bool GPUTestBotConfig::CurrentConfigMatches(const std::string
& config_data
) {
252 GPUTestBotConfig my_config
;
253 if (!my_config
.LoadCurrentConfig(NULL
))
255 return my_config
.Matches(config_data
);
259 bool GPUTestBotConfig::CurrentConfigMatches(
260 const std::vector
<std::string
>& configs
) {
261 GPUTestBotConfig my_config
;
262 if (!my_config
.LoadCurrentConfig(NULL
))
264 for (size_t i
= 0 ; i
< configs
.size(); ++i
) {
265 if (my_config
.Matches(configs
[i
]))