gpu_blocklist_unittest.cc 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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 <vector>
  5. #include "gpu/config/gpu_blocklist.h"
  6. #include "gpu/config/gpu_driver_bug_list_autogen.h"
  7. #include "gpu/config/gpu_feature_type.h"
  8. #include "gpu/config/gpu_info.h"
  9. #include "gpu/config/software_rendering_list_autogen.h"
  10. #include "testing/gtest/include/gtest/gtest.h"
  11. #include "third_party/re2/src/re2/re2.h"
  12. namespace gpu {
  13. class GpuBlocklistTest : public testing::Test {
  14. public:
  15. GpuBlocklistTest() = default;
  16. ~GpuBlocklistTest() override = default;
  17. const GPUInfo& gpu_info() const { return gpu_info_; }
  18. void RunFeatureTest(GpuFeatureType feature_type) {
  19. const int kFeatureListForEntry1[1] = {feature_type};
  20. const GpuControlList::Device kDevicesForEntry1[1] = {{0x0640, 0x0}};
  21. const GpuControlList::Entry kTestEntries[1] = {{
  22. 1, // id
  23. "Test entry", // description
  24. 1, // features size
  25. kFeatureListForEntry1, // features
  26. 0, // DisabledExtensions size
  27. nullptr, // DisabledExtensions
  28. 0, // DisabledWebGLExtensions size
  29. nullptr, // DisabledWebGLExtensions
  30. 0, // CrBugs size
  31. nullptr, // CrBugs
  32. {
  33. GpuControlList::kOsMacosx, // os_type
  34. {GpuControlList::kUnknown, GpuControlList::kVersionStyleNumerical,
  35. GpuControlList::kVersionSchemaCommon, nullptr,
  36. nullptr}, // os_version
  37. 0x10de, // vendor_id
  38. 1, // Devices size
  39. kDevicesForEntry1, // Devices
  40. GpuControlList::kMultiGpuCategoryAny, // multi_gpu_category
  41. GpuControlList::kMultiGpuStyleNone, // multi_gpu_style
  42. nullptr, // driver info
  43. nullptr, // GL strings
  44. nullptr, // machine model info
  45. 0, // gpu_series size
  46. nullptr, // gpu_series
  47. {GpuControlList::kUnknown, GpuControlList::kVersionStyleNumerical,
  48. GpuControlList::kVersionSchemaCommon, nullptr,
  49. nullptr}, // intel_gpu_generation
  50. nullptr, // more conditions
  51. },
  52. 0, // exceptions count
  53. nullptr, // exceptions
  54. }};
  55. GpuControlListData data(1, kTestEntries);
  56. std::unique_ptr<GpuBlocklist> blocklist = GpuBlocklist::Create(data);
  57. std::set<int> type =
  58. blocklist->MakeDecision(GpuBlocklist::kOsMacosx, "10.12.3", gpu_info());
  59. EXPECT_EQ(1u, type.size());
  60. EXPECT_EQ(1u, type.count(feature_type));
  61. }
  62. protected:
  63. void SetUp() override {
  64. gpu_info_.gpu.vendor_id = 0x10de;
  65. gpu_info_.gpu.device_id = 0x0640;
  66. gpu_info_.gpu.driver_vendor = "NVIDIA";
  67. gpu_info_.gpu.driver_version = "1.6.18";
  68. gpu_info_.machine_model_name = "MacBookPro";
  69. gpu_info_.machine_model_version = "7.1";
  70. gpu_info_.gl_vendor = "NVIDIA Corporation";
  71. gpu_info_.gl_renderer = "NVIDIA GeForce GT 120 OpenGL Engine";
  72. }
  73. private:
  74. GPUInfo gpu_info_;
  75. };
  76. #define GPU_BLOCKLIST_FEATURE_TEST(test_name, feature_type) \
  77. TEST_F(GpuBlocklistTest, test_name) { RunFeatureTest(feature_type); }
  78. GPU_BLOCKLIST_FEATURE_TEST(Accelerated2DCanvas,
  79. GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS)
  80. GPU_BLOCKLIST_FEATURE_TEST(AcceleratedWebGL, GPU_FEATURE_TYPE_ACCELERATED_WEBGL)
  81. GPU_BLOCKLIST_FEATURE_TEST(AcceleratedVideoDecode,
  82. GPU_FEATURE_TYPE_ACCELERATED_VIDEO_DECODE)
  83. GPU_BLOCKLIST_FEATURE_TEST(AcceleratedVideoEncode,
  84. GPU_FEATURE_TYPE_ACCELERATED_VIDEO_ENCODE)
  85. GPU_BLOCKLIST_FEATURE_TEST(GpuRasterization, GPU_FEATURE_TYPE_GPU_RASTERIZATION)
  86. GPU_BLOCKLIST_FEATURE_TEST(WebGL2, GPU_FEATURE_TYPE_ACCELERATED_WEBGL2)
  87. GPU_BLOCKLIST_FEATURE_TEST(GL, GPU_FEATURE_TYPE_ACCELERATED_GL)
  88. GPU_BLOCKLIST_FEATURE_TEST(Vulkan, GPU_FEATURE_TYPE_VULKAN)
  89. GPU_BLOCKLIST_FEATURE_TEST(AcceleratedWebGPU,
  90. GPU_FEATURE_TYPE_ACCELERATED_WEBGPU)
  91. // Test for invariant "Assume the newly last added entry has the largest ID".
  92. // See GpuControlList::GpuControlList.
  93. // It checks software_rendering_list.json
  94. TEST_F(GpuBlocklistTest, TestBlocklistIsValid) {
  95. std::unique_ptr<GpuBlocklist> list(GpuBlocklist::Create());
  96. uint32_t max_entry_id = list->max_entry_id();
  97. std::vector<uint32_t> indices(list->num_entries());
  98. int current = 0;
  99. std::generate(indices.begin(), indices.end(),
  100. [&current]() { return current++; });
  101. auto entries = list->GetEntryIDsFromIndices(indices);
  102. auto real_max_entry_id = *std::max_element(entries.begin(), entries.end());
  103. EXPECT_EQ(real_max_entry_id, max_entry_id);
  104. }
  105. void TestBlockList(const GpuControlList::Entry* entries, size_t count) {
  106. for (size_t i = 0; i < count; ++i) {
  107. const auto& entry = entries[i];
  108. if (const auto* gl_strings = entry.conditions.gl_strings) {
  109. if (gl_strings->gl_vendor) {
  110. EXPECT_TRUE(RE2(gl_strings->gl_vendor).ok())
  111. << "gl_vendor=" << gl_strings->gl_vendor;
  112. }
  113. if (gl_strings->gl_renderer) {
  114. EXPECT_TRUE(RE2(gl_strings->gl_renderer).ok())
  115. << "gl_renderer=" << gl_strings->gl_renderer;
  116. }
  117. if (gl_strings->gl_extensions) {
  118. EXPECT_TRUE(RE2(gl_strings->gl_extensions).ok())
  119. << "gl_extensions=" << gl_strings->gl_extensions;
  120. }
  121. if (gl_strings->gl_version) {
  122. EXPECT_TRUE(RE2(gl_strings->gl_version).ok())
  123. << "gl_version=" << gl_strings->gl_version;
  124. }
  125. }
  126. for (size_t j = 0; j < entry.exception_size; ++j) {
  127. const auto& conditions = entry.exceptions[j];
  128. if (const auto* gl_strings = conditions.gl_strings) {
  129. if (gl_strings->gl_vendor) {
  130. EXPECT_TRUE(RE2(gl_strings->gl_vendor).ok())
  131. << "gl_vendor=" << gl_strings->gl_vendor;
  132. }
  133. if (gl_strings->gl_renderer) {
  134. EXPECT_TRUE(RE2(gl_strings->gl_renderer).ok())
  135. << "gl_renderer=" << gl_strings->gl_renderer;
  136. }
  137. if (gl_strings->gl_extensions) {
  138. EXPECT_TRUE(RE2(gl_strings->gl_extensions).ok())
  139. << "gl_extensions=" << gl_strings->gl_extensions;
  140. }
  141. if (gl_strings->gl_version) {
  142. EXPECT_TRUE(RE2(gl_strings->gl_version).ok())
  143. << "gl_version=" << gl_strings->gl_version;
  144. }
  145. }
  146. }
  147. }
  148. }
  149. // It checks software_rendering_list.json
  150. TEST_F(GpuBlocklistTest, VerifyGLStrings) {
  151. TestBlockList(kSoftwareRenderingListEntries,
  152. kSoftwareRenderingListEntryCount);
  153. TestBlockList(kGpuDriverBugListEntries, kGpuDriverBugListEntryCount);
  154. }
  155. } // namespace gpu