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 log::warn;
6use swapchain::WGPUImageMap;
7pub use swapchain::{ContextData, WGPUExternalImages};
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;
16use std::sync::{Arc, Mutex};
17
18use compositing_traits::{CrossProcessCompositorApi, WebrenderExternalImageRegistry};
19use ipc_channel::ipc::{self, IpcReceiver};
20use servo_config::pref;
21
22pub mod swapchain;
23
24pub fn start_webgpu_thread(
25    compositor_api: CrossProcessCompositorApi,
26    external_images: Arc<Mutex<WebrenderExternalImageRegistry>>,
27    wgpu_image_map: WGPUImageMap,
28) -> Option<(WebGPU, IpcReceiver<WebGPUMsg>)> {
29    if !pref!(dom_webgpu_enabled) {
30        return None;
31    }
32    let (sender, receiver) = match ipc::channel() {
33        Ok(sender_and_receiver) => sender_and_receiver,
34        Err(e) => {
35            warn!(
36                "Failed to create sender and receiver for WGPU thread ({})",
37                e
38            );
39            return None;
40        },
41    };
42    let sender_clone = sender.clone();
43
44    let (script_sender, script_recv) = match ipc::channel() {
45        Ok(sender_and_receiver) => sender_and_receiver,
46        Err(e) => {
47            warn!(
48                "Failed to create receiver and sender for WGPU thread ({})",
49                e
50            );
51            return None;
52        },
53    };
54
55    if let Err(e) = std::thread::Builder::new()
56        .name("WGPU".to_owned())
57        .spawn(move || {
58            WGPU::new(
59                receiver,
60                sender_clone,
61                script_sender,
62                compositor_api,
63                external_images,
64                wgpu_image_map,
65            )
66            .run();
67        })
68    {
69        warn!("Failed to spawn WGPU thread ({})", e);
70        return None;
71    }
72    Some((WebGPU(sender), script_recv))
73}