| // Copyright 2019 The Chromium Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef GPU_COMMAND_BUFFER_TESTS_WEBGPU_TEST_H_ | |
| #define GPU_COMMAND_BUFFER_TESTS_WEBGPU_TEST_H_ | |
| #include <dawn/wire/client/webgpu_cpp.h> | |
| #include <dawn/wire/client/webgpu_cpp_print.h> | |
| #include <map> | |
| #include <memory> | |
| #include "build/build_config.h" | |
| #include "gpu/command_buffer/client/shared_memory_limits.h" | |
| #include "gpu/command_buffer/common/webgpu_cmd_ids.h" | |
| #include "gpu/config/gpu_preferences.h" | |
| #include "testing/gtest/include/gtest/gtest.h" | |
| namespace viz { | |
| class TestGpuServiceHolder; | |
| } | |
| namespace gpu { | |
| class SharedImageInterface; | |
| class WebGPUInProcessContext; | |
| namespace webgpu { | |
| class WebGPUCmdHelper; | |
| class WebGPUDecoder; | |
| class WebGPUImplementation; | |
| class WebGPUInterface; | |
| } // namespace webgpu | |
| class WebGPUTest : public testing::Test { | |
| public: | |
| struct Options { | |
| Options(); | |
| bool force_fallback_adapter = false; | |
| wgpu::FeatureLevel feature_level = wgpu::FeatureLevel::Core; | |
| bool enable_unsafe_webgpu = false; | |
| bool use_skia_graphite = false; | |
| // By default, disable the blocklist so all adapters | |
| // can be tested. | |
| bool adapter_blocklist = false; | |
| // Overrides the adapter selection, like --use-webgpu-adapter. | |
| WebGPUAdapterName use_webgpu_adapter = WebGPUAdapterName::kDefault; | |
| // If true, Initialize() does not expect an adapter to be found. | |
| bool allow_no_adapter = false; | |
| }; | |
| protected: | |
| WebGPUTest(); | |
| ~WebGPUTest() override; | |
| bool WebGPUSupported() const; | |
| bool WebGPUSharedImageSupported() const; | |
| void SetUp() override; | |
| void TearDown() override; | |
| void Initialize(const Options& options); | |
| webgpu::WebGPUInterface* webgpu() const; | |
| webgpu::WebGPUImplementation* webgpu_impl() const; | |
| webgpu::WebGPUCmdHelper* webgpu_cmds() const; | |
| SharedImageInterface* GetSharedImageInterface() const; | |
| webgpu::WebGPUDecoder* GetDecoder() const; | |
| void RunPendingTasks(); | |
| void WaitForCompletion(wgpu::Device device); | |
| void WaitForFutureCompletion(wgpu::Device device, | |
| wgpu::FutureWaitInfo wait_info); | |
| void PollUntilIdle(); | |
| wgpu::Device GetNewDevice( | |
| std::vector<wgpu::FeatureName> requiredFeatures = {}); | |
| viz::TestGpuServiceHolder* GetGpuServiceHolder() { | |
| return gpu_service_holder_.get(); | |
| } | |
| bool IsUsingFallbackAdapter() { | |
| wgpu::AdapterInfo adapter_info = {}; | |
| adapter_.GetInfo(&adapter_info); | |
| return adapter_info.adapterType == wgpu::AdapterType::CPU; | |
| } | |
| static std::map<std::pair<WGPUDevice, wgpu::ErrorType>, /* matched */ bool> | |
| s_expected_errors; | |
| static std::map<WGPUDevice, /* matched */ bool> s_expected_devices_lost; | |
| wgpu::Instance instance_ = nullptr; | |
| wgpu::Adapter adapter_ = nullptr; | |
| private: | |
| std::unique_ptr<viz::TestGpuServiceHolder> gpu_service_holder_; | |
| std::unique_ptr<WebGPUInProcessContext> context_; | |
| std::unique_ptr<webgpu::WebGPUCmdHelper> cmd_helper_; | |
| }; | |
| #define EXPECT_WEBGPU_ERROR(device, type, statement) \ | |
| do { \ | |
| PollUntilIdle(); \ | |
| auto it = \ | |
| s_expected_errors.insert({std::make_pair(device.Get(), type), false}); \ | |
| EXPECT_TRUE(it.second) \ | |
| << "Only one expectation per-device-per-type supported."; \ | |
| statement; \ | |
| PollUntilIdle(); \ | |
| EXPECT_TRUE(it.first->second) \ | |
| << "Expected error (" << type << ") in `" #statement "`"; \ | |
| s_expected_errors.erase(it.first); \ | |
| } while (0) | |
| #define EXPECT_WEBGPU_DEVICE_LOST(device, statement) \ | |
| do { \ | |
| PollUntilIdle(); \ | |
| auto it = s_expected_devices_lost.insert({device.Get(), false}); \ | |
| EXPECT_TRUE(it.second) << "Only one expectation per-device supported."; \ | |
| statement; \ | |
| PollUntilIdle(); \ | |
| EXPECT_TRUE(it.first->second) \ | |
| << "Expected device lost in `" #statement "`"; \ | |
| s_expected_devices_lost.erase(it.first); \ | |
| } while (0) | |
| } // namespace gpu | |
| #endif // GPU_COMMAND_BUFFER_TESTS_WEBGPU_TEST_H_ |