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