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_test_config.h" 6 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" 12 13 namespace gpu { 14 15 namespace { 16 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; 22 #elif defined(OS_WIN) 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) { 44 case 5: 45 return GPUTestConfig::kOsMacLeopard; 46 case 6: 47 return GPUTestConfig::kOsMacSnowLeopard; 48 case 7: 49 return GPUTestConfig::kOsMacLion; 50 case 8: 51 return GPUTestConfig::kOsMacMountainLion; 52 } 53 } 54 #elif defined(OS_ANDROID) 55 return GPUTestConfig::kOsAndroid; 56 #endif 57 return GPUTestConfig::kOsUnknown; 58 } 59 60 } // namespace anonymous 61 62 GPUTestConfig::GPUTestConfig() 63 : validate_gpu_info_(true), 64 os_(kOsUnknown), 65 gpu_device_id_(0), 66 build_type_(kBuildTypeUnknown) { 67 } 68 69 GPUTestConfig::~GPUTestConfig() { 70 } 71 72 void GPUTestConfig::set_os(int32 os) { 73 DCHECK_EQ(0, os & ~(kOsAndroid | kOsWin | kOsMac | kOsLinux | kOsChromeOS)); 74 os_ = os; 75 } 76 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); 82 } 83 84 void GPUTestConfig::set_gpu_device_id(uint32 id) { 85 gpu_device_id_ = id; 86 } 87 88 void GPUTestConfig::set_build_type(int32 build_type) { 89 DCHECK_EQ(0, build_type & ~(kBuildTypeRelease | kBuildTypeDebug)); 90 build_type_ = build_type; 91 } 92 93 bool GPUTestConfig::IsValid() const { 94 if (!validate_gpu_info_) 95 return true; 96 if (gpu_device_id_ != 0 && (gpu_vendor_.size() != 1 || gpu_vendor_[0] == 0)) 97 return false; 98 return true; 99 } 100 101 bool GPUTestConfig::OverlapsWith(const GPUTestConfig& config) const { 102 DCHECK(IsValid()); 103 DCHECK(config.IsValid()); 104 if (config.os_ != kOsUnknown && os_ != kOsUnknown && 105 (os_ & config.os_) == 0) 106 return false; 107 if (config.gpu_vendor_.size() > 0 && gpu_vendor_.size() > 0) { 108 bool shared = false; 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]) { 112 shared = true; 113 break; 114 } 115 } 116 } 117 if (!shared) 118 return false; 119 } 120 if (config.gpu_device_id_ != 0 && gpu_device_id_ != 0 && 121 gpu_device_id_ != config.gpu_device_id_) 122 return false; 123 if (config.build_type_ != kBuildTypeUnknown && 124 build_type_ != kBuildTypeUnknown && 125 (build_type_ & config.build_type_) == 0) 126 return false; 127 return true; 128 } 129 130 void GPUTestConfig::DisableGPUInfoValidation() { 131 validate_gpu_info_ = false; 132 } 133 134 void GPUTestConfig::ClearGPUVendor() { 135 gpu_vendor_.clear(); 136 } 137 138 GPUTestBotConfig::~GPUTestBotConfig() { 139 } 140 141 void GPUTestBotConfig::AddGPUVendor(uint32 gpu_vendor) { 142 DCHECK_EQ(0u, GPUTestConfig::gpu_vendor().size()); 143 GPUTestConfig::AddGPUVendor(gpu_vendor); 144 } 145 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) 149 return false; 150 ClearGPUVendor(); 151 AddGPUVendor(gpu_info.gpu.vendor_id); 152 set_gpu_device_id(gpu_info.gpu.device_id); 153 return true; 154 } 155 156 bool GPUTestBotConfig::IsValid() const { 157 switch (os()) { 158 case kOsWinXP: 159 case kOsWinVista: 160 case kOsWin7: 161 case kOsWin8: 162 case kOsMacLeopard: 163 case kOsMacSnowLeopard: 164 case kOsMacLion: 165 case kOsMacMountainLion: 166 case kOsLinux: 167 case kOsChromeOS: 168 case kOsAndroid: 169 break; 170 default: 171 return false; 172 } 173 if (validate_gpu_info_) { 174 if (gpu_vendor().size() != 1 || gpu_vendor()[0] == 0) 175 return false; 176 if (gpu_device_id() == 0) 177 return false; 178 } 179 switch (build_type()) { 180 case kBuildTypeRelease: 181 case kBuildTypeDebug: 182 break; 183 default: 184 return false; 185 } 186 return true; 187 } 188 189 bool GPUTestBotConfig::Matches(const GPUTestConfig& config) const { 190 DCHECK(IsValid()); 191 DCHECK(config.IsValid()); 192 if (config.os() != kOsUnknown && (os() & config.os()) == 0) 193 return false; 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]) { 198 contained = true; 199 break; 200 } 201 } 202 if (!contained) 203 return false; 204 } 205 if (config.gpu_device_id() != 0 && 206 gpu_device_id() != config.gpu_device_id()) 207 return false; 208 if (config.build_type() != kBuildTypeUnknown && 209 (build_type() & config.build_type()) == 0) 210 return false; 211 return true; 212 } 213 214 bool GPUTestBotConfig::Matches(const std::string& config_data) const { 215 GPUTestExpectationsParser parser; 216 GPUTestConfig config; 217 218 if (!parser.ParseConfig(config_data, &config)) 219 return false; 220 return Matches(config); 221 } 222 223 bool GPUTestBotConfig::LoadCurrentConfig(const GPUInfo* gpu_info) { 224 bool rt; 225 if (gpu_info == NULL) { 226 GPUInfo my_gpu_info; 227 GpuIDResult result; 228 result = CollectGpuID(&my_gpu_info.gpu.vendor_id, 229 &my_gpu_info.gpu.device_id); 230 if (result == kGpuIDNotSupported) { 231 DisableGPUInfoValidation(); 232 rt = true; 233 } else { 234 rt = SetGPUInfo(my_gpu_info); 235 } 236 } else { 237 rt = SetGPUInfo(*gpu_info); 238 } 239 set_os(GetCurrentOS()); 240 if (os() == kOsUnknown) 241 rt = false; 242 #if defined(NDEBUG) 243 set_build_type(kBuildTypeRelease); 244 #else 245 set_build_type(kBuildTypeDebug); 246 #endif 247 return rt; 248 } 249 250 // static 251 bool GPUTestBotConfig::CurrentConfigMatches(const std::string& config_data) { 252 GPUTestBotConfig my_config; 253 if (!my_config.LoadCurrentConfig(NULL)) 254 return false; 255 return my_config.Matches(config_data); 256 } 257 258 // static 259 bool GPUTestBotConfig::CurrentConfigMatches( 260 const std::vector<std::string>& configs) { 261 GPUTestBotConfig my_config; 262 if (!my_config.LoadCurrentConfig(NULL)) 263 return false; 264 for (size_t i = 0 ; i < configs.size(); ++i) { 265 if (my_config.Matches(configs[i])) 266 return true; 267 } 268 return false; 269 } 270 271 } // namespace gpu 272 273