webgl/webgl_mode/
inprocess.rs1use canvas_traits::webgl::{WebGLContextId, WebGLMsg, WebGLThreads, webgl_channel};
6use log::debug;
7use paint_api::{CrossProcessPaintApi, PainterSurfmanDetailsMap, WebRenderExternalImageIdManager};
8use surfman::Device;
9use surfman::chains::SwapChains;
10#[cfg(feature = "webxr")]
11use webxr::SurfmanGL as WebXRSurfman;
12#[cfg(feature = "webxr")]
13use webxr_api::LayerGrandManager as WebXRLayerGrandManager;
14
15use crate::webgl_thread::{WebGLContextBusyMap, WebGLThread, WebGLThreadInit};
16
17pub struct WebGLComm {
18 pub webgl_threads: WebGLThreads,
19 pub swap_chains: SwapChains<WebGLContextId, Device>,
20 pub busy_webgl_context_map: WebGLContextBusyMap,
21 #[cfg(feature = "webxr")]
22 pub webxr_layer_grand_manager: WebXRLayerGrandManager<WebXRSurfman>,
23}
24
25impl WebGLComm {
26 pub fn new(
28 paint_api: CrossProcessPaintApi,
29 external_image_id_manager: WebRenderExternalImageIdManager,
30 painter_surfman_details_map: PainterSurfmanDetailsMap,
31 ) -> WebGLComm {
32 debug!("WebGLThreads::new()");
33 let (sender, receiver) = webgl_channel::<WebGLMsg>().unwrap();
34 let swap_chains = SwapChains::new();
35 let busy_webgl_context_map = WebGLContextBusyMap::default();
36
37 #[cfg(feature = "webxr")]
38 let webxr_init = crate::webxr::WebXRBridgeInit::new(sender.clone());
39 #[cfg(feature = "webxr")]
40 let webxr_layer_grand_manager = webxr_init.layer_grand_manager();
41
42 let init = WebGLThreadInit {
44 paint_api,
45 external_image_id_manager,
46 sender: sender.clone(),
47 receiver,
48 webrender_swap_chains: swap_chains.clone(),
49 painter_surfman_details_map,
50 busy_webgl_context_map: busy_webgl_context_map.clone(),
51 #[cfg(feature = "webxr")]
52 webxr_init,
53 };
54
55 WebGLThread::run_on_own_thread(init);
56
57 WebGLComm {
58 webgl_threads: WebGLThreads(sender),
59 swap_chains,
60 busy_webgl_context_map,
61 #[cfg(feature = "webxr")]
62 webxr_layer_grand_manager,
63 }
64 }
65}