| // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <vector> |
| |
| #include "gpu/config/gpu_blocklist.h" |
| #include "gpu/config/gpu_feature_type.h" |
| #include "gpu/config/gpu_info.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace gpu { |
| |
| class GpuBlocklistTest : public testing::Test { |
| public: |
| GpuBlocklistTest() = default; |
| ~GpuBlocklistTest() override = default; |
| |
| const GPUInfo& gpu_info() const { return gpu_info_; } |
| |
| void RunFeatureTest(GpuFeatureType feature_type) { |
| const int kFeatureListForEntry1[1] = {feature_type}; |
| const GpuControlList::Device kDevicesForEntry1[1] = {{0x0640, 0x0}}; |
| const GpuControlList::Entry kTestEntries[1] = {{ |
| 1, // id |
| "Test entry", // description |
| 1, // features size |
| kFeatureListForEntry1, // features |
| 0, // DisabledExtensions size |
| nullptr, // DisabledExtensions |
| 0, // DisabledWebGLExtensions size |
| nullptr, // DisabledWebGLExtensions |
| 0, // CrBugs size |
| nullptr, // CrBugs |
| { |
| GpuControlList::kOsMacosx, // os_type |
| {GpuControlList::kUnknown, GpuControlList::kVersionStyleNumerical, |
| GpuControlList::kVersionSchemaCommon, nullptr, |
| nullptr}, // os_version |
| 0x10de, // vendor_id |
| 1, // Devices size |
| kDevicesForEntry1, // Devices |
| GpuControlList::kMultiGpuCategoryAny, // multi_gpu_category |
| GpuControlList::kMultiGpuStyleNone, // multi_gpu_style |
| nullptr, // driver info |
| nullptr, // GL strings |
| nullptr, // machine model info |
| 0, // gpu_series size |
| nullptr, // gpu_series |
| {GpuControlList::kUnknown, GpuControlList::kVersionStyleNumerical, |
| GpuControlList::kVersionSchemaCommon, nullptr, |
| nullptr}, // intel_gpu_generation |
| nullptr, // more conditions |
| }, |
| 0, // exceptions count |
| nullptr, // exceptions |
| }}; |
| GpuControlListData data(1, kTestEntries); |
| std::unique_ptr<GpuBlocklist> blocklist = GpuBlocklist::Create(data); |
| std::set<int> type = |
| blocklist->MakeDecision(GpuBlocklist::kOsMacosx, "10.12.3", gpu_info()); |
| EXPECT_EQ(1u, type.size()); |
| EXPECT_EQ(1u, type.count(feature_type)); |
| } |
| |
| protected: |
| void SetUp() override { |
| gpu_info_.gpu.vendor_id = 0x10de; |
| gpu_info_.gpu.device_id = 0x0640; |
| gpu_info_.gpu.driver_vendor = "NVIDIA"; |
| gpu_info_.gpu.driver_version = "1.6.18"; |
| gpu_info_.machine_model_name = "MacBookPro"; |
| gpu_info_.machine_model_version = "7.1"; |
| gpu_info_.gl_vendor = "NVIDIA Corporation"; |
| gpu_info_.gl_renderer = "NVIDIA GeForce GT 120 OpenGL Engine"; |
| } |
| |
| private: |
| GPUInfo gpu_info_; |
| }; |
| |
| #define GPU_BLOCKLIST_FEATURE_TEST(test_name, feature_type) \ |
| TEST_F(GpuBlocklistTest, test_name) { RunFeatureTest(feature_type); } |
| |
| GPU_BLOCKLIST_FEATURE_TEST(Accelerated2DCanvas, |
| GPU_FEATURE_TYPE_ACCELERATED_2D_CANVAS) |
| |
| GPU_BLOCKLIST_FEATURE_TEST(AcceleratedWebGL, GPU_FEATURE_TYPE_ACCELERATED_WEBGL) |
| |
| GPU_BLOCKLIST_FEATURE_TEST(AcceleratedVideoDecode, |
| GPU_FEATURE_TYPE_ACCELERATED_VIDEO_DECODE) |
| |
| GPU_BLOCKLIST_FEATURE_TEST(AcceleratedVideoEncode, |
| GPU_FEATURE_TYPE_ACCELERATED_VIDEO_ENCODE) |
| |
| GPU_BLOCKLIST_FEATURE_TEST(GpuRasterization, GPU_FEATURE_TYPE_GPU_RASTERIZATION) |
| |
| GPU_BLOCKLIST_FEATURE_TEST(WebGL2, GPU_FEATURE_TYPE_ACCELERATED_WEBGL2) |
| |
| GPU_BLOCKLIST_FEATURE_TEST(GL, GPU_FEATURE_TYPE_ACCELERATED_GL) |
| |
| GPU_BLOCKLIST_FEATURE_TEST(Vulkan, GPU_FEATURE_TYPE_VULKAN) |
| |
| GPU_BLOCKLIST_FEATURE_TEST(AcceleratedWebGPU, |
| GPU_FEATURE_TYPE_ACCELERATED_WEBGPU) |
| |
| // Test for invariant "Assume the newly last added entry has the largest ID". |
| // See GpuControlList::GpuControlList. |
| // It checks software_rendering_list.json |
| TEST_F(GpuBlocklistTest, TestBlocklistIsValid) { |
| std::unique_ptr<GpuBlocklist> list(GpuBlocklist::Create()); |
| uint32_t max_entry_id = list->max_entry_id(); |
| |
| std::vector<uint32_t> indices(list->num_entries()); |
| int current = 0; |
| std::generate(indices.begin(), indices.end(), |
| [¤t]() { return current++; }); |
| |
| auto entries = list->GetEntryIDsFromIndices(indices); |
| auto real_max_entry_id = *std::max_element(entries.begin(), entries.end()); |
| EXPECT_EQ(real_max_entry_id, max_entry_id); |
| } |
| |
| } // namespace gpu |