Skip to main content

webgl/webgl_mode/
inprocess.rs

1/* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
5use std::thread::JoinHandle;
6
7use log::debug;
8use paint_api::{CrossProcessPaintApi, PainterSurfmanDetailsMap, WebRenderExternalImageIdManager};
9use servo_canvas_traits::webgl::{WebGLContextId, WebGLMsg, WebGLThreads, webgl_channel};
10use surfman::Device;
11use surfman::chains::SwapChains;
12#[cfg(feature = "webxr")]
13use webxr::SurfmanGL as WebXRSurfman;
14#[cfg(feature = "webxr")]
15use webxr_api::LayerGrandManager as WebXRLayerGrandManager;
16
17use crate::webgl_thread::{WebGLContextBusyMap, WebGLThread, WebGLThreadInit};
18
19pub struct WebGLComm {
20    pub webgl_threads: WebGLThreads,
21    pub swap_chains: SwapChains<WebGLContextId, Device>,
22    pub busy_webgl_context_map: WebGLContextBusyMap,
23    #[cfg(feature = "webxr")]
24    pub webxr_layer_grand_manager: WebXRLayerGrandManager<WebXRSurfman>,
25    /// A `JoinHandle` which can be joined after sending the `WebGLMsg::Exit`
26    /// message to the `WebGLThread`.
27    pub join_handle: JoinHandle<()>,
28}
29
30impl WebGLComm {
31    /// Creates a new `WebGLComm` object.
32    pub fn new(
33        paint_api: CrossProcessPaintApi,
34        external_image_id_manager: WebRenderExternalImageIdManager,
35        painter_surfman_details_map: PainterSurfmanDetailsMap,
36    ) -> WebGLComm {
37        debug!("WebGLThreads::new()");
38        let (sender, receiver) = webgl_channel::<WebGLMsg>().unwrap();
39        let swap_chains = SwapChains::new();
40        let busy_webgl_context_map = WebGLContextBusyMap::default();
41
42        #[cfg(feature = "webxr")]
43        let webxr_init = crate::webxr::WebXRBridgeInit::new(sender.clone());
44        #[cfg(feature = "webxr")]
45        let webxr_layer_grand_manager = webxr_init.layer_grand_manager();
46
47        // This implementation creates a single `WebGLThread` for all the pipelines.
48        let init = WebGLThreadInit {
49            paint_api,
50            external_image_id_manager,
51            sender: sender.clone(),
52            receiver,
53            webrender_swap_chains: swap_chains.clone(),
54            painter_surfman_details_map,
55            busy_webgl_context_map: busy_webgl_context_map.clone(),
56            #[cfg(feature = "webxr")]
57            webxr_init,
58        };
59
60        let join_handle = WebGLThread::run_on_own_thread(init);
61
62        WebGLComm {
63            webgl_threads: WebGLThreads(sender),
64            swap_chains,
65            busy_webgl_context_map,
66            #[cfg(feature = "webxr")]
67            webxr_layer_grand_manager,
68            join_handle,
69        }
70    }
71}