| // Copyright 2018 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 "gpu/ipc/webgpu_in_process_context.h" |
| |
| #include <utility> |
| |
| #include "base/command_line.h" |
| #include "base/logging.h" |
| #include "base/test/test_simple_task_runner.h" |
| #include "gpu/command_buffer/client/shared_memory_limits.h" |
| #include "gpu/command_buffer/client/transfer_buffer.h" |
| #include "gpu/command_buffer/client/webgpu_cmd_helper.h" |
| #include "gpu/command_buffer/client/webgpu_implementation.h" |
| #include "gpu/command_buffer/common/command_buffer.h" |
| #include "gpu/command_buffer/common/constants.h" |
| #include "gpu/command_buffer/common/context_creation_attribs.h" |
| #include "gpu/config/gpu_feature_info.h" |
| #include "gpu/config/gpu_switches.h" |
| #include "gpu/ipc/common/surface_handle.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace gpu { |
| |
| WebGPUInProcessContext::WebGPUInProcessContext() = default; |
| |
| WebGPUInProcessContext::~WebGPUInProcessContext() { |
| // Trigger any pending lost contexts. First do a full sync between client |
| // and service threads. Then execute any pending tasks. |
| if (webgpu_implementation_) { |
| // TODO(crbug.com/868192): do the equivalent of a glFinish here? |
| client_task_runner_->RunUntilIdle(); |
| webgpu_implementation_.reset(); |
| } |
| transfer_buffer_.reset(); |
| helper_.reset(); |
| command_buffer_.reset(); |
| } |
| |
| ContextResult WebGPUInProcessContext::Initialize( |
| scoped_refptr<CommandBufferTaskExecutor> task_executor, |
| const ContextCreationAttribs& attribs, |
| const SharedMemoryLimits& memory_limits, |
| GpuMemoryBufferManager* gpu_memory_buffer_manager, |
| ImageFactory* image_factory, |
| GpuChannelManagerDelegate* gpu_channel_manager_delegate) { |
| DCHECK(attribs.context_type == CONTEXT_TYPE_WEBGPU); |
| |
| if (attribs.context_type != CONTEXT_TYPE_WEBGPU || |
| attribs.enable_raster_interface || attribs.enable_gles2_interface) { |
| return ContextResult::kFatalFailure; |
| } |
| |
| client_task_runner_ = base::MakeRefCounted<base::TestSimpleTaskRunner>(); |
| command_buffer_ = |
| std::make_unique<InProcessCommandBuffer>(std::move(task_executor)); |
| |
| static const scoped_refptr<gl::GLSurface> surface = nullptr; |
| static constexpr bool is_offscreen = true; |
| static constexpr InProcessCommandBuffer* share_group = nullptr; |
| auto result = command_buffer_->Initialize( |
| surface, is_offscreen, kNullSurfaceHandle, attribs, share_group, |
| gpu_memory_buffer_manager, image_factory, gpu_channel_manager_delegate, |
| client_task_runner_, nullptr, nullptr); |
| if (result != ContextResult::kSuccess) { |
| DLOG(ERROR) << "Failed to initialize InProcessCommmandBuffer"; |
| return result; |
| } |
| |
| // Check for consistency. |
| DCHECK(!attribs.bind_generates_resource); |
| |
| // Create the WebGPUCmdHelper, which writes the command buffer protocol. |
| auto webgpu_helper = |
| std::make_unique<webgpu::WebGPUCmdHelper>(command_buffer_.get()); |
| result = webgpu_helper->Initialize(memory_limits.command_buffer_size); |
| if (result != ContextResult::kSuccess) { |
| LOG(ERROR) << "Failed to initialize WebGPUCmdHelper"; |
| return result; |
| } |
| transfer_buffer_ = std::make_unique<TransferBuffer>(webgpu_helper.get()); |
| |
| webgpu_implementation_ = |
| std::make_unique<webgpu::WebGPUImplementation>(webgpu_helper.get()); |
| helper_ = std::move(webgpu_helper); |
| return result; |
| } |
| |
| const Capabilities& WebGPUInProcessContext::GetCapabilities() const { |
| return command_buffer_->GetCapabilities(); |
| } |
| |
| const GpuFeatureInfo& WebGPUInProcessContext::GetGpuFeatureInfo() const { |
| return command_buffer_->GetGpuFeatureInfo(); |
| } |
| |
| webgpu::WebGPUInterface* WebGPUInProcessContext::GetImplementation() { |
| return webgpu_implementation_.get(); |
| } |
| |
| ServiceTransferCache* WebGPUInProcessContext::GetTransferCacheForTest() const { |
| return command_buffer_->GetTransferCacheForTest(); |
| } |
| |
| InProcessCommandBuffer* WebGPUInProcessContext::GetCommandBufferForTest() |
| const { |
| return command_buffer_.get(); |
| } |
| |
| } // namespace gpu |