diff options
-rw-r--r-- | components/compositing/compositor.rs | 284 | ||||
-rw-r--r-- | components/servo/lib.rs | 6 |
2 files changed, 168 insertions, 122 deletions
diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index cd05dda82e7..b35adcf1dbb 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -96,17 +96,50 @@ impl FrameTreeId { } } +/// Data that is shared by all WebView renderers. +pub struct ServoRenderer { + /// Our top-level browsing contexts. + webviews: WebViewManager<WebView>, + + /// Tracks whether we are in the process of shutting down, or have shut down and should close + /// the compositor. + shutdown_state: ShutdownState, + + /// The port on which we receive messages. + compositor_receiver: CompositorReceiver, + + /// The channel on which messages can be sent to the constellation. + constellation_sender: Sender<ConstellationMsg>, + + /// The channel on which messages can be sent to the time profiler. + time_profiler_chan: profile_time::ProfilerChan, + + /// The WebRender [`RenderApi`] interface used to communicate with WebRender. + webrender_api: RenderApi, + + /// The GL bindings for webrender + webrender_gl: Rc<dyn gleam::gl::Gl>, + + /// True to exit after page load ('-x'). + exit_after_load: bool, + + /// The string representing the version of Servo that is running. This is used to tag + /// WebRender capture output. + version_string: String, + + #[cfg(feature = "webxr")] + /// Some XR devices want to run on the main thread. + webxr_main_thread: webxr::MainThreadRegistry, +} + /// NB: Never block on the constellation, because sometimes the constellation blocks on us. pub struct IOCompositor { + /// Data that is shared by all WebView renderers. + global: ServoRenderer, + /// The application window. pub window: Rc<dyn WindowMethods>, - /// The port on which we receive messages. - port: CompositorReceiver, - - /// Our top-level browsing contexts. - webviews: WebViewManager<WebView>, - /// Tracks details about each active pipeline that the compositor knows about. pipeline_details: HashMap<PipelineId, PipelineDetails>, @@ -126,10 +159,6 @@ pub struct IOCompositor { /// Tracks whether or not the view needs to be repainted. needs_repaint: Cell<RepaintReason>, - /// Tracks whether we are in the process of shutting down, or have shut down and should close - /// the compositor. - pub shutdown_state: ShutdownState, - /// Tracks whether the zoom action has happened recently. zoom_action: bool, @@ -139,12 +168,6 @@ pub struct IOCompositor { /// The current frame tree ID (used to reject old paint buffers) frame_tree_id: FrameTreeId, - /// The channel on which messages can be sent to the constellation. - constellation_chan: Sender<ConstellationMsg>, - - /// The channel on which messages can be sent to the time profiler. - time_profiler_chan: profile_time::ProfilerChan, - /// Touch input state machine touch_handler: TouchHandler, @@ -161,19 +184,9 @@ pub struct IOCompositor { /// The active webrender document. webrender_document: DocumentId, - /// The webrender interface, if enabled. - webrender_api: RenderApi, - /// The surfman instance that webrender targets rendering_context: Rc<dyn RenderingContext>, - /// The GL bindings for webrender - webrender_gl: Rc<dyn gleam::gl::Gl>, - - #[cfg(feature = "webxr")] - /// Some XR devices want to run on the main thread. - pub webxr_main_thread: webxr::MainThreadRegistry, - /// A per-pipeline queue of display lists that have not yet been rendered by WebRender. Layout /// expects WebRender to paint each given epoch. Once the compositor paints a frame with that /// epoch's display list, it will be removed from the queue and the paint time will be recorded @@ -190,9 +203,6 @@ pub struct IOCompositor { /// Current cursor position. cursor_pos: DevicePoint, - /// True to exit after page load ('-x'). - exit_after_load: bool, - /// True to translate mouse input into touch events. convert_mouse_to_touch: bool, @@ -202,10 +212,6 @@ pub struct IOCompositor { /// The [`Instant`] of the last animation tick, used to avoid flooding the Constellation and /// ScriptThread with a deluge of animation ticks. last_animation_tick: Instant, - - /// The string representing the version of Servo that is running. This is used to tag - /// WebRender capture output. - version_string: String, } #[derive(Clone, Copy)] @@ -341,16 +347,26 @@ impl IOCompositor { version_string: String, ) -> Self { let compositor = IOCompositor { + global: ServoRenderer { + shutdown_state: ShutdownState::NotShuttingDown, + webviews: WebViewManager::default(), + compositor_receiver: state.receiver, + constellation_sender: state.constellation_chan, + time_profiler_chan: state.time_profiler_chan, + webrender_api: state.webrender_api, + webrender_gl: state.webrender_gl, + exit_after_load, + version_string, + #[cfg(feature = "webxr")] + webxr_main_thread: state.webxr_main_thread, + }, embedder_coordinates: window.get_coordinates(), window, - port: state.receiver, - webviews: WebViewManager::default(), pipeline_details: HashMap::new(), needs_repaint: Cell::default(), touch_handler: TouchHandler::new(), pending_scroll_zoom_events: Vec::new(), composite_target, - shutdown_state: ShutdownState::NotShuttingDown, page_zoom: Scale::new(1.0), viewport_zoom: PinchZoomFactor::new(1.0), min_viewport_zoom: Some(PinchZoomFactor::new(1.0)), @@ -358,33 +374,29 @@ impl IOCompositor { zoom_action: false, zoom_time: 0f64, frame_tree_id: FrameTreeId(0), - constellation_chan: state.constellation_chan, - time_profiler_chan: state.time_profiler_chan, ready_to_save_state: ReadyState::Unknown, webrender: Some(state.webrender), webrender_document: state.webrender_document, - webrender_api: state.webrender_api, rendering_context: state.rendering_context, - webrender_gl: state.webrender_gl, - #[cfg(feature = "webxr")] - webxr_main_thread: state.webxr_main_thread, pending_paint_metrics: HashMap::new(), cursor: Cursor::None, cursor_pos: DevicePoint::new(0.0, 0.0), - exit_after_load, convert_mouse_to_touch, pending_frames: 0, last_animation_tick: Instant::now(), - version_string, }; - let gl = &compositor.webrender_gl; + let gl = &compositor.global.webrender_gl; info!("Running on {}", gl.get_string(gleam::gl::RENDERER)); info!("OpenGL Version {}", gl.get_string(gleam::gl::VERSION)); compositor.assert_gl_framebuffer_complete(); compositor } + pub fn shutdown_state(&self) -> ShutdownState { + self.global.shutdown_state + } + pub fn deinit(&mut self) { if let Err(err) = self.rendering_context.make_current() { warn!("Failed to make the rendering context current: {:?}", err); @@ -424,23 +436,27 @@ impl IOCompositor { self.cursor = cursor; let msg = ConstellationMsg::SetCursor(webview_id, cursor); - if let Err(e) = self.constellation_chan.send(msg) { + if let Err(e) = self.global.constellation_sender.send(msg) { warn!("Sending event to constellation failed ({:?}).", e); } } pub fn start_shutting_down(&mut self) { - if self.shutdown_state != ShutdownState::NotShuttingDown { + if self.global.shutdown_state != ShutdownState::NotShuttingDown { warn!("Requested shutdown while already shutting down"); return; } debug!("Compositor sending Exit message to Constellation"); - if let Err(e) = self.constellation_chan.send(ConstellationMsg::Exit) { + if let Err(e) = self + .global + .constellation_sender + .send(ConstellationMsg::Exit) + { warn!("Sending exit message to constellation failed ({:?}).", e); } - self.shutdown_state = ShutdownState::ShuttingDown; + self.global.shutdown_state = ShutdownState::ShuttingDown; } fn finish_shutting_down(&mut self) { @@ -448,22 +464,28 @@ impl IOCompositor { // Drain compositor port, sometimes messages contain channels that are blocking // another thread from finishing (i.e. SetFrameTree). - while self.port.try_recv_compositor_msg().is_some() {} + while self + .global + .compositor_receiver + .try_recv_compositor_msg() + .is_some() + {} // Tell the profiler, memory profiler, and scrolling timer to shut down. if let Ok((sender, receiver)) = ipc::channel() { - self.time_profiler_chan + self.global + .time_profiler_chan .send(profile_time::ProfilerMsg::Exit(sender)); let _ = receiver.recv(); } - self.shutdown_state = ShutdownState::FinishedShuttingDown; + self.global.shutdown_state = ShutdownState::FinishedShuttingDown; } fn handle_browser_message(&mut self, msg: CompositorMsg) { trace_msg_from_constellation!(msg, "{msg:?}"); - match self.shutdown_state { + match self.global.shutdown_state { ShutdownState::NotShuttingDown => {}, ShutdownState::ShuttingDown => { self.handle_browser_message_while_shutting_down(msg); @@ -550,7 +572,7 @@ impl IOCompositor { CompositorMsg::LoadComplete(_) => { // If we're painting in headless mode, schedule a recomposite. if matches!(self.composite_target, CompositeTarget::PngFile(_)) || - self.exit_after_load + self.global.exit_after_load { self.set_needs_repaint(RepaintReason::ReadyForScreenshot); } @@ -597,7 +619,8 @@ impl IOCompositor { let mut txn = Transaction::new(); txn.set_display_list(WebRenderEpoch(0), (pipeline, Default::default())); self.generate_frame(&mut txn, RenderReasons::SCENE); - self.webrender_api + self.global + .webrender_api .send_transaction(self.webrender_document, txn); }, @@ -633,7 +656,8 @@ impl IOCompositor { }], ); self.generate_frame(&mut txn, RenderReasons::APZ); - self.webrender_api + self.global + .webrender_api .send_transaction(self.webrender_document, txn); }, @@ -693,7 +717,8 @@ impl IOCompositor { .set_display_list(display_list_info.epoch, (pipeline_id, built_display_list)); self.update_transaction_with_all_scroll_offsets(&mut transaction); self.generate_frame(&mut transaction, RenderReasons::SCENE); - self.webrender_api + self.global + .webrender_api .send_transaction(self.webrender_document, transaction); }, @@ -708,14 +733,14 @@ impl IOCompositor { // would be to listen to the TransactionNotifier for previous per-pipeline // transactions, but that isn't easily compatible with the event loop wakeup // mechanism from libserver. - self.webrender_api.flush_scene_builder(); + self.global.webrender_api.flush_scene_builder(); let result = self.hit_test_at_point_with_flags_and_pipeline(point, flags, pipeline); let _ = sender.send(result); }, CrossProcessCompositorMessage::GenerateImageKey(sender) => { - let _ = sender.send(self.webrender_api.generate_image_key()); + let _ = sender.send(self.global.webrender_api.generate_image_key()); }, CrossProcessCompositorMessage::UpdateImages(updates) => { @@ -731,7 +756,8 @@ impl IOCompositor { }, } } - self.webrender_api + self.global + .webrender_api .send_transaction(self.webrender_document, txn); }, @@ -742,7 +768,8 @@ impl IOCompositor { CrossProcessCompositorMessage::AddSystemFont(font_key, native_handle) => { let mut transaction = Transaction::new(); transaction.add_native_font(font_key, native_handle); - self.webrender_api + self.global + .webrender_api .send_transaction(self.webrender_document, transaction); }, @@ -765,14 +792,16 @@ impl IOCompositor { transaction.delete_font(key); } - self.webrender_api + self.global + .webrender_api .send_transaction(self.webrender_document, transaction); }, CrossProcessCompositorMessage::AddImage(key, desc, data) => { let mut txn = Transaction::new(); txn.add_image(key, desc, data.into(), None); - self.webrender_api + self.global + .webrender_api .send_transaction(self.webrender_document, txn); }, @@ -782,10 +811,10 @@ impl IOCompositor { result_sender, ) => { let font_keys = (0..number_of_font_keys) - .map(|_| self.webrender_api.generate_font_key()) + .map(|_| self.global.webrender_api.generate_font_key()) .collect(); let font_instance_keys = (0..number_of_font_instance_keys) - .map(|_| self.webrender_api.generate_font_instance_key()) + .map(|_| self.global.webrender_api.generate_font_instance_key()) .collect(); let _ = result_sender.send((font_keys, font_instance_keys)); }, @@ -832,7 +861,7 @@ impl IOCompositor { CompositorMsg::CrossProcess(CrossProcessCompositorMessage::GenerateImageKey( sender, )) => { - let _ = sender.send(self.webrender_api.generate_image_key()); + let _ = sender.send(self.global.webrender_api.generate_image_key()); }, CompositorMsg::CrossProcess(CrossProcessCompositorMessage::GenerateFontKeys( number_of_font_keys, @@ -840,10 +869,10 @@ impl IOCompositor { result_sender, )) => { let font_keys = (0..number_of_font_keys) - .map(|_| self.webrender_api.generate_font_key()) + .map(|_| self.global.webrender_api.generate_font_key()) .collect(); let font_instance_keys = (0..number_of_font_instance_keys) - .map(|_| self.webrender_api.generate_font_instance_key()) + .map(|_| self.global.webrender_api.generate_font_instance_key()) .collect(); let _ = result_sender.send((font_keys, font_instance_keys)); }, @@ -947,7 +976,8 @@ impl IOCompositor { let mut transaction = Transaction::new(); self.send_root_pipeline_display_list_in_transaction(&mut transaction); self.generate_frame(&mut transaction, RenderReasons::SCENE); - self.webrender_api + self.global + .webrender_api .send_transaction(self.webrender_document, transaction); } @@ -986,7 +1016,7 @@ impl IOCompositor { let root_clip_id = builder.define_clip_rect(zoom_reference_frame, scaled_viewport_rect); let clip_chain_id = builder.define_clip_chain(None, [root_clip_id]); - for (_, webview) in self.webviews.painting_order() { + for (_, webview) in self.global.webviews.painting_order() { if let Some(pipeline_id) = webview.pipeline_id { let scaled_webview_rect = webview.rect / zoom_factor; builder.push_iframe( @@ -1042,7 +1072,7 @@ impl IOCompositor { debug!("{}: Setting frame tree for webview", frame_tree.pipeline.id); let top_level_browsing_context_id = frame_tree.pipeline.top_level_browsing_context_id; - if let Some(webview) = self.webviews.get_mut(top_level_browsing_context_id) { + if let Some(webview) = self.global.webviews.get_mut(top_level_browsing_context_id) { let new_pipeline_id = Some(frame_tree.pipeline.id); if new_pipeline_id != webview.pipeline_id { debug!( @@ -1058,7 +1088,7 @@ impl IOCompositor { "{:?}: Creating new webview with pipeline {:?}", top_level_browsing_context_id, pipeline_id ); - if let Err(WebViewAlreadyExists(webview_id)) = self.webviews.add( + if let Err(WebViewAlreadyExists(webview_id)) = self.global.webviews.add( top_level_browsing_context_id, WebView { pipeline_id, @@ -1069,7 +1099,7 @@ impl IOCompositor { return; } let msg = ConstellationMsg::WebViewOpened(top_level_browsing_context_id); - if let Err(e) = self.constellation_chan.send(msg) { + if let Err(e) = self.global.constellation_sender.send(msg) { warn!("Sending event to constellation failed ({:?}).", e); } } @@ -1083,7 +1113,7 @@ impl IOCompositor { fn remove_webview(&mut self, top_level_browsing_context_id: TopLevelBrowsingContextId) { debug!("{}: Removing", top_level_browsing_context_id); - let Ok(webview) = self.webviews.remove(top_level_browsing_context_id) else { + let Ok(webview) = self.global.webviews.remove(top_level_browsing_context_id) else { warn!("{top_level_browsing_context_id}: Removing unknown webview"); return; }; @@ -1100,7 +1130,7 @@ impl IOCompositor { debug!("{webview_id}: Moving and/or resizing webview; rect={rect:?}"); let rect_changed; let size_changed; - match self.webviews.get_mut(webview_id) { + match self.global.webviews.get_mut(webview_id) { Some(webview) => { rect_changed = rect != webview.rect; size_changed = rect.size() != webview.rect.size(); @@ -1129,15 +1159,16 @@ impl IOCompositor { debug!("{webview_id}: Showing webview; hide_others={hide_others}"); let painting_order_changed = if hide_others { let result = self + .global .webviews .painting_order() .map(|(&id, _)| id) .ne(once(webview_id)); - self.webviews.hide_all(); - self.webviews.show(webview_id)?; + self.global.webviews.hide_all(); + self.global.webviews.show(webview_id)?; result } else { - self.webviews.show(webview_id)? + self.global.webviews.show(webview_id)? }; if painting_order_changed { self.send_root_pipeline_display_list(); @@ -1147,7 +1178,7 @@ impl IOCompositor { pub fn hide_webview(&mut self, webview_id: WebViewId) -> Result<(), UnknownWebView> { debug!("{webview_id}: Hiding webview"); - if self.webviews.hide(webview_id)? { + if self.global.webviews.hide(webview_id)? { self.send_root_pipeline_display_list(); } Ok(()) @@ -1161,15 +1192,16 @@ impl IOCompositor { debug!("{webview_id}: Raising webview to top; hide_others={hide_others}"); let painting_order_changed = if hide_others { let result = self + .global .webviews .painting_order() .map(|(&id, _)| id) .ne(once(webview_id)); - self.webviews.hide_all(); - self.webviews.raise_to_top(webview_id)?; + self.global.webviews.hide_all(); + self.global.webviews.raise_to_top(webview_id)?; result } else { - self.webviews.raise_to_top(webview_id)? + self.global.webviews.raise_to_top(webview_id)? }; if painting_order_changed { self.send_root_pipeline_display_list(); @@ -1194,7 +1226,7 @@ impl IOCompositor { }, WindowSizeType::Resize, ); - if let Err(e) = self.constellation_chan.send(msg) { + if let Err(e) = self.global.constellation_sender.send(msg) { warn!("Sending window resize to constellation failed ({:?}).", e); } } @@ -1267,7 +1299,7 @@ impl IOCompositor { } pub fn on_rendering_context_resized(&mut self) -> bool { - if self.shutdown_state != ShutdownState::NotShuttingDown { + if self.global.shutdown_state != ShutdownState::NotShuttingDown { return false; } @@ -1279,7 +1311,8 @@ impl IOCompositor { let size = self.embedder_coordinates.get_viewport(); transaction.set_document_view(size); self.rendering_context.resize(size.size().to_untyped()); - self.webrender_api + self.global + .webrender_api .send_transaction(self.webrender_document, transaction); } @@ -1310,7 +1343,8 @@ impl IOCompositor { self.update_cursor(&result); if let Err(error) = self - .constellation_chan + .global + .constellation_sender .send(ConstellationMsg::ForwardInputEvent(event, Some(result))) { warn!("Sending event to constellation failed ({error:?})."); @@ -1318,7 +1352,7 @@ impl IOCompositor { } pub fn on_input_event(&mut self, event: InputEvent) { - if self.shutdown_state != ShutdownState::NotShuttingDown { + if self.global.shutdown_state != ShutdownState::NotShuttingDown { return; } @@ -1377,9 +1411,12 @@ impl IOCompositor { ) -> Vec<CompositorHitTestResult> { // DevicePoint and WorldPoint are the same for us. let world_point = WorldPoint::from_untyped(point.to_untyped()); - let results = - self.webrender_api - .hit_test(self.webrender_document, pipeline_id, world_point, flags); + let results = self.global.webrender_api.hit_test( + self.webrender_document, + pipeline_id, + world_point, + flags, + ); results .items @@ -1419,7 +1456,8 @@ impl IOCompositor { let event = InputEvent::Touch(event); if let Err(e) = self - .constellation_chan + .global + .constellation_sender .send(ConstellationMsg::ForwardInputEvent(event, Some(result))) { warn!("Sending event to constellation failed ({:?}).", e); @@ -1427,7 +1465,7 @@ impl IOCompositor { } pub fn on_touch_event(&mut self, event: TouchEvent) { - if self.shutdown_state != ShutdownState::NotShuttingDown { + if self.global.shutdown_state != ShutdownState::NotShuttingDown { return; } @@ -1567,7 +1605,7 @@ impl IOCompositor { cursor: DeviceIntPoint, event_type: TouchEventType, ) { - if self.shutdown_state != ShutdownState::NotShuttingDown { + if self.global.shutdown_state != ShutdownState::NotShuttingDown { return; } @@ -1670,7 +1708,8 @@ impl IOCompositor { } self.generate_frame(&mut transaction, RenderReasons::APZ); - self.webrender_api + self.global + .webrender_api .send_transaction(self.webrender_document, transaction); } @@ -1745,7 +1784,7 @@ impl IOCompositor { } } #[cfg(feature = "webxr")] - let webxr_running = self.webxr_main_thread.running(); + let webxr_running = self.global.webxr_main_thread.running(); #[cfg(not(feature = "webxr"))] let webxr_running = false; let animation_state = if pipeline_ids.is_empty() && !webxr_running { @@ -1777,7 +1816,7 @@ impl IOCompositor { } let msg = ConstellationMsg::TickAnimation(pipeline_id, tick_type); - if let Err(e) = self.constellation_chan.send(msg) { + if let Err(e) = self.global.constellation_sender.send(msg) { warn!("Sending tick to constellation failed ({:?}).", e); } } @@ -1800,7 +1839,7 @@ impl IOCompositor { } pub fn on_zoom_reset_window_event(&mut self) { - if self.shutdown_state != ShutdownState::NotShuttingDown { + if self.global.shutdown_state != ShutdownState::NotShuttingDown { return; } @@ -1809,7 +1848,7 @@ impl IOCompositor { } pub fn on_zoom_window_event(&mut self, magnification: f32) { - if self.shutdown_state != ShutdownState::NotShuttingDown { + if self.global.shutdown_state != ShutdownState::NotShuttingDown { return; } @@ -1819,7 +1858,7 @@ impl IOCompositor { } fn update_after_zoom_or_hidpi_change(&mut self) { - for (top_level_browsing_context_id, webview) in self.webviews.painting_order() { + for (top_level_browsing_context_id, webview) in self.global.webviews.painting_order() { self.send_window_size_message_for_top_level_browser_context( webview.rect, *top_level_browsing_context_id, @@ -1832,7 +1871,7 @@ impl IOCompositor { /// Simulate a pinch zoom pub fn on_pinch_zoom_window_event(&mut self, magnification: f32) { - if self.shutdown_state != ShutdownState::NotShuttingDown { + if self.global.shutdown_state != ShutdownState::NotShuttingDown { return; } @@ -1923,7 +1962,7 @@ impl IOCompositor { // Pass the pipeline/epoch states to the constellation and check // if it's safe to output the image. let msg = ConstellationMsg::IsReadyToSaveImage(pipeline_epochs); - if let Err(e) = self.constellation_chan.send(msg) { + if let Err(e) = self.global.constellation_sender.send(msg) { warn!("Sending ready to save to constellation failed ({:?}).", e); } self.ready_to_save_state = ReadyState::WaitingForConstellationReply; @@ -1959,7 +1998,9 @@ impl IOCompositor { // Queue up any subsequent paints for animations. self.process_animations(true); - if matches!(self.composite_target, CompositeTarget::PngFile(_)) || self.exit_after_load { + if matches!(self.composite_target, CompositeTarget::PngFile(_)) || + self.global.exit_after_load + { println!("Shutting down the Constellation after generating an output file or exit flag specified"); self.start_shutting_down(); } @@ -1991,7 +2032,7 @@ impl IOCompositor { let wait_for_stable_image = matches!( target, CompositeTarget::SharedMemory | CompositeTarget::PngFile(_) - ) || self.exit_after_load; + ) || self.global.exit_after_load; if wait_for_stable_image { // The current image may be ready to output. However, if there are animations active, @@ -2013,7 +2054,7 @@ impl IOCompositor { time_profile!( ProfilerCategory::Compositing, None, - self.time_profiler_chan.clone(), + self.global.time_profiler_chan.clone(), || { trace!("Compositing"); @@ -2066,7 +2107,7 @@ impl IOCompositor { time_profile!( ProfilerCategory::ImageSaving, None, - self.time_profiler_chan.clone(), + self.global.time_profiler_chan.clone(), || match File::create(&*path) { Ok(mut file) => { if let Some(image) = self.rendering_context.read_to_image(Rect::new( @@ -2157,7 +2198,7 @@ impl IOCompositor { } fn clear_background(&self) { - let gl = &self.webrender_gl; + let gl = &self.global.webrender_gl; self.assert_gl_framebuffer_complete(); // Always clear the entire RenderingContext, regardless of how many WebViews there are @@ -2175,15 +2216,16 @@ impl IOCompositor { #[track_caller] fn assert_no_gl_error(&self) { - debug_assert_eq!(self.webrender_gl.get_error(), gleam::gl::NO_ERROR); + debug_assert_eq!(self.global.webrender_gl.get_error(), gleam::gl::NO_ERROR); } #[track_caller] fn assert_gl_framebuffer_complete(&self) { debug_assert_eq!( ( - self.webrender_gl.get_error(), - self.webrender_gl + self.global.webrender_gl.get_error(), + self.global + .webrender_gl .check_frame_buffer_status(gleam::gl::FRAMEBUFFER) ), (gleam::gl::NO_ERROR, gleam::gl::FRAMEBUFFER_COMPLETE) @@ -2198,7 +2240,7 @@ impl IOCompositor { // Check for new messages coming from the other threads in the system. let mut compositor_messages = vec![]; let mut found_recomposite_msg = false; - while let Some(msg) = self.port.try_recv_compositor_msg() { + while let Some(msg) = self.global.compositor_receiver.try_recv_compositor_msg() { match msg { CompositorMsg::NewWebRenderFrameReady(..) if found_recomposite_msg => { // Only take one of duplicate NewWebRendeFrameReady messages, but do subtract @@ -2215,7 +2257,7 @@ impl IOCompositor { for msg in compositor_messages { self.handle_browser_message(msg); - if self.shutdown_state == ShutdownState::FinishedShuttingDown { + if self.global.shutdown_state == ShutdownState::FinishedShuttingDown { return; } } @@ -2226,7 +2268,7 @@ impl IOCompositor { tracing::instrument(skip_all, fields(servo_profiling = true), level = "trace") )] pub fn perform_updates(&mut self) -> bool { - if self.shutdown_state == ShutdownState::FinishedShuttingDown { + if self.global.shutdown_state == ShutdownState::FinishedShuttingDown { return false; } @@ -2241,7 +2283,7 @@ impl IOCompositor { #[cfg(feature = "webxr")] // Run the WebXR main thread - self.webxr_main_thread.run_one_frame(); + self.global.webxr_main_thread.run_one_frame(); // The WebXR thread may make a different context current if let Err(err) = self.rendering_context.make_current() { @@ -2250,7 +2292,7 @@ impl IOCompositor { if !self.pending_scroll_zoom_events.is_empty() { self.process_pending_scroll_events() } - self.shutdown_state != ShutdownState::FinishedShuttingDown + self.global.shutdown_state != ShutdownState::FinishedShuttingDown } pub fn pinch_zoom_level(&self) -> Scale<f32, DevicePixel, DevicePixel> { @@ -2288,7 +2330,8 @@ impl IOCompositor { let mut txn = Transaction::new(); self.generate_frame(&mut txn, RenderReasons::TESTING); - self.webrender_api + self.global + .webrender_api .send_transaction(self.webrender_document, txn); } @@ -2313,12 +2356,13 @@ impl IOCompositor { }; println!("Saving WebRender capture to {capture_path:?}"); - self.webrender_api + self.global + .webrender_api .save_capture(capture_path.clone(), CaptureBits::all()); let version_file_path = capture_path.join("servo-version.txt"); if let Err(error) = File::create(version_file_path) - .and_then(|mut file| write!(file, "{}", self.version_string)) + .and_then(|mut file| write!(file, "{}", self.global.version_string)) { eprintln!("Unable to write servo version for WebRender Capture: {error:?}"); } @@ -2346,14 +2390,16 @@ impl IOCompositor { Vec::new(), ); - self.webrender_api + self.global + .webrender_api .send_transaction(self.webrender_document, transaction); } fn add_font(&mut self, font_key: FontKey, index: u32, data: Arc<IpcSharedMemory>) { let mut transaction = Transaction::new(); transaction.add_raw_font(font_key, (**data).into(), index); - self.webrender_api + self.global + .webrender_api .send_transaction(self.webrender_document, transaction); } } diff --git a/components/servo/lib.rs b/components/servo/lib.rs index 0005e89fce2..be6c93544d7 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -629,14 +629,14 @@ impl Servo { /// The return value of this method indicates whether or not Servo, false indicates that Servo /// has finished shutting down and you should not spin the event loop any longer. pub fn spin_event_loop(&self) -> bool { - if self.compositor.borrow().shutdown_state == ShutdownState::FinishedShuttingDown { + if self.compositor.borrow().shutdown_state() == ShutdownState::FinishedShuttingDown { return false; } self.compositor.borrow_mut().receive_messages(); // Only handle incoming embedder messages if the compositor hasn't already started shutting down. - if self.compositor.borrow().shutdown_state == ShutdownState::NotShuttingDown { + if self.compositor.borrow().shutdown_state() == ShutdownState::NotShuttingDown { while let Ok(message) = self.embedder_receiver.try_recv() { self.handle_embedder_message(message) } @@ -650,7 +650,7 @@ impl Servo { self.compositor.borrow_mut().perform_updates(); self.send_new_frame_ready_messages(); - if self.compositor.borrow().shutdown_state == ShutdownState::FinishedShuttingDown { + if self.compositor.borrow().shutdown_state() == ShutdownState::FinishedShuttingDown { return false; } |