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