gpu_test_config.cc 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  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. #include "gpu/config/gpu_test_config.h"
  5. #include <stddef.h>
  6. #include <stdint.h>
  7. #include "base/command_line.h"
  8. #include "base/logging.h"
  9. #include "base/system/sys_info.h"
  10. #include "build/build_config.h"
  11. #include "build/chromeos_buildflags.h"
  12. #include "gpu/config/gpu_info.h"
  13. #include "gpu/config/gpu_info_collector.h"
  14. #include "gpu/config/gpu_test_expectations_parser.h"
  15. #include "ui/gl/gl_utils.h"
  16. #if BUILDFLAG(IS_WIN)
  17. #include "base/win/windows_version.h"
  18. #endif
  19. namespace gpu {
  20. namespace {
  21. GPUTestConfig::OS GetCurrentOS() {
  22. #if BUILDFLAG(IS_CHROMEOS_ASH)
  23. return GPUTestConfig::kOsChromeOS;
  24. #elif (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)) || \
  25. BUILDFLAG(IS_OPENBSD)
  26. return GPUTestConfig::kOsLinux;
  27. #elif BUILDFLAG(IS_WIN)
  28. int32_t major_version = 0;
  29. int32_t minor_version = 0;
  30. int32_t bugfix_version = 0;
  31. base::SysInfo::OperatingSystemVersionNumbers(
  32. &major_version, &minor_version, &bugfix_version);
  33. if (major_version == 5)
  34. return GPUTestConfig::kOsWinXP;
  35. if (major_version == 6 && minor_version == 0)
  36. return GPUTestConfig::kOsWinVista;
  37. if (major_version == 6 && minor_version == 1)
  38. return GPUTestConfig::kOsWin7;
  39. if (major_version == 6 && (minor_version == 2 || minor_version == 3))
  40. return GPUTestConfig::kOsWin8;
  41. if (major_version == 10)
  42. return GPUTestConfig::kOsWin10;
  43. return GPUTestConfig::kOsUnknown;
  44. #elif BUILDFLAG(IS_MAC)
  45. int32_t major_version = 0;
  46. int32_t minor_version = 0;
  47. int32_t bugfix_version = 0;
  48. base::SysInfo::OperatingSystemVersionNumbers(
  49. &major_version, &minor_version, &bugfix_version);
  50. switch (major_version) {
  51. case 10:
  52. switch (minor_version) {
  53. case 5:
  54. return GPUTestConfig::kOsMacLeopard;
  55. case 6:
  56. return GPUTestConfig::kOsMacSnowLeopard;
  57. case 7:
  58. return GPUTestConfig::kOsMacLion;
  59. case 8:
  60. return GPUTestConfig::kOsMacMountainLion;
  61. case 9:
  62. return GPUTestConfig::kOsMacMavericks;
  63. case 10:
  64. return GPUTestConfig::kOsMacYosemite;
  65. case 11:
  66. return GPUTestConfig::kOsMacElCapitan;
  67. case 12:
  68. return GPUTestConfig::kOsMacSierra;
  69. case 13:
  70. return GPUTestConfig::kOsMacHighSierra;
  71. case 14:
  72. return GPUTestConfig::kOsMacMojave;
  73. case 15:
  74. return GPUTestConfig::kOsMacCatalina;
  75. }
  76. break;
  77. case 11:
  78. return GPUTestConfig::kOsMacBigSur;
  79. case 12:
  80. return GPUTestConfig::kOsMacMonterey;
  81. }
  82. return GPUTestConfig::kOsUnknown;
  83. #elif BUILDFLAG(IS_ANDROID)
  84. return GPUTestConfig::kOsAndroid;
  85. #elif BUILDFLAG(IS_FUCHSIA)
  86. return GPUTestConfig::kOsFuchsia;
  87. #else
  88. #error "unknown os"
  89. #endif
  90. }
  91. } // namespace anonymous
  92. GPUTestConfig::GPUTestConfig()
  93. : os_(kOsUnknown),
  94. gpu_device_id_(0),
  95. build_type_(kBuildTypeUnknown),
  96. api_(kAPIUnknown),
  97. command_decoder_(kCommandDecoderUnknown) {}
  98. GPUTestConfig::GPUTestConfig(const GPUTestConfig& other) = default;
  99. GPUTestConfig::~GPUTestConfig() = default;
  100. void GPUTestConfig::set_os(int32_t os) {
  101. DCHECK_EQ(0, os & ~(kOsAndroid | kOsWin | kOsMac | kOsLinux | kOsChromeOS |
  102. kOsFuchsia));
  103. os_ = os;
  104. }
  105. void GPUTestConfig::AddGPUVendor(uint32_t gpu_vendor) {
  106. DCHECK_NE(0u, gpu_vendor);
  107. for (size_t i = 0; i < gpu_vendor_.size(); ++i)
  108. DCHECK_NE(gpu_vendor_[i], gpu_vendor);
  109. gpu_vendor_.push_back(gpu_vendor);
  110. }
  111. void GPUTestConfig::set_gpu_device_id(uint32_t id) {
  112. gpu_device_id_ = id;
  113. }
  114. void GPUTestConfig::set_build_type(int32_t build_type) {
  115. DCHECK_EQ(0, build_type & ~(kBuildTypeRelease | kBuildTypeDebug));
  116. build_type_ = build_type;
  117. }
  118. void GPUTestConfig::set_api(int32_t api) {
  119. DCHECK_EQ(0, api & ~(kAPID3D9 | kAPID3D11 | kAPIGLDesktop | kAPIGLES));
  120. api_ = api;
  121. }
  122. void GPUTestConfig::set_command_decoder(int32_t command_decoder) {
  123. DCHECK_EQ(0, command_decoder &
  124. ~(kCommandDecoderPassthrough | kCommandDecoderValidating));
  125. command_decoder_ = command_decoder;
  126. }
  127. bool GPUTestConfig::IsValid() const {
  128. if (gpu_device_id_ != 0 && (gpu_vendor_.size() != 1 || gpu_vendor_[0] == 0))
  129. return false;
  130. return true;
  131. }
  132. bool GPUTestConfig::OverlapsWith(const GPUTestConfig& config) const {
  133. DCHECK(IsValid());
  134. DCHECK(config.IsValid());
  135. if (config.os_ != kOsUnknown && os_ != kOsUnknown &&
  136. (os_ & config.os_) == 0)
  137. return false;
  138. if (config.gpu_vendor_.size() > 0 && gpu_vendor_.size() > 0) {
  139. bool shared = false;
  140. for (size_t i = 0; i < config.gpu_vendor_.size() && !shared; ++i) {
  141. for (size_t j = 0; j < gpu_vendor_.size(); ++j) {
  142. if (config.gpu_vendor_[i] == gpu_vendor_[j]) {
  143. shared = true;
  144. break;
  145. }
  146. }
  147. }
  148. if (!shared)
  149. return false;
  150. }
  151. if (config.gpu_device_id_ != 0 && gpu_device_id_ != 0 &&
  152. gpu_device_id_ != config.gpu_device_id_)
  153. return false;
  154. if (config.build_type_ != kBuildTypeUnknown &&
  155. build_type_ != kBuildTypeUnknown &&
  156. (build_type_ & config.build_type_) == 0)
  157. return false;
  158. if (config.api() != kAPIUnknown && api_ != kAPIUnknown && api_ != config.api_)
  159. return false;
  160. return true;
  161. }
  162. void GPUTestConfig::ClearGPUVendor() {
  163. gpu_vendor_.clear();
  164. }
  165. GPUTestBotConfig::~GPUTestBotConfig() = default;
  166. void GPUTestBotConfig::AddGPUVendor(uint32_t gpu_vendor) {
  167. DCHECK_EQ(0u, GPUTestConfig::gpu_vendor().size());
  168. GPUTestConfig::AddGPUVendor(gpu_vendor);
  169. }
  170. bool GPUTestBotConfig::SetGPUInfo(const GPUInfo& gpu_info) {
  171. if (gpu_info.gpu.vendor_id == 0)
  172. return false;
  173. #if !BUILDFLAG(IS_MAC)
  174. // ARM-based Mac GPUs do not have valid PCI device IDs.
  175. // https://crbug.com/1110421
  176. if (gpu_info.gpu.device_id == 0)
  177. return false;
  178. #endif
  179. ClearGPUVendor();
  180. AddGPUVendor(gpu_info.gpu.vendor_id);
  181. set_gpu_device_id(gpu_info.gpu.device_id);
  182. if (gpu_info.passthrough_cmd_decoder) {
  183. set_command_decoder(kCommandDecoderPassthrough);
  184. } else {
  185. set_command_decoder(kCommandDecoderValidating);
  186. }
  187. return true;
  188. }
  189. bool GPUTestBotConfig::IsValid() const {
  190. switch (os()) {
  191. case kOsWinXP:
  192. case kOsWinVista:
  193. case kOsWin7:
  194. case kOsWin8:
  195. case kOsWin10:
  196. case kOsMacLeopard:
  197. case kOsMacSnowLeopard:
  198. case kOsMacLion:
  199. case kOsMacMountainLion:
  200. case kOsMacMavericks:
  201. case kOsMacYosemite:
  202. case kOsMacElCapitan:
  203. case kOsMacSierra:
  204. case kOsMacHighSierra:
  205. case kOsMacMojave:
  206. case kOsMacCatalina:
  207. case kOsMacBigSur:
  208. case kOsMacMonterey:
  209. case kOsLinux:
  210. case kOsChromeOS:
  211. case kOsAndroid:
  212. case kOsFuchsia:
  213. break;
  214. default:
  215. return false;
  216. }
  217. if (gpu_vendor().size() != 1 || gpu_vendor()[0] == 0)
  218. return false;
  219. if (!(os() & gpu::GPUTestConfig::kOsMac)) {
  220. // ARM-based Mac GPUs do not have valid PCI device IDs.
  221. // https://crbug.com/1110421
  222. if (gpu_device_id() == 0)
  223. return false;
  224. }
  225. switch (build_type()) {
  226. case kBuildTypeRelease:
  227. case kBuildTypeDebug:
  228. break;
  229. default:
  230. return false;
  231. }
  232. return true;
  233. }
  234. bool GPUTestBotConfig::Matches(const GPUTestConfig& config) const {
  235. DCHECK(IsValid());
  236. DCHECK(config.IsValid());
  237. if (config.os() != kOsUnknown && (os() & config.os()) == 0)
  238. return false;
  239. if (config.gpu_vendor().size() > 0) {
  240. bool contained = false;
  241. for (size_t i = 0; i < config.gpu_vendor().size(); ++i) {
  242. if (config.gpu_vendor()[i] == gpu_vendor()[0]) {
  243. contained = true;
  244. break;
  245. }
  246. }
  247. if (!contained)
  248. return false;
  249. }
  250. if (config.gpu_device_id() != 0 &&
  251. gpu_device_id() != config.gpu_device_id())
  252. return false;
  253. if (config.build_type() != kBuildTypeUnknown &&
  254. (build_type() & config.build_type()) == 0)
  255. return false;
  256. if (config.api() != 0 && (api() & config.api()) == 0)
  257. return false;
  258. if (config.command_decoder() != 0 &&
  259. command_decoder() != config.command_decoder())
  260. return false;
  261. return true;
  262. }
  263. bool GPUTestBotConfig::Matches(const std::string& config_data) const {
  264. GPUTestExpectationsParser parser;
  265. GPUTestConfig config;
  266. if (!parser.ParseConfig(config_data, &config))
  267. return false;
  268. return Matches(config);
  269. }
  270. bool GPUTestBotConfig::LoadCurrentConfig(const GPUInfo* gpu_info) {
  271. bool rt;
  272. if (!gpu_info) {
  273. #if BUILDFLAG(IS_ANDROID)
  274. // TODO(zmo): Implement this.
  275. rt = false;
  276. #else
  277. GPUInfo my_gpu_info;
  278. if (!CollectBasicGraphicsInfo(base::CommandLine::ForCurrentProcess(),
  279. &my_gpu_info)) {
  280. LOG(ERROR) << "Fail to identify GPU";
  281. rt = false;
  282. } else {
  283. rt = SetGPUInfo(my_gpu_info);
  284. }
  285. #endif // BUILDFLAG(IS_ANDROID)
  286. } else {
  287. rt = SetGPUInfo(*gpu_info);
  288. }
  289. set_os(GetCurrentOS());
  290. if (os() == kOsUnknown) {
  291. LOG(ERROR) << "Unknown OS";
  292. rt = false;
  293. }
  294. #if defined(NDEBUG)
  295. set_build_type(kBuildTypeRelease);
  296. #else
  297. set_build_type(kBuildTypeDebug);
  298. #endif
  299. return rt;
  300. }
  301. // static
  302. bool GPUTestBotConfig::CurrentConfigMatches(const std::string& config_data) {
  303. GPUTestBotConfig my_config;
  304. if (!my_config.LoadCurrentConfig(nullptr))
  305. return false;
  306. return my_config.Matches(config_data);
  307. }
  308. // static
  309. bool GPUTestBotConfig::CurrentConfigMatches(
  310. const std::vector<std::string>& configs) {
  311. GPUTestBotConfig my_config;
  312. if (!my_config.LoadCurrentConfig(nullptr))
  313. return false;
  314. for (size_t i = 0 ; i < configs.size(); ++i) {
  315. if (my_config.Matches(configs[i]))
  316. return true;
  317. }
  318. return false;
  319. }
  320. // static
  321. bool GPUTestBotConfig::GpuBlocklistedOnBot() {
  322. return false;
  323. }
  324. } // namespace gpu