| // 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_SERVICE_DAWN_CONTEXT_PROVIDER_H_ |
| #define GPU_COMMAND_BUFFER_SERVICE_DAWN_CONTEXT_PROVIDER_H_ |
| |
| #include <dawn/platform/DawnPlatform.h> |
| |
| #include <memory> |
| |
| #include "base/memory/raw_ptr.h" |
| #include "base/synchronization/lock.h" |
| #include "base/thread_annotations.h" |
| #include "build/build_config.h" |
| #include "gpu/command_buffer/common/constants.h" |
| #include "gpu/command_buffer/service/dawn_caching_interface.h" |
| #include "gpu/config/gpu_driver_bug_workarounds.h" |
| #include "gpu/config/gpu_preferences.h" |
| #include "gpu/gpu_gles2_export.h" |
| #include "third_party/abseil-cpp/absl/types/optional.h" |
| #include "third_party/dawn/include/dawn/native/DawnNative.h" |
| #include "third_party/skia/include/gpu/graphite/ContextOptions.h" |
| #include "third_party/skia/include/gpu/graphite/dawn/DawnTypes.h" |
| |
| #if BUILDFLAG(IS_WIN) |
| #include <d3d11.h> |
| #include <wrl/client.h> |
| #endif |
| |
| namespace skgpu::graphite { |
| class Context; |
| } // namespace skgpu::graphite |
| |
| namespace gpu { |
| namespace webgpu { |
| class DawnInstance; |
| } // namespace webgpu |
| |
| class GPU_GLES2_EXPORT DawnContextProvider { |
| public: |
| using CacheBlobCallback = webgpu::DawnCachingInterface::CacheBlobCallback; |
| static std::unique_ptr<DawnContextProvider> Create( |
| const GpuPreferences& gpu_preferences = GpuPreferences(), |
| const GpuDriverBugWorkarounds& gpu_driver_workarounds = |
| GpuDriverBugWorkarounds(), |
| webgpu::DawnCachingInterfaceFactory* caching_interface_factory = nullptr, |
| CacheBlobCallback callback = {}); |
| static std::unique_ptr<DawnContextProvider> CreateWithBackend( |
| wgpu::BackendType backend_type, |
| bool force_fallback_adapter = false, |
| const GpuPreferences& gpu_preferences = GpuPreferences(), |
| const GpuDriverBugWorkarounds& gpu_driver_workarounds = |
| GpuDriverBugWorkarounds(), |
| webgpu::DawnCachingInterfaceFactory* caching_interface_factory = nullptr, |
| CacheBlobCallback callback = {}); |
| |
| static wgpu::BackendType GetDefaultBackendType(); |
| static bool DefaultForceFallbackAdapter(); |
| |
| DawnContextProvider(const DawnContextProvider&) = delete; |
| DawnContextProvider& operator=(const DawnContextProvider&) = delete; |
| |
| ~DawnContextProvider(); |
| |
| wgpu::Device GetDevice() const { return device_; } |
| wgpu::BackendType backend_type() const { return backend_type_; } |
| bool is_vulkan_swiftshader_adapter() const { |
| return is_vulkan_swiftshader_adapter_; |
| } |
| wgpu::Instance GetInstance() const; |
| |
| bool InitializeGraphiteContext( |
| const skgpu::graphite::ContextOptions& options); |
| |
| skgpu::graphite::Context* GetGraphiteContext() const { |
| return graphite_context_.get(); |
| } |
| |
| webgpu::DawnCachingInterfaceFactory* caching_interface_factory() const { |
| return caching_interface_factory_.get(); |
| } |
| |
| #if BUILDFLAG(IS_WIN) |
| Microsoft::WRL::ComPtr<ID3D11Device> GetD3D11Device() const; |
| #endif |
| |
| bool SupportsFeature(wgpu::FeatureName feature); |
| |
| absl::optional<error::ContextLostReason> GetResetStatus() const; |
| |
| void OnError(WGPUErrorType error_type, const char* message); |
| |
| private: |
| explicit DawnContextProvider( |
| webgpu::DawnCachingInterfaceFactory* caching_interface_factory); |
| |
| bool Initialize(wgpu::BackendType backend_type, |
| bool force_fallback_adapter, |
| const GpuPreferences& gpu_preferences, |
| const GpuDriverBugWorkarounds& gpu_driver_workarounds, |
| CacheBlobCallback callback); |
| |
| raw_ptr<webgpu::DawnCachingInterfaceFactory> caching_interface_factory_; |
| std::unique_ptr<dawn::platform::Platform> platform_; |
| std::unique_ptr<webgpu::DawnInstance> instance_; |
| wgpu::Device device_; |
| wgpu::BackendType backend_type_; |
| bool is_vulkan_swiftshader_adapter_ = false; |
| std::unique_ptr<skgpu::graphite::Context> graphite_context_; |
| |
| mutable base::Lock context_lost_lock_; |
| absl::optional<error::ContextLostReason> context_lost_reason_ |
| GUARDED_BY(context_lost_lock_); |
| }; |
| |
| } // namespace gpu |
| |
| #endif // GPU_COMMAND_BUFFER_SERVICE_DAWN_CONTEXT_PROVIDER_H_ |