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 base::generic_channel::{self, GenericReceiver};
6use canvas_context::WebGpuExternalImageMap;
7pub use canvas_context::{ContextData, WebGpuExternalImages};
8use log::warn;
9use webgpu_traits::{WebGPU, WebGPUMsg};
10use wgpu_thread::WGPU;
11pub use {wgpu_core as wgc, wgpu_types as wgt};
12
13mod poll_thread;
14mod wgpu_thread;
15
16use std::borrow::Cow;
17
18use paint_api::{CrossProcessPaintApi, WebRenderExternalImageIdManager};
19use servo_config::pref;
20
21pub mod canvas_context;
22
23pub fn start_webgpu_thread(
24    paint_api: CrossProcessPaintApi,
25    webrender_external_image_id_manager: WebRenderExternalImageIdManager,
26    wgpu_image_map: WebGpuExternalImageMap,
27) -> Option<(WebGPU, GenericReceiver<WebGPUMsg>)> {
28    if !pref!(dom_webgpu_enabled) {
29        return None;
30    }
31    let (sender, receiver) = match generic_channel::channel() {
32        Some(sender_and_receiver) => sender_and_receiver,
33        None => {
34            warn!("Failed to create sender and receiver for WGPU thread",);
35            return None;
36        },
37    };
38    let sender_clone = sender.clone();
39
40    let (script_sender, script_recv) = match generic_channel::channel() {
41        Some(sender_and_receiver) => sender_and_receiver,
42        None => {
43            warn!("Failed to create receiver and sender for WGPU thread",);
44            return None;
45        },
46    };
47
48    if let Err(e) = std::thread::Builder::new()
49        .name("WGPU".to_owned())
50        .spawn(move || {
51            WGPU::new(
52                receiver,
53                sender_clone,
54                script_sender,
55                paint_api,
56                webrender_external_image_id_manager,
57                wgpu_image_map,
58            )
59            .run();
60        })
61    {
62        warn!("Failed to spawn WGPU thread ({})", e);
63        return None;
64    }
65    Some((WebGPU(sender), script_recv))
66}