1use 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}