webgpu/
lib.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use canvas_context::WebGpuExternalImageMap;
6pub use canvas_context::{ContextData, WebGpuExternalImages};
7use log::warn;
8use webgpu_traits::{WebGPU, WebGPUMsg};
9use wgpu_thread::WGPU;
10pub use {wgpu_core as wgc, wgpu_types as wgt};
11
12mod poll_thread;
13mod wgpu_thread;
14
15use std::borrow::Cow;
16
17use compositing_traits::{CrossProcessCompositorApi, WebRenderExternalImageIdManager};
18use ipc_channel::ipc::{self, IpcReceiver};
19use servo_config::pref;
20
21pub mod canvas_context;
22
23pub fn start_webgpu_thread(
24    compositor_api: CrossProcessCompositorApi,
25    webrender_external_image_id_manager: WebRenderExternalImageIdManager,
26    wgpu_image_map: WebGpuExternalImageMap,
27) -> Option<(WebGPU, IpcReceiver<WebGPUMsg>)> {
28    if !pref!(dom_webgpu_enabled) {
29        return None;
30    }
31    let (sender, receiver) = match ipc::channel() {
32        Ok(sender_and_receiver) => sender_and_receiver,
33        Err(e) => {
34            warn!(
35                "Failed to create sender and receiver for WGPU thread ({})",
36                e
37            );
38            return None;
39        },
40    };
41    let sender_clone = sender.clone();
42
43    let (script_sender, script_recv) = match ipc::channel() {
44        Ok(sender_and_receiver) => sender_and_receiver,
45        Err(e) => {
46            warn!(
47                "Failed to create receiver and sender for WGPU thread ({})",
48                e
49            );
50            return None;
51        },
52    };
53
54    if let Err(e) = std::thread::Builder::new()
55        .name("WGPU".to_owned())
56        .spawn(move || {
57            WGPU::new(
58                receiver,
59                sender_clone,
60                script_sender,
61                compositor_api,
62                webrender_external_image_id_manager,
63                wgpu_image_map,
64            )
65            .run();
66        })
67    {
68        warn!("Failed to spawn WGPU thread ({})", e);
69        return None;
70    }
71    Some((WebGPU(sender), script_recv))
72}