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