gpu_control_list_entry_unittest.cc 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191
  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. #include <stddef.h>
  5. #include "build/build_config.h"
  6. #include "gpu/config/gpu_control_list.h"
  7. #include "gpu/config/gpu_control_list_testing_data.h"
  8. #include "gpu/config/gpu_info.h"
  9. #include "testing/gtest/include/gtest/gtest.h"
  10. namespace gpu {
  11. namespace {
  12. constexpr auto kOsLinux = GpuControlList::kOsLinux;
  13. constexpr auto kOsMacosx = GpuControlList::kOsMacosx;
  14. constexpr auto kOsWin = GpuControlList::kOsWin;
  15. constexpr auto kOsChromeOS = GpuControlList::kOsChromeOS;
  16. constexpr auto kOsAndroid = GpuControlList::kOsAndroid;
  17. constexpr auto kOsFuchsia = GpuControlList::kOsFuchsia;
  18. constexpr auto kOsAny = GpuControlList::kOsAny;
  19. constexpr GpuControlList::OsType kAllOsType[] = {
  20. kOsMacosx, kOsWin, kOsLinux, kOsChromeOS, kOsAndroid, kOsFuchsia};
  21. } // namespace anonymous
  22. class GpuControlListEntryTest : public testing::Test {
  23. public:
  24. typedef GpuControlList::Entry Entry;
  25. GpuControlListEntryTest() = default;
  26. ~GpuControlListEntryTest() override = default;
  27. const GPUInfo& gpu_info() const {
  28. return gpu_info_;
  29. }
  30. const Entry& GetEntry(size_t index) {
  31. EXPECT_LT(index, kGpuControlListTestingEntryCount);
  32. EXPECT_EQ(index + 1, kGpuControlListTestingEntries[index].id);
  33. return kGpuControlListTestingEntries[index];
  34. }
  35. size_t CountFeature(const Entry& entry, int feature) {
  36. size_t count = 0;
  37. for (size_t ii = 0; ii < entry.feature_size; ++ii) {
  38. if (entry.features[ii] == feature) {
  39. ++count;
  40. }
  41. }
  42. return count;
  43. }
  44. protected:
  45. void SetUp() override {
  46. gpu_info_.gpu.vendor_id = 0x10de;
  47. gpu_info_.gpu.device_id = 0x0640;
  48. gpu_info_.gpu.active = true;
  49. gpu_info_.gpu.driver_vendor = "NVIDIA";
  50. gpu_info_.gpu.driver_version = "1.6.18";
  51. gpu_info_.gl_version = "2.1 NVIDIA-8.24.11 310.90.9b01";
  52. gpu_info_.gl_vendor = "NVIDIA Corporation";
  53. gpu_info_.gl_renderer = "NVIDIA GeForce GT 120 OpenGL Engine";
  54. }
  55. GPUInfo gpu_info_;
  56. };
  57. TEST_F(GpuControlListEntryTest, DetailedEntry) {
  58. const Entry& entry = GetEntry(kGpuControlListEntryTest_DetailedEntry);
  59. EXPECT_EQ(kOsMacosx, entry.conditions.os_type);
  60. EXPECT_STREQ("GpuControlListEntryTest.DetailedEntry", entry.description);
  61. EXPECT_EQ(2u, entry.cr_bug_size);
  62. EXPECT_EQ(1024u, entry.cr_bugs[0]);
  63. EXPECT_EQ(678u, entry.cr_bugs[1]);
  64. EXPECT_EQ(1u, entry.feature_size);
  65. EXPECT_EQ(1u, CountFeature(entry, TEST_FEATURE_0));
  66. EXPECT_FALSE(entry.NeedsMoreInfo(gpu_info(), true));
  67. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.6.4", gpu_info()));
  68. EXPECT_EQ(2u, entry.disabled_extension_size);
  69. EXPECT_STREQ("test_extension1", entry.disabled_extensions[0]);
  70. EXPECT_STREQ("test_extension2", entry.disabled_extensions[1]);
  71. }
  72. TEST_F(GpuControlListEntryTest, VendorOnAllOsEntry) {
  73. const Entry& entry = GetEntry(kGpuControlListEntryTest_VendorOnAllOsEntry);
  74. EXPECT_EQ(kOsAny, entry.conditions.os_type);
  75. for (auto os_type : kAllOsType)
  76. EXPECT_TRUE(entry.Contains(os_type, "10.6", gpu_info()));
  77. }
  78. TEST_F(GpuControlListEntryTest, VendorOnLinuxEntry) {
  79. const Entry& entry = GetEntry(kGpuControlListEntryTest_VendorOnLinuxEntry);
  80. EXPECT_EQ(kOsLinux, entry.conditions.os_type);
  81. const GpuControlList::OsType os_types[] = {kOsMacosx, kOsWin, kOsChromeOS,
  82. kOsAndroid, kOsFuchsia};
  83. for (auto os_type : os_types)
  84. EXPECT_FALSE(entry.Contains(os_type, "10.6", gpu_info()));
  85. EXPECT_TRUE(entry.Contains(kOsLinux, "10.6", gpu_info()));
  86. }
  87. TEST_F(GpuControlListEntryTest, AllExceptNVidiaOnLinuxEntry) {
  88. const Entry& entry =
  89. GetEntry(kGpuControlListEntryTest_AllExceptNVidiaOnLinuxEntry);
  90. EXPECT_EQ(kOsLinux, entry.conditions.os_type);
  91. const GpuControlList::OsType os_type[] = {kOsMacosx, kOsWin, kOsLinux,
  92. kOsChromeOS, kOsAndroid};
  93. for (size_t i = 0; i < std::size(os_type); ++i)
  94. EXPECT_FALSE(entry.Contains(os_type[i], "10.6", gpu_info()));
  95. }
  96. TEST_F(GpuControlListEntryTest, AllExceptIntelOnLinuxEntry) {
  97. const Entry& entry =
  98. GetEntry(kGpuControlListEntryTest_AllExceptIntelOnLinuxEntry);
  99. EXPECT_EQ(kOsLinux, entry.conditions.os_type);
  100. const GpuControlList::OsType os_types[] = {kOsMacosx, kOsWin, kOsChromeOS,
  101. kOsAndroid, kOsFuchsia};
  102. for (auto os_type : os_types)
  103. EXPECT_FALSE(entry.Contains(os_type, "10.6", gpu_info()));
  104. EXPECT_TRUE(entry.Contains(kOsLinux, "10.6", gpu_info()));
  105. }
  106. TEST_F(GpuControlListEntryTest, MultipleDevicesEntry) {
  107. const Entry& entry = GetEntry(kGpuControlListEntryTest_MultipleDevicesEntry);
  108. EXPECT_EQ(kOsAny, entry.conditions.os_type);
  109. for (auto os_type : kAllOsType)
  110. EXPECT_TRUE(entry.Contains(os_type, "10.6", gpu_info()));
  111. }
  112. TEST_F(GpuControlListEntryTest, ChromeOSEntry) {
  113. const Entry& entry = GetEntry(kGpuControlListEntryTest_ChromeOSEntry);
  114. EXPECT_EQ(kOsChromeOS, entry.conditions.os_type);
  115. const GpuControlList::OsType os_types[] = {kOsMacosx, kOsWin, kOsLinux,
  116. kOsAndroid, kOsFuchsia};
  117. for (auto os_type : os_types)
  118. EXPECT_FALSE(entry.Contains(os_type, "10.6", gpu_info()));
  119. EXPECT_TRUE(entry.Contains(kOsChromeOS, "10.6", gpu_info()));
  120. }
  121. TEST_F(GpuControlListEntryTest, GlVersionGLESEntry) {
  122. const Entry& entry = GetEntry(kGpuControlListEntryTest_GlVersionGLESEntry);
  123. GPUInfo gpu_info;
  124. gpu_info.gl_version = "OpenGL ES 3.0 V@66.0 AU@ (CL@)";
  125. EXPECT_TRUE(entry.Contains(kOsAndroid, "4.4.2", gpu_info));
  126. gpu_info.gl_version = "OpenGL ES 3.0V@66.0 AU@ (CL@)";
  127. EXPECT_TRUE(entry.Contains(kOsAndroid, "4.4.2", gpu_info));
  128. gpu_info.gl_version = "OpenGL ES 3.1 V@66.0 AU@ (CL@)";
  129. EXPECT_FALSE(entry.Contains(kOsAndroid, "4.4.2", gpu_info));
  130. gpu_info.gl_version = "3.0 NVIDIA-8.24.11 310.90.9b01";
  131. EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  132. gpu_info.gl_version = "OpenGL ES 3.0 (ANGLE 1.2.0.2450)";
  133. EXPECT_FALSE(entry.Contains(kOsWin, "6.1", gpu_info));
  134. }
  135. TEST_F(GpuControlListEntryTest, GlVersionANGLEEntry) {
  136. const Entry& entry = GetEntry(kGpuControlListEntryTest_GlVersionANGLEEntry);
  137. GPUInfo gpu_info;
  138. gpu_info.gl_version = "OpenGL ES 3.0 V@66.0 AU@ (CL@)";
  139. EXPECT_FALSE(entry.Contains(kOsAndroid, "4.4.2", gpu_info));
  140. gpu_info.gl_version = "3.0 NVIDIA-8.24.11 310.90.9b01";
  141. EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  142. gpu_info.gl_version = "OpenGL ES 3.0 (ANGLE 1.2.0.2450)";
  143. EXPECT_TRUE(entry.Contains(kOsWin, "6.1", gpu_info));
  144. gpu_info.gl_version = "OpenGL ES 2.0 (ANGLE 1.2.0.2450)";
  145. EXPECT_FALSE(entry.Contains(kOsWin, "6.1", gpu_info));
  146. }
  147. TEST_F(GpuControlListEntryTest, GlVersionGLEntry) {
  148. const Entry& entry = GetEntry(kGpuControlListEntryTest_GlVersionGLEntry);
  149. GPUInfo gpu_info;
  150. gpu_info.gl_version = "OpenGL ES 3.0 V@66.0 AU@ (CL@)";
  151. EXPECT_FALSE(entry.Contains(kOsAndroid, "4.4.2", gpu_info));
  152. gpu_info.gl_version = "3.0 NVIDIA-8.24.11 310.90.9b01";
  153. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  154. gpu_info.gl_version = "4.0 NVIDIA-8.24.11 310.90.9b01";
  155. EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  156. gpu_info.gl_version = "OpenGL ES 3.0 (ANGLE 1.2.0.2450)";
  157. EXPECT_FALSE(entry.Contains(kOsWin, "6.1", gpu_info));
  158. }
  159. TEST_F(GpuControlListEntryTest, GlVendorEqual) {
  160. const Entry& entry = GetEntry(kGpuControlListEntryTest_GlVendorEqual);
  161. GPUInfo gpu_info;
  162. gpu_info.gl_vendor = "NVIDIA";
  163. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  164. // Case sensitive.
  165. gpu_info.gl_vendor = "NVidia";
  166. EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  167. gpu_info.gl_vendor = "NVIDIA-x";
  168. EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  169. }
  170. TEST_F(GpuControlListEntryTest, GlVendorWithDot) {
  171. const Entry& entry = GetEntry(kGpuControlListEntryTest_GlVendorWithDot);
  172. GPUInfo gpu_info;
  173. gpu_info.gl_vendor = "X.Org R300 Project";
  174. EXPECT_TRUE(entry.Contains(kOsLinux, "", gpu_info));
  175. gpu_info.gl_vendor = "X.Org";
  176. EXPECT_TRUE(entry.Contains(kOsLinux, "", gpu_info));
  177. }
  178. TEST_F(GpuControlListEntryTest, GlRendererContains) {
  179. const Entry& entry = GetEntry(kGpuControlListEntryTest_GlRendererContains);
  180. GPUInfo gpu_info;
  181. gpu_info.gl_renderer = "NVIDIA GeForce GT 120 OpenGL Engine";
  182. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  183. // Case sensitive.
  184. gpu_info.gl_renderer = "NVIDIA GEFORCE GT 120 OpenGL Engine";
  185. EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  186. gpu_info.gl_renderer = "GeForce GT 120 OpenGL Engine";
  187. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  188. gpu_info.gl_renderer = "NVIDIA GeForce";
  189. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  190. gpu_info.gl_renderer = "NVIDIA Ge Force";
  191. EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  192. }
  193. TEST_F(GpuControlListEntryTest, GlRendererCaseInsensitive) {
  194. const Entry& entry =
  195. GetEntry(kGpuControlListEntryTest_GlRendererCaseInsensitive);
  196. GPUInfo gpu_info;
  197. gpu_info.gl_renderer = "software rasterizer";
  198. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  199. gpu_info.gl_renderer = "Software Rasterizer";
  200. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  201. }
  202. TEST_F(GpuControlListEntryTest, GlExtensionsEndWith) {
  203. const Entry& entry = GetEntry(kGpuControlListEntryTest_GlExtensionsEndWith);
  204. GPUInfo gpu_info;
  205. gpu_info.gl_extensions = "GL_SGIS_generate_mipmap "
  206. "GL_SGIX_shadow "
  207. "GL_SUN_slice_accum";
  208. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  209. gpu_info.gl_extensions = "GL_SGIS_generate_mipmap "
  210. "GL_SUN_slice_accum "
  211. "GL_SGIX_shadow";
  212. EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  213. }
  214. TEST_F(GpuControlListEntryTest, OptimusEntry) {
  215. const Entry& entry = GetEntry(kGpuControlListEntryTest_OptimusEntry);
  216. EXPECT_EQ(kOsLinux, entry.conditions.os_type);
  217. GPUInfo gpu_info;
  218. gpu_info.optimus = true;
  219. EXPECT_TRUE(entry.Contains(kOsLinux, "10.6", gpu_info));
  220. }
  221. TEST_F(GpuControlListEntryTest, AMDSwitchableEntry) {
  222. const Entry& entry = GetEntry(kGpuControlListEntryTest_AMDSwitchableEntry);
  223. EXPECT_EQ(kOsMacosx, entry.conditions.os_type);
  224. GPUInfo gpu_info;
  225. gpu_info.amd_switchable = true;
  226. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.6", gpu_info));
  227. }
  228. TEST_F(GpuControlListEntryTest, DriverVendorBeginWith) {
  229. const Entry& entry = GetEntry(kGpuControlListEntryTest_DriverVendorBeginWith);
  230. GPUInfo gpu_info;
  231. gpu_info.gpu.vendor_id = 0x10de;
  232. gpu_info.gpu.driver_vendor = "NVIDIA Corporation";
  233. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  234. // Case sensitive.
  235. gpu_info.gpu.driver_vendor = "NVidia Corporation";
  236. EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  237. gpu_info.gpu.driver_vendor = "NVIDIA";
  238. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  239. gpu_info.gpu.driver_vendor = "USA NVIDIA";
  240. EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  241. }
  242. TEST_F(GpuControlListEntryTest, LexicalDriverVersionEntry) {
  243. const Entry& entry =
  244. GetEntry(kGpuControlListEntryTest_LexicalDriverVersionEntry);
  245. EXPECT_EQ(kOsLinux, entry.conditions.os_type);
  246. GPUInfo gpu_info;
  247. gpu_info.gpu.vendor_id = 0x1002;
  248. gpu_info.gpu.driver_version = "8.76";
  249. EXPECT_TRUE(entry.Contains(kOsLinux, "10.6", gpu_info));
  250. gpu_info.gpu.driver_version = "8.768";
  251. EXPECT_TRUE(entry.Contains(kOsLinux, "10.6", gpu_info));
  252. gpu_info.gpu.driver_version = "8.76.8";
  253. EXPECT_TRUE(entry.Contains(kOsLinux, "10.6", gpu_info));
  254. }
  255. TEST_F(GpuControlListEntryTest, NeedsMoreInfoEntry) {
  256. const Entry& entry = GetEntry(kGpuControlListEntryTest_NeedsMoreInfoEntry);
  257. GPUInfo gpu_info;
  258. gpu_info.gpu.vendor_id = 0x8086;
  259. EXPECT_TRUE(entry.NeedsMoreInfo(gpu_info, true));
  260. gpu_info.gpu.driver_version = "10.6";
  261. EXPECT_FALSE(entry.NeedsMoreInfo(gpu_info, true));
  262. }
  263. TEST_F(GpuControlListEntryTest, NeedsMoreInfoForExceptionsEntry) {
  264. const Entry& entry =
  265. GetEntry(kGpuControlListEntryTest_NeedsMoreInfoForExceptionsEntry);
  266. GPUInfo gpu_info;
  267. gpu_info.gpu.vendor_id = 0x8086;
  268. EXPECT_TRUE(entry.NeedsMoreInfo(gpu_info, true));
  269. EXPECT_FALSE(entry.NeedsMoreInfo(gpu_info, false));
  270. gpu_info.gl_renderer = "mesa";
  271. EXPECT_FALSE(entry.NeedsMoreInfo(gpu_info, true));
  272. }
  273. TEST_F(GpuControlListEntryTest, NeedsMoreInfoForGlVersionEntry) {
  274. const Entry& entry =
  275. GetEntry(kGpuControlListEntryTest_NeedsMoreInfoForGlVersionEntry);
  276. GPUInfo gpu_info;
  277. EXPECT_TRUE(entry.NeedsMoreInfo(gpu_info, true));
  278. EXPECT_TRUE(entry.Contains(kOsLinux, std::string(), gpu_info));
  279. gpu_info.gl_version = "3.1 Mesa 11.1.0";
  280. EXPECT_FALSE(entry.NeedsMoreInfo(gpu_info, false));
  281. EXPECT_TRUE(entry.Contains(kOsLinux, std::string(), gpu_info));
  282. gpu_info.gl_version = "4.1 Mesa 12.1.0";
  283. EXPECT_FALSE(entry.NeedsMoreInfo(gpu_info, false));
  284. EXPECT_FALSE(entry.Contains(kOsLinux, std::string(), gpu_info));
  285. gpu_info.gl_version = "OpenGL ES 2.0 Mesa 12.1.0";
  286. EXPECT_FALSE(entry.NeedsMoreInfo(gpu_info, false));
  287. EXPECT_FALSE(entry.Contains(kOsLinux, std::string(), gpu_info));
  288. }
  289. TEST_F(GpuControlListEntryTest, FeatureTypeAllEntry) {
  290. const Entry& entry = GetEntry(kGpuControlListEntryTest_FeatureTypeAllEntry);
  291. EXPECT_EQ(3u, entry.feature_size);
  292. EXPECT_EQ(1u, CountFeature(entry, TEST_FEATURE_0));
  293. EXPECT_EQ(1u, CountFeature(entry, TEST_FEATURE_1));
  294. EXPECT_EQ(1u, CountFeature(entry, TEST_FEATURE_2));
  295. }
  296. TEST_F(GpuControlListEntryTest, FeatureTypeAllEntryWithExceptions) {
  297. const Entry& entry =
  298. GetEntry(kGpuControlListEntryTest_FeatureTypeAllEntryWithExceptions);
  299. EXPECT_EQ(2u, entry.feature_size);
  300. EXPECT_EQ(1u, CountFeature(entry, TEST_FEATURE_1));
  301. EXPECT_EQ(1u, CountFeature(entry, TEST_FEATURE_2));
  302. }
  303. TEST_F(GpuControlListEntryTest, SingleActiveGPU) {
  304. const Entry& entry = GetEntry(kGpuControlListEntryTest_SingleActiveGPU);
  305. EXPECT_EQ(kOsMacosx, entry.conditions.os_type);
  306. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.6", gpu_info()));
  307. }
  308. TEST_F(GpuControlListEntryTest, MachineModelName) {
  309. const Entry& entry = GetEntry(kGpuControlListEntryTest_MachineModelName);
  310. EXPECT_EQ(kOsAndroid, entry.conditions.os_type);
  311. GPUInfo gpu_info;
  312. gpu_info.machine_model_name = "Nexus 4";
  313. EXPECT_TRUE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  314. gpu_info.machine_model_name = "XT1032";
  315. EXPECT_TRUE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  316. gpu_info.machine_model_name = "XT1032i";
  317. EXPECT_FALSE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  318. gpu_info.machine_model_name = "Nexus 5";
  319. EXPECT_FALSE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  320. gpu_info.machine_model_name = "Nexus";
  321. EXPECT_FALSE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  322. gpu_info.machine_model_name = "";
  323. EXPECT_FALSE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  324. gpu_info.machine_model_name = "GT-N7100";
  325. EXPECT_TRUE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  326. gpu_info.machine_model_name = "GT-I9300";
  327. EXPECT_TRUE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  328. gpu_info.machine_model_name = "SCH-I545";
  329. EXPECT_TRUE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  330. }
  331. TEST_F(GpuControlListEntryTest, MachineModelNameException) {
  332. const Entry& entry =
  333. GetEntry(kGpuControlListEntryTest_MachineModelNameException);
  334. EXPECT_EQ(kOsAny, entry.conditions.os_type);
  335. GPUInfo gpu_info;
  336. gpu_info.machine_model_name = "Nexus 4";
  337. EXPECT_FALSE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  338. EXPECT_TRUE(entry.Contains(kOsLinux, "4.1", gpu_info));
  339. gpu_info.machine_model_name = "Nexus 7";
  340. EXPECT_FALSE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  341. EXPECT_TRUE(entry.Contains(kOsLinux, "4.1", gpu_info));
  342. gpu_info.machine_model_name = "";
  343. EXPECT_TRUE(entry.Contains(kOsAndroid, "4.1", gpu_info));
  344. EXPECT_TRUE(entry.Contains(kOsLinux, "4.1", gpu_info));
  345. }
  346. TEST_F(GpuControlListEntryTest, MachineModelVersion) {
  347. const Entry& entry = GetEntry(kGpuControlListEntryTest_MachineModelVersion);
  348. GPUInfo gpu_info;
  349. gpu_info.machine_model_name = "MacBookPro";
  350. gpu_info.machine_model_version = "7.1";
  351. EXPECT_EQ(kOsMacosx, entry.conditions.os_type);
  352. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.6", gpu_info));
  353. }
  354. TEST_F(GpuControlListEntryTest, MachineModelVersionException) {
  355. const Entry& entry =
  356. GetEntry(kGpuControlListEntryTest_MachineModelVersionException);
  357. EXPECT_EQ(kOsMacosx, entry.conditions.os_type);
  358. GPUInfo gpu_info;
  359. gpu_info.machine_model_name = "MacBookPro";
  360. gpu_info.machine_model_version = "7.0";
  361. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.6", gpu_info));
  362. gpu_info.machine_model_version = "7.2";
  363. EXPECT_FALSE(entry.Contains(kOsMacosx, "10.6", gpu_info));
  364. gpu_info.machine_model_version = "";
  365. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.6", gpu_info));
  366. }
  367. class GpuControlListEntryDualGPUTest : public GpuControlListEntryTest {
  368. public:
  369. GpuControlListEntryDualGPUTest() = default;
  370. ~GpuControlListEntryDualGPUTest() override = default;
  371. void SetUp() override {
  372. // Set up a NVIDIA/Intel dual, with NVIDIA as primary and Intel as
  373. // secondary, and initially Intel is active.
  374. gpu_info_.gpu.vendor_id = 0x10de;
  375. gpu_info_.gpu.device_id = 0x0640;
  376. gpu_info_.gpu.driver_version = "24.21.13.9811";
  377. gpu_info_.gpu.active = false;
  378. GPUInfo::GPUDevice second_gpu;
  379. second_gpu.vendor_id = 0x8086;
  380. second_gpu.device_id = 0x0166;
  381. second_gpu.driver_version = "30.0.101.1660";
  382. second_gpu.active = true;
  383. gpu_info_.secondary_gpus.push_back(second_gpu);
  384. }
  385. void ActivatePrimaryGPU() {
  386. gpu_info_.gpu.active = true;
  387. gpu_info_.secondary_gpus[0].active = false;
  388. }
  389. void EntryShouldApply(const Entry& entry) const {
  390. EXPECT_TRUE(EntryApplies(entry));
  391. }
  392. void EntryShouldNotApply(const Entry& entry) const {
  393. EXPECT_FALSE(EntryApplies(entry));
  394. }
  395. private:
  396. bool EntryApplies(const Entry& entry) const {
  397. EXPECT_EQ(kOsMacosx, entry.conditions.os_type);
  398. return entry.Contains(kOsMacosx, "10.6", gpu_info());
  399. }
  400. };
  401. TEST_F(GpuControlListEntryDualGPUTest, CategoryAny) {
  402. const Entry& entry_intel =
  403. GetEntry(kGpuControlListEntryDualGPUTest_CategoryAny_Intel);
  404. EntryShouldApply(entry_intel);
  405. const Entry& entry_nvidia =
  406. GetEntry(kGpuControlListEntryDualGPUTest_CategoryAny_NVidia);
  407. EntryShouldApply(entry_nvidia);
  408. }
  409. TEST_F(GpuControlListEntryDualGPUTest, CategoryPrimarySecondary) {
  410. const Entry& entry_secondary =
  411. GetEntry(kGpuControlListEntryDualGPUTest_CategorySecondary);
  412. EntryShouldApply(entry_secondary);
  413. const Entry& entry_primary =
  414. GetEntry(kGpuControlListEntryDualGPUTest_CategoryPrimary);
  415. EntryShouldNotApply(entry_primary);
  416. const Entry& entry_default =
  417. GetEntry(kGpuControlListEntryDualGPUTest_CategoryDefault);
  418. // Default is active, and the secondary Intel GPU is active.
  419. EntryShouldApply(entry_default);
  420. }
  421. TEST_F(GpuControlListEntryDualGPUTest, ActiveSecondaryGPU) {
  422. const Entry& entry =
  423. GetEntry(kGpuControlListEntryDualGPUTest_ActiveSecondaryGPU);
  424. // By default, secondary GPU is active.
  425. EntryShouldApply(entry);
  426. ActivatePrimaryGPU();
  427. EntryShouldNotApply(entry);
  428. }
  429. TEST_F(GpuControlListEntryDualGPUTest, VendorOnlyActiveSecondaryGPU) {
  430. const Entry& entry =
  431. GetEntry(kGpuControlListEntryDualGPUTest_VendorOnlyActiveSecondaryGPU);
  432. // By default, secondary GPU is active.
  433. EntryShouldApply(entry);
  434. ActivatePrimaryGPU();
  435. EntryShouldNotApply(entry);
  436. }
  437. TEST_F(GpuControlListEntryDualGPUTest, ActivePrimaryGPU) {
  438. const Entry& entry =
  439. GetEntry(kGpuControlListEntryDualGPUTest_ActivePrimaryGPU);
  440. // By default, secondary GPU is active.
  441. EntryShouldNotApply(entry);
  442. ActivatePrimaryGPU();
  443. EntryShouldApply(entry);
  444. }
  445. TEST_F(GpuControlListEntryDualGPUTest, VendorOnlyActivePrimaryGPU) {
  446. const Entry& entry =
  447. GetEntry(kGpuControlListEntryDualGPUTest_VendorOnlyActivePrimaryGPU);
  448. // By default, secondary GPU is active.
  449. EntryShouldNotApply(entry);
  450. ActivatePrimaryGPU();
  451. EntryShouldApply(entry);
  452. }
  453. TEST_F(GpuControlListEntryDualGPUTest, AnyDriverVersion) {
  454. const Entry& entry = GetEntry(kGpuControlListEntryTest_AnyDriverVersion);
  455. EntryShouldApply(entry);
  456. ActivatePrimaryGPU();
  457. EntryShouldApply(entry);
  458. }
  459. TEST_F(GpuControlListEntryDualGPUTest, ActiveDriverVersion) {
  460. const Entry& entry = GetEntry(kGpuControlListEntryTest_ActiveDriverVersion);
  461. EntryShouldNotApply(entry);
  462. ActivatePrimaryGPU();
  463. EntryShouldApply(entry);
  464. }
  465. TEST_F(GpuControlListEntryTest, PixelShaderVersion) {
  466. const Entry& entry = GetEntry(kGpuControlListEntryTest_PixelShaderVersion);
  467. EXPECT_EQ(kOsAny, entry.conditions.os_type);
  468. GPUInfo gpu_info;
  469. gpu_info.pixel_shader_version = "3.2";
  470. EXPECT_TRUE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  471. gpu_info.pixel_shader_version = "4.9";
  472. EXPECT_FALSE(entry.Contains(kOsMacosx, "10.9", gpu_info));
  473. }
  474. TEST_F(GpuControlListEntryTest, OsVersionZero) {
  475. {
  476. const Entry& entry = GetEntry(kGpuControlListEntryTest_OsVersionZeroLT);
  477. // All forms of version 0 is considered invalid.
  478. EXPECT_FALSE(entry.Contains(kOsAndroid, "0", gpu_info()));
  479. EXPECT_FALSE(entry.Contains(kOsAndroid, "0.0", gpu_info()));
  480. EXPECT_FALSE(entry.Contains(kOsAndroid, "0.00.0", gpu_info()));
  481. }
  482. {
  483. const Entry& entry = GetEntry(kGpuControlListEntryTest_OsVersionZeroAny);
  484. EXPECT_TRUE(entry.Contains(kOsAndroid, "0", gpu_info()));
  485. EXPECT_TRUE(entry.Contains(kOsAndroid, "0.0", gpu_info()));
  486. EXPECT_TRUE(entry.Contains(kOsAndroid, "0.00.0", gpu_info()));
  487. }
  488. }
  489. TEST_F(GpuControlListEntryTest, OsComparison) {
  490. {
  491. const Entry& entry = GetEntry(kGpuControlListEntryTest_OsComparisonAny);
  492. for (auto os_type : kAllOsType) {
  493. EXPECT_TRUE(entry.Contains(os_type, std::string(), gpu_info()));
  494. EXPECT_TRUE(entry.Contains(os_type, "7.8", gpu_info()));
  495. }
  496. }
  497. {
  498. const Entry& entry = GetEntry(kGpuControlListEntryTest_OsComparisonGE);
  499. EXPECT_FALSE(entry.Contains(kOsMacosx, "10.8.3", gpu_info()));
  500. EXPECT_FALSE(entry.Contains(kOsLinux, "10", gpu_info()));
  501. EXPECT_FALSE(entry.Contains(kOsChromeOS, "13", gpu_info()));
  502. EXPECT_FALSE(entry.Contains(kOsAndroid, "7", gpu_info()));
  503. EXPECT_FALSE(entry.Contains(kOsWin, std::string(), gpu_info()));
  504. EXPECT_TRUE(entry.Contains(kOsWin, "6", gpu_info()));
  505. EXPECT_TRUE(entry.Contains(kOsWin, "6.1", gpu_info()));
  506. EXPECT_TRUE(entry.Contains(kOsWin, "7", gpu_info()));
  507. EXPECT_FALSE(entry.Contains(kOsWin, "5", gpu_info()));
  508. }
  509. }
  510. TEST_F(GpuControlListEntryTest, ExceptionWithoutVendorId) {
  511. const Entry& entry =
  512. GetEntry(kGpuControlListEntryTest_ExceptionWithoutVendorId);
  513. EXPECT_EQ(0x8086u, entry.exceptions[0].vendor_id);
  514. EXPECT_EQ(0x8086u, entry.exceptions[1].vendor_id);
  515. GPUInfo gpu_info;
  516. gpu_info.gpu.vendor_id = 0x8086;
  517. gpu_info.gpu.device_id = 0x2a02;
  518. gpu_info.gpu.driver_version = "9.1";
  519. EXPECT_FALSE(entry.Contains(kOsLinux, "2.1", gpu_info));
  520. gpu_info.gpu.driver_version = "9.0";
  521. EXPECT_TRUE(entry.Contains(kOsLinux, "2.1", gpu_info));
  522. }
  523. TEST_F(GpuControlListEntryTest, MultiGpuStyleAMDSwitchable) {
  524. GPUInfo gpu_info;
  525. gpu_info.amd_switchable = true;
  526. gpu_info.gpu.vendor_id = 0x1002;
  527. gpu_info.gpu.device_id = 0x6760;
  528. GPUInfo::GPUDevice integrated_gpu;
  529. integrated_gpu.vendor_id = 0x8086;
  530. integrated_gpu.device_id = 0x0116;
  531. gpu_info.secondary_gpus.push_back(integrated_gpu);
  532. { // amd_switchable_discrete entry
  533. const Entry& entry =
  534. GetEntry(kGpuControlListEntryTest_MultiGpuStyleAMDSwitchableDiscrete);
  535. // Integrated GPU is active
  536. gpu_info.gpu.active = false;
  537. gpu_info.secondary_gpus[0].active = true;
  538. EXPECT_FALSE(entry.Contains(kOsWin, "6.0", gpu_info));
  539. // Discrete GPU is active
  540. gpu_info.gpu.active = true;
  541. gpu_info.secondary_gpus[0].active = false;
  542. EXPECT_TRUE(entry.Contains(kOsWin, "6.0", gpu_info));
  543. }
  544. { // amd_switchable_integrated entry
  545. const Entry& entry =
  546. GetEntry(kGpuControlListEntryTest_MultiGpuStyleAMDSwitchableIntegrated);
  547. // Discrete GPU is active
  548. gpu_info.gpu.active = true;
  549. gpu_info.secondary_gpus[0].active = false;
  550. EXPECT_FALSE(entry.Contains(kOsWin, "6.0", gpu_info));
  551. // Integrated GPU is active
  552. gpu_info.gpu.active = false;
  553. gpu_info.secondary_gpus[0].active = true;
  554. EXPECT_TRUE(entry.Contains(kOsWin, "6.0", gpu_info));
  555. // For non AMD switchable
  556. gpu_info.amd_switchable = false;
  557. EXPECT_FALSE(entry.Contains(kOsWin, "6.0", gpu_info));
  558. }
  559. }
  560. TEST_F(GpuControlListEntryTest, InProcessGPU) {
  561. const Entry& entry = GetEntry(kGpuControlListEntryTest_InProcessGPU);
  562. GPUInfo gpu_info;
  563. gpu_info.in_process_gpu = true;
  564. EXPECT_TRUE(entry.Contains(kOsWin, "6.1", gpu_info));
  565. gpu_info.in_process_gpu = false;
  566. EXPECT_FALSE(entry.Contains(kOsWin, "6.1", gpu_info));
  567. }
  568. TEST_F(GpuControlListEntryTest, SameGPUTwiceTest) {
  569. const Entry& entry = GetEntry(kGpuControlListEntryTest_SameGPUTwiceTest);
  570. GPUInfo gpu_info;
  571. gpu_info.gpu.vendor_id = 0x8086;
  572. // Real case on Intel GMA* on Windows
  573. gpu_info.secondary_gpus.push_back(gpu_info.gpu);
  574. EXPECT_TRUE(entry.Contains(kOsWin, "6.1", gpu_info));
  575. }
  576. TEST_F(GpuControlListEntryTest, NVidiaNumberingScheme) {
  577. const Entry& entry = GetEntry(kGpuControlListEntryTest_NVidiaNumberingScheme);
  578. GPUInfo gpu_info;
  579. gpu_info.gl_vendor = "NVIDIA";
  580. gpu_info.gl_renderer = "NVIDIA GeForce GT 120 OpenGL Engine";
  581. gpu_info.gpu.vendor_id = 0x10de;
  582. gpu_info.gpu.device_id = 0x0640;
  583. // test the same driver version number
  584. gpu_info.gpu.driver_version = "8.17.12.6973";
  585. EXPECT_TRUE(entry.Contains(kOsWin, "7.0", gpu_info));
  586. // test a lower driver version number
  587. gpu_info.gpu.driver_version = "8.15.11.8647";
  588. EXPECT_TRUE(entry.Contains(kOsWin, "7.0", gpu_info));
  589. // test a higher driver version number
  590. gpu_info.gpu.driver_version = "9.18.13.2723";
  591. EXPECT_FALSE(entry.Contains(kOsWin, "7.0", gpu_info));
  592. }
  593. TEST_F(GpuControlListEntryTest, DirectRendering) {
  594. const Entry& entry = GetEntry(kGpuControlListEntryTest_DirectRendering);
  595. GPUInfo gpu_info;
  596. // No info does not match.
  597. gpu_info.direct_rendering_version = "";
  598. EXPECT_FALSE(entry.Contains(kOsLinux, "7.0", gpu_info));
  599. // Indirect rendering does not match.
  600. gpu_info.direct_rendering_version = "1";
  601. EXPECT_FALSE(entry.Contains(kOsLinux, "7.0", gpu_info));
  602. gpu_info.direct_rendering_version = "2";
  603. EXPECT_TRUE(entry.Contains(kOsLinux, "7.0", gpu_info));
  604. gpu_info.direct_rendering_version = "2.3";
  605. EXPECT_TRUE(entry.Contains(kOsLinux, "7.0", gpu_info));
  606. }
  607. TEST_F(GpuControlListEntryTest, GpuSeries) {
  608. const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuSeries);
  609. GPUInfo gpu_info;
  610. gpu_info.gpu.vendor_id = 0x8086;
  611. // Intel KabyLake
  612. gpu_info.gpu.device_id = 0x5916;
  613. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  614. // Intel SandyBridge
  615. gpu_info.gpu.device_id = 0x0116;
  616. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  617. // Intel SkyLake
  618. gpu_info.gpu.device_id = 0x1916;
  619. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  620. // Non-Intel GPU
  621. gpu_info.gpu.vendor_id = 0x10de;
  622. gpu_info.gpu.device_id = 0x0df8;
  623. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  624. }
  625. TEST_F(GpuControlListEntryTest, GpuSeriesActive) {
  626. const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuSeriesActive);
  627. GPUInfo::GPUDevice intel_gpu;
  628. intel_gpu.vendor_id = 0x8086;
  629. intel_gpu.device_id = 0x5916;
  630. GPUInfo::GPUDevice nvidia_gpu;
  631. nvidia_gpu.vendor_id = 0x10de;
  632. nvidia_gpu.device_id = 0x0df8;
  633. { // Single GPU
  634. GPUInfo gpu_info;
  635. gpu_info.gpu = intel_gpu;
  636. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  637. }
  638. { // Dual GPU, Intel is primary and active
  639. GPUInfo gpu_info;
  640. gpu_info.gpu = intel_gpu;
  641. gpu_info.gpu.active = true;
  642. gpu_info.secondary_gpus.push_back(nvidia_gpu);
  643. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  644. }
  645. { // Dual GPU, Intel is secondary and active
  646. GPUInfo gpu_info;
  647. gpu_info.gpu = nvidia_gpu;
  648. gpu_info.secondary_gpus.push_back(intel_gpu);
  649. gpu_info.secondary_gpus[0].active = true;
  650. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  651. }
  652. { // Dual GPU, NVidia is primary and active
  653. GPUInfo gpu_info;
  654. gpu_info.gpu = nvidia_gpu;
  655. gpu_info.gpu.active = true;
  656. gpu_info.secondary_gpus.push_back(intel_gpu);
  657. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  658. }
  659. { // Dual GPU, NVidia is secondary and active
  660. GPUInfo gpu_info;
  661. gpu_info.gpu = intel_gpu;
  662. gpu_info.secondary_gpus.push_back(nvidia_gpu);
  663. gpu_info.secondary_gpus[0].active = true;
  664. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  665. }
  666. }
  667. TEST_F(GpuControlListEntryTest, GpuSeriesAny) {
  668. const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuSeriesAny);
  669. GPUInfo::GPUDevice intel_gpu;
  670. intel_gpu.vendor_id = 0x8086;
  671. intel_gpu.device_id = 0x5916;
  672. GPUInfo::GPUDevice nvidia_gpu;
  673. nvidia_gpu.vendor_id = 0x10de;
  674. nvidia_gpu.device_id = 0x0df8;
  675. { // Single GPU Intel
  676. GPUInfo gpu_info;
  677. gpu_info.gpu = intel_gpu;
  678. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  679. }
  680. { // Single GPU NVidia
  681. GPUInfo gpu_info;
  682. gpu_info.gpu = nvidia_gpu;
  683. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  684. }
  685. { // Dual GPU, Intel is primary
  686. GPUInfo gpu_info;
  687. gpu_info.gpu = intel_gpu;
  688. gpu_info.secondary_gpus.push_back(nvidia_gpu);
  689. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  690. }
  691. { // Dual GPU, Intel is secondary
  692. GPUInfo gpu_info;
  693. gpu_info.gpu = nvidia_gpu;
  694. gpu_info.secondary_gpus.push_back(intel_gpu);
  695. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  696. }
  697. }
  698. TEST_F(GpuControlListEntryTest, GpuSeriesPrimary) {
  699. const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuSeriesPrimary);
  700. GPUInfo::GPUDevice intel_gpu;
  701. intel_gpu.vendor_id = 0x8086;
  702. intel_gpu.device_id = 0x5916;
  703. GPUInfo::GPUDevice nvidia_gpu;
  704. nvidia_gpu.vendor_id = 0x10de;
  705. nvidia_gpu.device_id = 0x0df8;
  706. { // Single GPU
  707. GPUInfo gpu_info;
  708. gpu_info.gpu = intel_gpu;
  709. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  710. }
  711. { // Dual GPU, Intel is primary
  712. GPUInfo gpu_info;
  713. gpu_info.gpu = intel_gpu;
  714. gpu_info.secondary_gpus.push_back(nvidia_gpu);
  715. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  716. }
  717. { // Dual GPU, Intel is secondary
  718. GPUInfo gpu_info;
  719. gpu_info.gpu = nvidia_gpu;
  720. gpu_info.secondary_gpus.push_back(intel_gpu);
  721. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  722. }
  723. }
  724. TEST_F(GpuControlListEntryTest, GpuSeriesSecondary) {
  725. const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuSeriesSecondary);
  726. GPUInfo::GPUDevice intel_gpu;
  727. intel_gpu.vendor_id = 0x8086;
  728. intel_gpu.device_id = 0x5916;
  729. GPUInfo::GPUDevice nvidia_gpu;
  730. nvidia_gpu.vendor_id = 0x10de;
  731. nvidia_gpu.device_id = 0x0df8;
  732. { // Single GPU
  733. GPUInfo gpu_info;
  734. gpu_info.gpu = intel_gpu;
  735. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  736. }
  737. { // Dual GPU, Intel is primary
  738. GPUInfo gpu_info;
  739. gpu_info.gpu = intel_gpu;
  740. gpu_info.secondary_gpus.push_back(nvidia_gpu);
  741. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  742. }
  743. { // Dual GPU, Intel is secondary
  744. GPUInfo gpu_info;
  745. gpu_info.gpu = nvidia_gpu;
  746. gpu_info.secondary_gpus.push_back(intel_gpu);
  747. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  748. }
  749. }
  750. TEST_F(GpuControlListEntryTest, GpuSeriesInException) {
  751. const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuSeriesInException);
  752. GPUInfo gpu_info;
  753. // Intel KabyLake
  754. gpu_info.gpu.vendor_id = 0x8086;
  755. gpu_info.gpu.device_id = 0x5916;
  756. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  757. // Intel SandyBridge
  758. gpu_info.gpu.vendor_id = 0x8086;
  759. gpu_info.gpu.device_id = 0x0116;
  760. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  761. }
  762. TEST_F(GpuControlListEntryTest, MultipleDrivers) {
  763. const Entry& entry = GetEntry(kGpuControlListEntryTest_MultipleDrivers);
  764. // The GPUInfo data came from https://crbug.com/810713#c58.
  765. GPUInfo gpu_info;
  766. gpu_info.gpu.vendor_id = 0x1002;
  767. gpu_info.gpu.device_id = 0x6741;
  768. gpu_info.gpu.driver_version = "8.951.0.0";
  769. GPUInfo::GPUDevice intel_device;
  770. intel_device.vendor_id = 0x8086;
  771. intel_device.device_id = 0x0116;
  772. intel_device.driver_version = "8.15.0010.2476";
  773. gpu_info.secondary_gpus.push_back(intel_device);
  774. gpu_info.gpu.active = true;
  775. gpu_info.secondary_gpus[0].active = false;
  776. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  777. gpu_info.gpu.active = false;
  778. gpu_info.secondary_gpus[0].active = true;
  779. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  780. }
  781. TEST_F(GpuControlListEntryTest, GpuGeneration) {
  782. const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuGeneration);
  783. GPUInfo gpu_info;
  784. gpu_info.gpu.vendor_id = 0x8086;
  785. // Intel SandyBridge
  786. gpu_info.gpu.device_id = 0x0116;
  787. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  788. // Intel Haswell
  789. gpu_info.gpu.device_id = 0x0416;
  790. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  791. // Intel Broadwell
  792. gpu_info.gpu.device_id = 0x1616;
  793. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  794. // Intel KabyLake
  795. gpu_info.gpu.device_id = 0x5916;
  796. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  797. // Intel IceLake
  798. gpu_info.gpu.device_id = 0x8A56;
  799. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  800. // Non-Intel GPU
  801. gpu_info.gpu.vendor_id = 0x10de;
  802. gpu_info.gpu.device_id = 0x0df8;
  803. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  804. }
  805. TEST_F(GpuControlListEntryTest, GpuGenerationActive) {
  806. const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuGenerationActive);
  807. // Intel Broadwell
  808. GPUInfo::GPUDevice intel_gpu;
  809. intel_gpu.vendor_id = 0x8086;
  810. intel_gpu.device_id = 0x1616;
  811. // NVidia GPU
  812. GPUInfo::GPUDevice nvidia_gpu;
  813. nvidia_gpu.vendor_id = 0x10de;
  814. nvidia_gpu.device_id = 0x0df8;
  815. { // Single GPU
  816. GPUInfo gpu_info;
  817. gpu_info.gpu = intel_gpu;
  818. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  819. }
  820. { // Dual GPU, Intel is primary and active
  821. GPUInfo gpu_info;
  822. gpu_info.gpu = intel_gpu;
  823. gpu_info.gpu.active = true;
  824. gpu_info.secondary_gpus.push_back(nvidia_gpu);
  825. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  826. }
  827. { // Dual GPU, Intel is secondary and active
  828. GPUInfo gpu_info;
  829. gpu_info.gpu = nvidia_gpu;
  830. gpu_info.secondary_gpus.push_back(intel_gpu);
  831. gpu_info.secondary_gpus[0].active = true;
  832. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  833. }
  834. { // Dual GPU, NVidia is primary and active
  835. GPUInfo gpu_info;
  836. gpu_info.gpu = nvidia_gpu;
  837. gpu_info.gpu.active = true;
  838. gpu_info.secondary_gpus.push_back(intel_gpu);
  839. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  840. }
  841. { // Dual GPU, NVidia is secondary and active
  842. GPUInfo gpu_info;
  843. gpu_info.gpu = intel_gpu;
  844. gpu_info.secondary_gpus.push_back(nvidia_gpu);
  845. gpu_info.secondary_gpus[0].active = true;
  846. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  847. }
  848. }
  849. TEST_F(GpuControlListEntryTest, GpuGenerationAny) {
  850. const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuGenerationAny);
  851. // Intel Broadwell
  852. GPUInfo::GPUDevice intel_gpu;
  853. intel_gpu.vendor_id = 0x8086;
  854. intel_gpu.device_id = 0x1616;
  855. // NVidia GPU
  856. GPUInfo::GPUDevice nvidia_gpu;
  857. nvidia_gpu.vendor_id = 0x10de;
  858. nvidia_gpu.device_id = 0x0df8;
  859. { // Single GPU Intel
  860. GPUInfo gpu_info;
  861. gpu_info.gpu = intel_gpu;
  862. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  863. }
  864. { // Single GPU Nvidia
  865. GPUInfo gpu_info;
  866. gpu_info.gpu = nvidia_gpu;
  867. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  868. }
  869. { // Dual GPU, Intel is primary
  870. GPUInfo gpu_info;
  871. gpu_info.gpu = intel_gpu;
  872. gpu_info.secondary_gpus.push_back(nvidia_gpu);
  873. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  874. }
  875. { // Dual GPU, Intel is secondary
  876. GPUInfo gpu_info;
  877. gpu_info.gpu = nvidia_gpu;
  878. gpu_info.secondary_gpus.push_back(intel_gpu);
  879. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  880. }
  881. }
  882. TEST_F(GpuControlListEntryTest, GpuGenerationPrimary) {
  883. const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuGenerationPrimary);
  884. // Intel Broadwell
  885. GPUInfo::GPUDevice intel_gpu;
  886. intel_gpu.vendor_id = 0x8086;
  887. intel_gpu.device_id = 0x1616;
  888. // NVidia GPU
  889. GPUInfo::GPUDevice nvidia_gpu;
  890. nvidia_gpu.vendor_id = 0x10de;
  891. nvidia_gpu.device_id = 0x0df8;
  892. { // Single GPU
  893. GPUInfo gpu_info;
  894. gpu_info.gpu = intel_gpu;
  895. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  896. }
  897. { // Dual GPU, Intel is primary
  898. GPUInfo gpu_info;
  899. gpu_info.gpu = intel_gpu;
  900. gpu_info.secondary_gpus.push_back(nvidia_gpu);
  901. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  902. }
  903. { // Dual GPU, Intel is secondary
  904. GPUInfo gpu_info;
  905. gpu_info.gpu = nvidia_gpu;
  906. gpu_info.secondary_gpus.push_back(intel_gpu);
  907. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  908. }
  909. }
  910. TEST_F(GpuControlListEntryTest, GpuGenerationSecondary) {
  911. const Entry& entry = GetEntry(kGpuControlListEntryTest_GpuGenerationSecondary);
  912. // Intel Broadwell
  913. GPUInfo::GPUDevice intel_gpu;
  914. intel_gpu.vendor_id = 0x8086;
  915. intel_gpu.device_id = 0x1616;
  916. // NVidia GPU
  917. GPUInfo::GPUDevice nvidia_gpu;
  918. nvidia_gpu.vendor_id = 0x10de;
  919. nvidia_gpu.device_id = 0x0df8;
  920. { // Single GPU
  921. GPUInfo gpu_info;
  922. gpu_info.gpu = intel_gpu;
  923. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  924. }
  925. { // Dual GPU, Intel is primary
  926. GPUInfo gpu_info;
  927. gpu_info.gpu = intel_gpu;
  928. gpu_info.secondary_gpus.push_back(nvidia_gpu);
  929. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  930. }
  931. { // Dual GPU, Intel is secondary
  932. GPUInfo gpu_info;
  933. gpu_info.gpu = nvidia_gpu;
  934. gpu_info.secondary_gpus.push_back(intel_gpu);
  935. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  936. }
  937. }
  938. #if BUILDFLAG(IS_WIN)
  939. TEST_F(GpuControlListEntryTest, HardwareOverlay) {
  940. const Entry& entry = GetEntry(kGpuControlListEntryTest_HardwareOverlay);
  941. GPUInfo gpu_info;
  942. gpu_info.gpu.vendor_id = 0x8086;
  943. gpu_info.overlay_info.supports_overlays = true;
  944. EXPECT_FALSE(entry.Contains(kOsWin, "10.0", gpu_info));
  945. gpu_info.overlay_info.supports_overlays = false;
  946. EXPECT_TRUE(entry.Contains(kOsWin, "10.0", gpu_info));
  947. }
  948. #endif // BUILDFLAG(IS_WIN)
  949. TEST_F(GpuControlListEntryTest, TestSubpixelFontRendering) {
  950. const Entry& entry = GetEntry(kGpuControlListEntryTest_SubpixelFontRendering);
  951. GPUInfo gpu_info;
  952. gpu_info.subpixel_font_rendering = true;
  953. gpu_info.gl_renderer = "Mali0xx";
  954. EXPECT_TRUE(entry.Contains(kOsChromeOS, "10.0", gpu_info));
  955. gpu_info.subpixel_font_rendering = false;
  956. gpu_info.gl_renderer = "Mali1xx";
  957. EXPECT_FALSE(entry.Contains(kOsChromeOS, "10.0", gpu_info));
  958. gpu_info.subpixel_font_rendering = false;
  959. gpu_info.gl_renderer = "DontCare";
  960. EXPECT_FALSE(entry.Contains(kOsChromeOS, "10.0", gpu_info));
  961. gpu_info.subpixel_font_rendering = true;
  962. gpu_info.gl_renderer = "DontCare";
  963. EXPECT_FALSE(entry.Contains(kOsChromeOS, "10.0", gpu_info));
  964. gpu_info.subpixel_font_rendering = false;
  965. gpu_info.gl_renderer = "Supported";
  966. EXPECT_TRUE(entry.Contains(kOsChromeOS, "10.0", gpu_info));
  967. gpu_info.subpixel_font_rendering = true;
  968. gpu_info.gl_renderer = "Supported";
  969. EXPECT_FALSE(entry.Contains(kOsChromeOS, "10.0", gpu_info));
  970. gpu_info.subpixel_font_rendering = true;
  971. gpu_info.gl_renderer = "Others";
  972. EXPECT_TRUE(entry.Contains(kOsChromeOS, "10.0", gpu_info));
  973. // Not ChromeOS
  974. EXPECT_FALSE(entry.Contains(kOsLinux, "10.0", gpu_info));
  975. }
  976. TEST_F(GpuControlListEntryTest, TestSubpixelFontRenderingDontCare) {
  977. const Entry& entry =
  978. GetEntry(kGpuControlListEntryTest_SubpixelFontRenderingDontCare);
  979. GPUInfo gpu_info;
  980. gpu_info.subpixel_font_rendering = true;
  981. gpu_info.gl_renderer = "Mali0xx";
  982. EXPECT_TRUE(entry.Contains(kOsChromeOS, "10.0", gpu_info));
  983. gpu_info.subpixel_font_rendering = false;
  984. EXPECT_TRUE(entry.Contains(kOsChromeOS, "10.0", gpu_info));
  985. }
  986. TEST_F(GpuControlListEntryTest, IntelDriverVendorEntry) {
  987. const Entry& entry =
  988. GetEntry(kGpuControlListEntryTest_IntelDriverVendorEntry);
  989. GPUInfo gpu_info;
  990. gpu_info.gpu.vendor_id = 0x8086;
  991. gpu_info.gpu.driver_vendor = "Intel(R) UHD Graphics 630";
  992. gpu_info.gpu.driver_version = "25.20.100.5000";
  993. EXPECT_FALSE(entry.Contains(kOsWin, "", gpu_info));
  994. gpu_info.gpu.driver_version = "23.20.100.6500";
  995. EXPECT_TRUE(entry.Contains(kOsWin, "", gpu_info));
  996. }
  997. TEST_F(GpuControlListEntryTest, IntelDriverVersionEntry) {
  998. const Entry& entry =
  999. GetEntry(kGpuControlListEntryTest_IntelDriverVersionEntry);
  1000. GPUInfo gpu_info;
  1001. gpu_info.gpu.vendor_id = 0x8086;
  1002. gpu_info.gpu.driver_version = "23.20.100.8000";
  1003. EXPECT_FALSE(entry.Contains(kOsWin, "", gpu_info));
  1004. gpu_info.gpu.driver_version = "25.20.100.6000";
  1005. EXPECT_TRUE(entry.Contains(kOsWin, "", gpu_info));
  1006. gpu_info.gpu.driver_version = "24.20.99.6000";
  1007. EXPECT_TRUE(entry.Contains(kOsWin, "", gpu_info));
  1008. gpu_info.gpu.driver_version = "24.20.101.6000";
  1009. EXPECT_FALSE(entry.Contains(kOsWin, "", gpu_info));
  1010. gpu_info.gpu.driver_version = "25.20.100.7000";
  1011. EXPECT_TRUE(entry.Contains(kOsWin, "", gpu_info));
  1012. }
  1013. #if BUILDFLAG(IS_WIN)
  1014. TEST_F(GpuControlListEntryTest, DeviceRevisionEntry) {
  1015. const Entry& entry = GetEntry(kGpuControlListEntryTest_DeviceRevisionEntry);
  1016. GPUInfo gpu_info;
  1017. gpu_info.gpu.vendor_id = 0x1002;
  1018. gpu_info.gpu.device_id = 0x15DD;
  1019. gpu_info.gpu.revision = 0x86;
  1020. gpu_info.gpu.driver_version = "26.20.12055.1000";
  1021. EXPECT_TRUE(entry.Contains(kOsWin, "", gpu_info));
  1022. gpu_info.gpu.driver_version = "26.20.15023.6032";
  1023. EXPECT_FALSE(entry.Contains(kOsWin, "", gpu_info));
  1024. gpu_info.gpu.device_id = 0x15D8;
  1025. gpu_info.gpu.revision = 0xE1;
  1026. gpu_info.gpu.driver_version = "26.20.12055.1000";
  1027. EXPECT_FALSE(entry.Contains(kOsWin, "", gpu_info));
  1028. gpu_info.gpu.revision = 0xE3;
  1029. EXPECT_TRUE(entry.Contains(kOsWin, "", gpu_info));
  1030. }
  1031. TEST_F(GpuControlListEntryTest, DeviceRevisionUnspecifiedEntry) {
  1032. const Entry& entry =
  1033. GetEntry(kGpuControlListEntryTest_DeviceRevisionUnspecifiedEntry);
  1034. GPUInfo gpu_info;
  1035. gpu_info.gpu.vendor_id = 0x1002;
  1036. gpu_info.gpu.device_id = 0x15DD;
  1037. gpu_info.gpu.revision = 0x86;
  1038. EXPECT_TRUE(entry.Contains(kOsWin, "", gpu_info));
  1039. gpu_info.gpu.revision = 0x91;
  1040. EXPECT_TRUE(entry.Contains(kOsWin, "", gpu_info));
  1041. gpu_info.gpu.revision = 0x0;
  1042. EXPECT_TRUE(entry.Contains(kOsWin, "", gpu_info));
  1043. }
  1044. #endif // BUILDFLAG(IS_WIN)
  1045. } // namespace gpu