Skip to main content

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