diff options
Diffstat (limited to 'components')
-rw-r--r-- | components/compositing/Cargo.toml | 1 | ||||
-rw-r--r-- | components/compositing/compositor.rs | 86 | ||||
-rw-r--r-- | components/compositing/lib.rs | 160 | ||||
-rw-r--r-- | components/compositing_traits/Cargo.toml | 29 | ||||
-rw-r--r-- | components/compositing_traits/constellation_msg.rs | 122 | ||||
-rw-r--r-- | components/compositing_traits/lib.rs (renamed from components/compositing/compositor_thread.rs) | 138 | ||||
-rw-r--r-- | components/constellation/Cargo.toml | 2 | ||||
-rw-r--r-- | components/constellation/constellation.rs | 43 | ||||
-rw-r--r-- | components/constellation/logging.rs | 2 | ||||
-rw-r--r-- | components/constellation/pipeline.rs | 6 | ||||
-rw-r--r-- | components/servo/Cargo.toml | 1 | ||||
-rw-r--r-- | components/servo/lib.rs | 20 | ||||
-rw-r--r-- | components/webdriver_server/Cargo.toml | 2 | ||||
-rw-r--r-- | components/webdriver_server/actions.rs | 2 | ||||
-rw-r--r-- | components/webdriver_server/lib.rs | 2 |
15 files changed, 332 insertions, 284 deletions
diff --git a/components/compositing/Cargo.toml b/components/compositing/Cargo.toml index 6421de7db7e..ff02ad2e93f 100644 --- a/components/compositing/Cargo.toml +++ b/components/compositing/Cargo.toml @@ -17,6 +17,7 @@ gl = ["gleam", "pixels"] [dependencies] canvas = { path = "../canvas" } +compositing_traits = { path = "../compositing_traits" } crossbeam-channel = { workspace = true } embedder_traits = { path = "../embedder_traits" } euclid = { workspace = true } diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 8eed1ed3f66..829385c522f 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -2,18 +2,18 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -use crate::compositor_thread::CompositorReceiver; -use crate::compositor_thread::{ - InitialCompositorState, Msg, WebrenderCanvasMsg, WebrenderFontMsg, WebrenderMsg, -}; #[cfg(feature = "gl")] use crate::gl; use crate::touch::{TouchAction, TouchHandler}; use crate::windowing::{ self, EmbedderCoordinates, MouseWindowEvent, WebRenderDebugOption, WindowMethods, }; -use crate::{CompositionPipeline, ConstellationMsg, SendableFrameTree}; +use crate::InitialCompositorState; use canvas::canvas_paint_thread::ImageUpdate; +use compositing_traits::{ + CompositingReason, CompositionPipeline, CompositorMsg, CompositorReceiver, ConstellationMsg, + SendableFrameTree, WebrenderCanvasMsg, WebrenderFontMsg, WebrenderMsg, +}; use crossbeam_channel::Sender; use embedder_traits::Cursor; use euclid::{Point2D, Rect, Scale, Vector2D}; @@ -475,40 +475,40 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> { self.shutdown_state = ShutdownState::FinishedShuttingDown; } - fn handle_browser_message(&mut self, msg: Msg) -> bool { + fn handle_browser_message(&mut self, msg: CompositorMsg) -> bool { match (msg, self.shutdown_state) { (_, ShutdownState::FinishedShuttingDown) => { error!("compositor shouldn't be handling messages after shutting down"); return false; }, - (Msg::ShutdownComplete, _) => { + (CompositorMsg::ShutdownComplete, _) => { self.finish_shutting_down(); return false; }, ( - Msg::ChangeRunningAnimationsState(pipeline_id, animation_state), + CompositorMsg::ChangeRunningAnimationsState(pipeline_id, animation_state), ShutdownState::NotShuttingDown, ) => { self.change_running_animations_state(pipeline_id, animation_state); }, - (Msg::SetFrameTree(frame_tree), ShutdownState::NotShuttingDown) => { + (CompositorMsg::SetFrameTree(frame_tree), ShutdownState::NotShuttingDown) => { self.set_frame_tree(&frame_tree); self.send_scroll_positions_to_layout_for_pipeline(&frame_tree.pipeline.id); }, - (Msg::Recomposite(reason), ShutdownState::NotShuttingDown) => { + (CompositorMsg::Recomposite(reason), ShutdownState::NotShuttingDown) => { self.waiting_on_pending_frame = false; self.composition_request = CompositionRequest::CompositeNow(reason) }, - (Msg::TouchEventProcessed(result), ShutdownState::NotShuttingDown) => { + (CompositorMsg::TouchEventProcessed(result), ShutdownState::NotShuttingDown) => { self.touch_handler.on_event_processed(result); }, - (Msg::CreatePng(rect, reply), ShutdownState::NotShuttingDown) => { + (CompositorMsg::CreatePng(rect, reply), ShutdownState::NotShuttingDown) => { let res = self.composite_specific_target(CompositeTarget::WindowAndPng, rect); if let Err(ref e) = res { info!("Error retrieving PNG: {:?}", e); @@ -519,7 +519,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> { } }, - (Msg::IsReadyToSaveImageReply(is_ready), ShutdownState::NotShuttingDown) => { + (CompositorMsg::IsReadyToSaveImageReply(is_ready), ShutdownState::NotShuttingDown) => { assert_eq!( self.ready_to_save_state, ReadyState::WaitingForConstellationReply @@ -540,20 +540,23 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> { }, ( - Msg::PipelineVisibilityChanged(pipeline_id, visible), + CompositorMsg::PipelineVisibilityChanged(pipeline_id, visible), ShutdownState::NotShuttingDown, ) => { self.pipeline_details(pipeline_id).visible = visible; self.process_animations(); }, - (Msg::PipelineExited(pipeline_id, sender), _) => { + (CompositorMsg::PipelineExited(pipeline_id, sender), _) => { debug!("Compositor got pipeline exited: {:?}", pipeline_id); self.remove_pipeline_root_layer(pipeline_id); let _ = sender.send(()); }, - (Msg::NewScrollFrameReady(recomposite_needed), ShutdownState::NotShuttingDown) => { + ( + CompositorMsg::NewScrollFrameReady(recomposite_needed), + ShutdownState::NotShuttingDown, + ) => { self.waiting_for_results_of_scroll = false; if let Some(result) = self.hit_test_at_device_point(self.cursor_pos) { self.update_cursor(result); @@ -565,13 +568,13 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> { } }, - (Msg::Dispatch(func), ShutdownState::NotShuttingDown) => { + (CompositorMsg::Dispatch(func), ShutdownState::NotShuttingDown) => { // The functions sent here right now are really dumb, so they can't panic. // But if we start running more complex code here, we should really catch panic here. func(); }, - (Msg::LoadComplete(_), ShutdownState::NotShuttingDown) => { + (CompositorMsg::LoadComplete(_), ShutdownState::NotShuttingDown) => { // If we're painting in headless mode, schedule a recomposite. if self.output_file.is_some() || self.exit_after_load { self.composite_if_necessary(CompositingReason::Headless); @@ -579,7 +582,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> { }, ( - Msg::WebDriverMouseButtonEvent(mouse_event_type, mouse_button, x, y), + CompositorMsg::WebDriverMouseButtonEvent(mouse_event_type, mouse_button, x, y), ShutdownState::NotShuttingDown, ) => { let dppx = self.device_pixels_per_page_px(); @@ -591,29 +594,29 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> { }); }, - (Msg::WebDriverMouseMoveEvent(x, y), ShutdownState::NotShuttingDown) => { + (CompositorMsg::WebDriverMouseMoveEvent(x, y), ShutdownState::NotShuttingDown) => { let dppx = self.device_pixels_per_page_px(); let point = dppx.transform_point(Point2D::new(x, y)); self.on_mouse_window_move_event_class(DevicePoint::new(point.x, point.y)); }, - (Msg::PendingPaintMetric(pipeline_id, epoch), _) => { + (CompositorMsg::PendingPaintMetric(pipeline_id, epoch), _) => { self.pending_paint_metrics.insert(pipeline_id, epoch); }, - (Msg::GetClientWindow(req), ShutdownState::NotShuttingDown) => { + (CompositorMsg::GetClientWindow(req), ShutdownState::NotShuttingDown) => { if let Err(e) = req.send(self.embedder_coordinates.window) { warn!("Sending response to get client window failed ({:?}).", e); } }, - (Msg::GetScreenSize(req), ShutdownState::NotShuttingDown) => { + (CompositorMsg::GetScreenSize(req), ShutdownState::NotShuttingDown) => { if let Err(e) = req.send(self.embedder_coordinates.screen) { warn!("Sending response to get screen size failed ({:?}).", e); } }, - (Msg::GetScreenAvailSize(req), ShutdownState::NotShuttingDown) => { + (CompositorMsg::GetScreenAvailSize(req), ShutdownState::NotShuttingDown) => { if let Err(e) = req.send(self.embedder_coordinates.screen_avail) { warn!( "Sending response to get screen avail size failed ({:?}).", @@ -622,7 +625,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> { } }, - (Msg::Webrender(msg), ShutdownState::NotShuttingDown) => { + (CompositorMsg::Webrender(msg), ShutdownState::NotShuttingDown) => { self.handle_webrender_message(msg); }, @@ -1807,8 +1810,8 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> { let mut found_recomposite_msg = false; while let Some(msg) = self.port.try_recv_compositor_msg() { match msg { - Msg::Recomposite(_) if found_recomposite_msg => {}, - Msg::Recomposite(_) => { + CompositorMsg::Recomposite(_) if found_recomposite_msg => {}, + CompositorMsg::Recomposite(_) => { found_recomposite_msg = true; compositor_messages.push(msg) }, @@ -1858,7 +1861,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> { while self.shutdown_state != ShutdownState::ShuttingDown { let msg = self.port.recv_compositor_msg(); let need_recomposite = match msg { - Msg::Recomposite(_) => true, + CompositorMsg::Recomposite(_) => true, _ => false, }; let keep_going = self.handle_browser_message(msg); @@ -1955,30 +1958,3 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> { self.external_present = value; } } - -/// Why we performed a composite. This is used for debugging. -#[derive(Clone, Copy, Debug, PartialEq)] -pub enum CompositingReason { - /// We hit the delayed composition timeout. (See `delayed_composition.rs`.) - DelayedCompositeTimeout, - /// The window has been scrolled and we're starting the first recomposite. - Scroll, - /// A scroll has continued and we need to recomposite again. - ContinueScroll, - /// We're performing the single composite in headless mode. - Headless, - /// We're performing a composite to run an animation. - Animation, - /// A new frame tree has been loaded. - NewFrameTree, - /// New painted buffers have been received. - NewPaintedBuffers, - /// The window has been zoomed. - Zoom, - /// A new WebRender frame has arrived. - NewWebRenderFrame, - /// WebRender has processed a scroll event and has generated a new frame. - NewWebRenderScrollFrame, - /// The window has been resized and will need to be synchronously repainted. - Resize, -} diff --git a/components/compositing/lib.rs b/components/compositing/lib.rs index 554f36df833..a91d08c9247 100644 --- a/components/compositing/lib.rs +++ b/components/compositing/lib.rs @@ -7,145 +7,41 @@ #[macro_use] extern crate log; -pub use crate::compositor::CompositingReason; pub use crate::compositor::IOCompositor; pub use crate::compositor::ShutdownState; -pub use crate::compositor_thread::CompositorProxy; -use embedder_traits::Cursor; -use gfx_traits::Epoch; -use ipc_channel::ipc::IpcSender; -use keyboard_types::KeyboardEvent; -use msg::constellation_msg::PipelineId; -use msg::constellation_msg::TopLevelBrowsingContextId; -use msg::constellation_msg::{BrowsingContextId, TraversalDirection}; -use script_traits::{ - AnimationTickType, LogEntry, WebDriverCommandMsg, WindowSizeData, WindowSizeType, -}; -use script_traits::{ - CompositorEvent, ConstellationControlMsg, LayoutControlMsg, MediaSessionActionType, -}; -use servo_url::ServoUrl; -use std::collections::HashMap; -use std::fmt; -use std::time::Duration; + +use compositing_traits::{CompositorProxy, CompositorReceiver, ConstellationMsg}; +use crossbeam_channel::Sender; +use profile_traits::mem; +use profile_traits::time; +use std::rc::Rc; +use webrender_api::DocumentId; +use webrender_api::RenderApi; +use webrender_surfman::WebrenderSurfman; mod compositor; -pub mod compositor_thread; #[cfg(feature = "gl")] mod gl; mod touch; pub mod windowing; -pub struct SendableFrameTree { - pub pipeline: CompositionPipeline, - pub children: Vec<SendableFrameTree>, -} - -/// The subset of the pipeline that is needed for layer composition. -#[derive(Clone)] -pub struct CompositionPipeline { - pub id: PipelineId, - pub top_level_browsing_context_id: TopLevelBrowsingContextId, - pub script_chan: IpcSender<ConstellationControlMsg>, - pub layout_chan: IpcSender<LayoutControlMsg>, -} - -/// Messages to the constellation. -pub enum ConstellationMsg { - /// Exit the constellation. - Exit, - /// Request that the constellation send the BrowsingContextId corresponding to the document - /// with the provided pipeline id - GetBrowsingContext(PipelineId, IpcSender<Option<BrowsingContextId>>), - /// Request that the constellation send the current pipeline id for the provided - /// browsing context id, over a provided channel. - GetPipeline(BrowsingContextId, IpcSender<Option<PipelineId>>), - /// Request that the constellation send the current focused top-level browsing context id, - /// over a provided channel. - GetFocusTopLevelBrowsingContext(IpcSender<Option<TopLevelBrowsingContextId>>), - /// Query the constellation to see if the current compositor output is stable - IsReadyToSaveImage(HashMap<PipelineId, Epoch>), - /// Inform the constellation of a key event. - Keyboard(KeyboardEvent), - /// Whether to allow script to navigate. - AllowNavigationResponse(PipelineId, bool), - /// Request to load a page. - LoadUrl(TopLevelBrowsingContextId, ServoUrl), - /// Clear the network cache. - ClearCache, - /// Request to traverse the joint session history of the provided browsing context. - TraverseHistory(TopLevelBrowsingContextId, TraversalDirection), - /// Inform the constellation of a window being resized. - WindowSize(TopLevelBrowsingContextId, WindowSizeData, WindowSizeType), - /// Requests that the constellation instruct layout to begin a new tick of the animation. - TickAnimation(PipelineId, AnimationTickType), - /// Dispatch a webdriver command - WebDriverCommand(WebDriverCommandMsg), - /// Reload a top-level browsing context. - Reload(TopLevelBrowsingContextId), - /// A log entry, with the top-level browsing context id and thread name - LogEntry(Option<TopLevelBrowsingContextId>, Option<String>, LogEntry), - /// Create a new top level browsing context. - NewBrowser(ServoUrl, TopLevelBrowsingContextId), - /// Close a top level browsing context. - CloseBrowser(TopLevelBrowsingContextId), - /// Panic a top level browsing context. - SendError(Option<TopLevelBrowsingContextId>, String), - /// Make browser visible. - SelectBrowser(TopLevelBrowsingContextId), - /// Forward an event to the script task of the given pipeline. - ForwardEvent(PipelineId, CompositorEvent), - /// Requesting a change to the onscreen cursor. - SetCursor(Cursor), - /// Enable the sampling profiler, with a given sampling rate and max total sampling duration. - EnableProfiler(Duration, Duration), - /// Disable the sampling profiler. - DisableProfiler, - /// Request to exit from fullscreen mode - ExitFullScreen(TopLevelBrowsingContextId), - /// Media session action. - MediaSessionAction(MediaSessionActionType), - /// Toggle browser visibility. - ChangeBrowserVisibility(TopLevelBrowsingContextId, bool), - /// Virtual keyboard was dismissed - IMEDismissed, - /// Compositing done, but external code needs to present. - ReadyToPresent(TopLevelBrowsingContextId), -} - -impl fmt::Debug for ConstellationMsg { - fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - use self::ConstellationMsg::*; - let variant = match *self { - Exit => "Exit", - GetBrowsingContext(..) => "GetBrowsingContext", - GetPipeline(..) => "GetPipeline", - GetFocusTopLevelBrowsingContext(..) => "GetFocusTopLevelBrowsingContext", - IsReadyToSaveImage(..) => "IsReadyToSaveImage", - Keyboard(..) => "Keyboard", - AllowNavigationResponse(..) => "AllowNavigationResponse", - LoadUrl(..) => "LoadUrl", - TraverseHistory(..) => "TraverseHistory", - WindowSize(..) => "WindowSize", - TickAnimation(..) => "TickAnimation", - WebDriverCommand(..) => "WebDriverCommand", - Reload(..) => "Reload", - LogEntry(..) => "LogEntry", - NewBrowser(..) => "NewBrowser", - CloseBrowser(..) => "CloseBrowser", - SendError(..) => "SendError", - SelectBrowser(..) => "SelectBrowser", - ForwardEvent(..) => "ForwardEvent", - SetCursor(..) => "SetCursor", - EnableProfiler(..) => "EnableProfiler", - DisableProfiler => "DisableProfiler", - ExitFullScreen(..) => "ExitFullScreen", - MediaSessionAction(..) => "MediaSessionAction", - ChangeBrowserVisibility(..) => "ChangeBrowserVisibility", - IMEDismissed => "IMEDismissed", - ClearCache => "ClearCache", - ReadyToPresent(..) => "ReadyToPresent", - }; - write!(formatter, "ConstellationMsg::{}", variant) - } +/// Data used to construct a compositor. +pub struct InitialCompositorState { + /// A channel to the compositor. + pub sender: CompositorProxy, + /// A port on which messages inbound to the compositor can be received. + pub receiver: CompositorReceiver, + /// A channel to the constellation. + pub constellation_chan: Sender<ConstellationMsg>, + /// A channel to the time profiler thread. + pub time_profiler_chan: time::ProfilerChan, + /// A channel to the memory profiler thread. + pub mem_profiler_chan: mem::ProfilerChan, + /// Instance of webrender API + pub webrender: webrender::Renderer, + pub webrender_document: DocumentId, + pub webrender_api: RenderApi, + pub webrender_surfman: WebrenderSurfman, + pub webrender_gl: Rc<dyn gleam::gl::Gl>, + pub webxr_main_thread: webxr::MainThreadRegistry, } diff --git a/components/compositing_traits/Cargo.toml b/components/compositing_traits/Cargo.toml new file mode 100644 index 00000000000..c4f3f6b05f0 --- /dev/null +++ b/components/compositing_traits/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "compositing_traits" +version = "0.0.1" +authors = ["The Servo Project Developers"] +license = "MPL-2.0" +edition = "2018" +publish = false + +[lib] +name = "compositing_traits" +path = "lib.rs" + +[dependencies] +canvas = { path = "../canvas" } +crossbeam-channel = { workspace = true } +embedder_traits = { path = "../embedder_traits" } +euclid = { workspace = true } +gfx_traits = { path = "../gfx_traits" } +ipc-channel = { workspace = true } +keyboard-types = { workspace = true } +log = { workspace = true } +msg = { path = "../msg" } +net_traits = { path = "../net_traits" } +profile_traits = { path = "../profile_traits" } +script_traits = { path = "../script_traits" } +servo_url = { path = "../url" } +style_traits = { path = "../style_traits" } +webrender_api = { workspace = true } +webrender_surfman = { path = "../webrender_surfman" } diff --git a/components/compositing_traits/constellation_msg.rs b/components/compositing_traits/constellation_msg.rs new file mode 100644 index 00000000000..baf2c9b1c16 --- /dev/null +++ b/components/compositing_traits/constellation_msg.rs @@ -0,0 +1,122 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +use embedder_traits::Cursor; +use gfx_traits::Epoch; +use ipc_channel::ipc::IpcSender; +use keyboard_types::KeyboardEvent; +use msg::constellation_msg::PipelineId; +use msg::constellation_msg::TopLevelBrowsingContextId; +use msg::constellation_msg::{BrowsingContextId, TraversalDirection}; +use script_traits::AnimationTickType; +use script_traits::CompositorEvent; +use script_traits::LogEntry; +use script_traits::MediaSessionActionType; +use script_traits::WebDriverCommandMsg; +use script_traits::WindowSizeData; +use script_traits::WindowSizeType; +use servo_url::ServoUrl; +use std::collections::HashMap; +use std::fmt; +use std::time::Duration; + +/// Messages to the constellation. +pub enum ConstellationMsg { + /// Exit the constellation. + Exit, + /// Request that the constellation send the BrowsingContextId corresponding to the document + /// with the provided pipeline id + GetBrowsingContext(PipelineId, IpcSender<Option<BrowsingContextId>>), + /// Request that the constellation send the current pipeline id for the provided + /// browsing context id, over a provided channel. + GetPipeline(BrowsingContextId, IpcSender<Option<PipelineId>>), + /// Request that the constellation send the current focused top-level browsing context id, + /// over a provided channel. + GetFocusTopLevelBrowsingContext(IpcSender<Option<TopLevelBrowsingContextId>>), + /// Query the constellation to see if the current compositor output is stable + IsReadyToSaveImage(HashMap<PipelineId, Epoch>), + /// Inform the constellation of a key event. + Keyboard(KeyboardEvent), + /// Whether to allow script to navigate. + AllowNavigationResponse(PipelineId, bool), + /// Request to load a page. + LoadUrl(TopLevelBrowsingContextId, ServoUrl), + /// Clear the network cache. + ClearCache, + /// Request to traverse the joint session history of the provided browsing context. + TraverseHistory(TopLevelBrowsingContextId, TraversalDirection), + /// Inform the constellation of a window being resized. + WindowSize(TopLevelBrowsingContextId, WindowSizeData, WindowSizeType), + /// Requests that the constellation instruct layout to begin a new tick of the animation. + TickAnimation(PipelineId, AnimationTickType), + /// Dispatch a webdriver command + WebDriverCommand(WebDriverCommandMsg), + /// Reload a top-level browsing context. + Reload(TopLevelBrowsingContextId), + /// A log entry, with the top-level browsing context id and thread name + LogEntry(Option<TopLevelBrowsingContextId>, Option<String>, LogEntry), + /// Create a new top level browsing context. + NewBrowser(ServoUrl, TopLevelBrowsingContextId), + /// Close a top level browsing context. + CloseBrowser(TopLevelBrowsingContextId), + /// Panic a top level browsing context. + SendError(Option<TopLevelBrowsingContextId>, String), + /// Make browser visible. + SelectBrowser(TopLevelBrowsingContextId), + /// Forward an event to the script task of the given pipeline. + ForwardEvent(PipelineId, CompositorEvent), + /// Requesting a change to the onscreen cursor. + SetCursor(Cursor), + /// Enable the sampling profiler, with a given sampling rate and max total sampling duration. + EnableProfiler(Duration, Duration), + /// Disable the sampling profiler. + DisableProfiler, + /// Request to exit from fullscreen mode + ExitFullScreen(TopLevelBrowsingContextId), + /// Media session action. + MediaSessionAction(MediaSessionActionType), + /// Toggle browser visibility. + ChangeBrowserVisibility(TopLevelBrowsingContextId, bool), + /// Virtual keyboard was dismissed + IMEDismissed, + /// Compositing done, but external code needs to present. + ReadyToPresent(TopLevelBrowsingContextId), +} + +impl fmt::Debug for ConstellationMsg { + fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + use self::ConstellationMsg::*; + let variant = match *self { + Exit => "Exit", + GetBrowsingContext(..) => "GetBrowsingContext", + GetPipeline(..) => "GetPipeline", + GetFocusTopLevelBrowsingContext(..) => "GetFocusTopLevelBrowsingContext", + IsReadyToSaveImage(..) => "IsReadyToSaveImage", + Keyboard(..) => "Keyboard", + AllowNavigationResponse(..) => "AllowNavigationResponse", + LoadUrl(..) => "LoadUrl", + TraverseHistory(..) => "TraverseHistory", + WindowSize(..) => "WindowSize", + TickAnimation(..) => "TickAnimation", + WebDriverCommand(..) => "WebDriverCommand", + Reload(..) => "Reload", + LogEntry(..) => "LogEntry", + NewBrowser(..) => "NewBrowser", + CloseBrowser(..) => "CloseBrowser", + SendError(..) => "SendError", + SelectBrowser(..) => "SelectBrowser", + ForwardEvent(..) => "ForwardEvent", + SetCursor(..) => "SetCursor", + EnableProfiler(..) => "EnableProfiler", + DisableProfiler => "DisableProfiler", + ExitFullScreen(..) => "ExitFullScreen", + MediaSessionAction(..) => "MediaSessionAction", + ChangeBrowserVisibility(..) => "ChangeBrowserVisibility", + IMEDismissed => "IMEDismissed", + ClearCache => "ClearCache", + ReadyToPresent(..) => "ReadyToPresent", + }; + write!(formatter, "ConstellationMsg::{}", variant) + } +} diff --git a/components/compositing/compositor_thread.rs b/components/compositing_traits/lib.rs index fc7e7c12bab..41ef1ed723d 100644 --- a/components/compositing/compositor_thread.rs +++ b/components/compositing_traits/lib.rs @@ -4,8 +4,13 @@ //! Communication with the compositor thread. -use crate::compositor::CompositingReason; -use crate::{ConstellationMsg, SendableFrameTree}; +#[macro_use] +extern crate log; + +mod constellation_msg; + +pub use constellation_msg::ConstellationMsg; + use canvas::canvas_paint_thread::ImageUpdate; use crossbeam_channel::{Receiver, Sender}; use embedder_traits::EventLoopWaker; @@ -14,24 +19,50 @@ use gfx_traits::Epoch; use ipc_channel::ipc::IpcSender; use msg::constellation_msg::{PipelineId, TopLevelBrowsingContextId}; use net_traits::image::base::Image; -use profile_traits::mem; -use profile_traits::time; -use script_traits::{AnimationState, EventResult, MouseButton, MouseEventType}; +use script_traits::{ + AnimationState, ConstellationControlMsg, EventResult, LayoutControlMsg, MouseButton, + MouseEventType, +}; use std::fmt::{Debug, Error, Formatter}; -use std::rc::Rc; use style_traits::CSSPixel; use webrender_api::units::{DeviceIntPoint, DeviceIntSize}; -use webrender_api::{self, DocumentId, FontInstanceKey, FontKey, ImageKey, RenderApi}; -use webrender_surfman::WebrenderSurfman; +use webrender_api::{self, FontInstanceKey, FontKey, ImageKey}; + +/// Why we performed a composite. This is used for debugging. +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum CompositingReason { + /// We hit the delayed composition timeout. (See `delayed_composition.rs`.) + DelayedCompositeTimeout, + /// The window has been scrolled and we're starting the first recomposite. + Scroll, + /// A scroll has continued and we need to recomposite again. + ContinueScroll, + /// We're performing the single composite in headless mode. + Headless, + /// We're performing a composite to run an animation. + Animation, + /// A new frame tree has been loaded. + NewFrameTree, + /// New painted buffers have been received. + NewPaintedBuffers, + /// The window has been zoomed. + Zoom, + /// A new WebRender frame has arrived. + NewWebRenderFrame, + /// WebRender has processed a scroll event and has generated a new frame. + NewWebRenderScrollFrame, + /// The window has been resized and will need to be synchronously repainted. + Resize, +} /// Sends messages to the compositor. pub struct CompositorProxy { - pub sender: Sender<Msg>, + pub sender: Sender<CompositorMsg>, pub event_loop_waker: Box<dyn EventLoopWaker>, } impl CompositorProxy { - pub fn send(&self, msg: Msg) { + pub fn send(&self, msg: CompositorMsg) { if let Err(err) = self.sender.send(msg) { warn!("Failed to send response ({:?}).", err); } @@ -50,26 +81,26 @@ impl Clone for CompositorProxy { /// The port that the compositor receives messages on. pub struct CompositorReceiver { - pub receiver: Receiver<Msg>, + pub receiver: Receiver<CompositorMsg>, } impl CompositorReceiver { - pub fn try_recv_compositor_msg(&mut self) -> Option<Msg> { + pub fn try_recv_compositor_msg(&mut self) -> Option<CompositorMsg> { self.receiver.try_recv().ok() } - pub fn recv_compositor_msg(&mut self) -> Msg { + pub fn recv_compositor_msg(&mut self) -> CompositorMsg { self.receiver.recv().unwrap() } } impl CompositorProxy { pub fn recomposite(&self, reason: CompositingReason) { - self.send(Msg::Recomposite(reason)); + self.send(CompositorMsg::Recomposite(reason)); } } -/// Messages from the painting thread and the constellation thread to the compositor thread. -pub enum Msg { +/// Messages from (or via) the constellation thread to the compositor. +pub enum CompositorMsg { /// Informs the compositor that the constellation has completed shutdown. /// Required because the constellation can have pending calls to make /// (e.g. SetFrameTree) at the time that we send it an ExitMsg. @@ -123,6 +154,20 @@ pub enum Msg { Webrender(WebrenderMsg), } +pub struct SendableFrameTree { + pub pipeline: CompositionPipeline, + pub children: Vec<SendableFrameTree>, +} + +/// The subset of the pipeline that is needed for layer composition. +#[derive(Clone)] +pub struct CompositionPipeline { + pub id: PipelineId, + pub top_level_browsing_context_id: TopLevelBrowsingContextId, + pub script_chan: IpcSender<ConstellationControlMsg>, + pub layout_chan: IpcSender<LayoutControlMsg>, +} + pub enum WebrenderFontMsg { AddFontInstance(FontKey, f32, Sender<FontInstanceKey>), AddFont(gfx_traits::FontData, Sender<FontKey>), @@ -140,51 +185,30 @@ pub enum WebrenderMsg { Canvas(WebrenderCanvasMsg), } -impl Debug for Msg { +impl Debug for CompositorMsg { fn fmt(&self, f: &mut Formatter) -> Result<(), Error> { match *self { - Msg::ShutdownComplete => write!(f, "ShutdownComplete"), - Msg::ChangeRunningAnimationsState(_, state) => { + CompositorMsg::ShutdownComplete => write!(f, "ShutdownComplete"), + CompositorMsg::ChangeRunningAnimationsState(_, state) => { write!(f, "ChangeRunningAnimationsState({:?})", state) }, - Msg::SetFrameTree(..) => write!(f, "SetFrameTree"), - Msg::Recomposite(..) => write!(f, "Recomposite"), - Msg::TouchEventProcessed(..) => write!(f, "TouchEventProcessed"), - Msg::CreatePng(..) => write!(f, "CreatePng"), - Msg::IsReadyToSaveImageReply(..) => write!(f, "IsReadyToSaveImageReply"), - Msg::PipelineVisibilityChanged(..) => write!(f, "PipelineVisibilityChanged"), - Msg::PipelineExited(..) => write!(f, "PipelineExited"), - Msg::NewScrollFrameReady(..) => write!(f, "NewScrollFrameReady"), - Msg::Dispatch(..) => write!(f, "Dispatch"), - Msg::PendingPaintMetric(..) => write!(f, "PendingPaintMetric"), - Msg::LoadComplete(..) => write!(f, "LoadComplete"), - Msg::WebDriverMouseButtonEvent(..) => write!(f, "WebDriverMouseButtonEvent"), - Msg::WebDriverMouseMoveEvent(..) => write!(f, "WebDriverMouseMoveEvent"), - Msg::GetClientWindow(..) => write!(f, "GetClientWindow"), - Msg::GetScreenSize(..) => write!(f, "GetScreenSize"), - Msg::GetScreenAvailSize(..) => write!(f, "GetScreenAvailSize"), - Msg::Webrender(..) => write!(f, "Webrender"), + CompositorMsg::SetFrameTree(..) => write!(f, "SetFrameTree"), + CompositorMsg::Recomposite(..) => write!(f, "Recomposite"), + CompositorMsg::TouchEventProcessed(..) => write!(f, "TouchEventProcessed"), + CompositorMsg::CreatePng(..) => write!(f, "CreatePng"), + CompositorMsg::IsReadyToSaveImageReply(..) => write!(f, "IsReadyToSaveImageReply"), + CompositorMsg::PipelineVisibilityChanged(..) => write!(f, "PipelineVisibilityChanged"), + CompositorMsg::PipelineExited(..) => write!(f, "PipelineExited"), + CompositorMsg::NewScrollFrameReady(..) => write!(f, "NewScrollFrameReady"), + CompositorMsg::Dispatch(..) => write!(f, "Dispatch"), + CompositorMsg::PendingPaintMetric(..) => write!(f, "PendingPaintMetric"), + CompositorMsg::LoadComplete(..) => write!(f, "LoadComplete"), + CompositorMsg::WebDriverMouseButtonEvent(..) => write!(f, "WebDriverMouseButtonEvent"), + CompositorMsg::WebDriverMouseMoveEvent(..) => write!(f, "WebDriverMouseMoveEvent"), + CompositorMsg::GetClientWindow(..) => write!(f, "GetClientWindow"), + CompositorMsg::GetScreenSize(..) => write!(f, "GetScreenSize"), + CompositorMsg::GetScreenAvailSize(..) => write!(f, "GetScreenAvailSize"), + CompositorMsg::Webrender(..) => write!(f, "Webrender"), } } } - -/// Data used to construct a compositor. -pub struct InitialCompositorState { - /// A channel to the compositor. - pub sender: CompositorProxy, - /// A port on which messages inbound to the compositor can be received. - pub receiver: CompositorReceiver, - /// A channel to the constellation. - pub constellation_chan: Sender<ConstellationMsg>, - /// A channel to the time profiler thread. - pub time_profiler_chan: time::ProfilerChan, - /// A channel to the memory profiler thread. - pub mem_profiler_chan: mem::ProfilerChan, - /// Instance of webrender API - pub webrender: webrender::Renderer, - pub webrender_document: DocumentId, - pub webrender_api: RenderApi, - pub webrender_surfman: WebrenderSurfman, - pub webrender_gl: Rc<dyn gleam::gl::Gl>, - pub webxr_main_thread: webxr::MainThreadRegistry, -} diff --git a/components/constellation/Cargo.toml b/components/constellation/Cargo.toml index fa260f102ad..1544fceba57 100644 --- a/components/constellation/Cargo.toml +++ b/components/constellation/Cargo.toml @@ -15,7 +15,7 @@ background_hang_monitor = { path = "../background_hang_monitor" } backtrace = { workspace = true } bluetooth_traits = { path = "../bluetooth_traits" } canvas_traits = { path = "../canvas_traits" } -compositing = { path = "../compositing" } +compositing_traits = { path = "../compositing_traits" } crossbeam-channel = { workspace = true } devtools_traits = { path = "../devtools_traits" } embedder_traits = { path = "../embedder_traits" } diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index 0eb88c42761..37236789655 100644 --- a/components/constellation/constellation.rs +++ b/components/constellation/constellation.rs @@ -106,10 +106,10 @@ use bluetooth_traits::BluetoothRequest; use canvas_traits::canvas::{CanvasId, CanvasMsg}; use canvas_traits::webgl::WebGLThreads; use canvas_traits::ConstellationCanvasMsg; -use compositing::compositor_thread::CompositorProxy; -use compositing::compositor_thread::Msg as ToCompositorMsg; -use compositing::compositor_thread::WebrenderMsg; -use compositing::{ConstellationMsg as FromCompositorMsg, SendableFrameTree}; +use compositing_traits::{ + CompositorMsg, CompositorProxy, ConstellationMsg as FromCompositorMsg, SendableFrameTree, + WebrenderMsg, +}; use crossbeam_channel::{after, never, unbounded, Receiver, Sender}; use devtools_traits::{ ChromeToDevtoolsControlMsg, DevtoolsControlMsg, DevtoolsPageInfo, NavigationState, @@ -724,7 +724,7 @@ where ROUTER.add_route( webrender_ipc_receiver.to_opaque(), Box::new(move |message| { - let _ = compositor_proxy.send(ToCompositorMsg::Webrender( + let _ = compositor_proxy.send(CompositorMsg::Webrender( WebrenderMsg::Layout(message.to().expect("conversion failure")), )); }), @@ -734,9 +734,9 @@ where ROUTER.add_route( webrender_image_ipc_receiver.to_opaque(), Box::new(move |message| { - let _ = compositor_proxy.send(ToCompositorMsg::Webrender( - WebrenderMsg::Net(message.to().expect("conversion failure")), - )); + let _ = compositor_proxy.send(CompositorMsg::Webrender(WebrenderMsg::Net( + message.to().expect("conversion failure"), + ))); }), ); @@ -1467,7 +1467,7 @@ where } let is_ready = is_ready == ReadyToSave::Ready; self.compositor_proxy - .send(ToCompositorMsg::IsReadyToSaveImageReply(is_ready)); + .send(CompositorMsg::IsReadyToSaveImageReply(is_ready)); if self.is_running_problem_test { println!("sent response"); } @@ -1735,22 +1735,22 @@ where }, FromScriptMsg::GetClientWindow(response_sender) => { self.compositor_proxy - .send(ToCompositorMsg::GetClientWindow(response_sender)); + .send(CompositorMsg::GetClientWindow(response_sender)); }, FromScriptMsg::GetScreenSize(response_sender) => { self.compositor_proxy - .send(ToCompositorMsg::GetScreenSize(response_sender)); + .send(CompositorMsg::GetScreenSize(response_sender)); }, FromScriptMsg::GetScreenAvailSize(response_sender) => { self.compositor_proxy - .send(ToCompositorMsg::GetScreenAvailSize(response_sender)); + .send(CompositorMsg::GetScreenAvailSize(response_sender)); }, FromScriptMsg::LogEntry(thread_name, entry) => { self.handle_log_entry(Some(source_top_ctx_id), thread_name, entry); }, FromScriptMsg::TouchEventProcessed(result) => self .compositor_proxy - .send(ToCompositorMsg::TouchEventProcessed(result)), + .send(CompositorMsg::TouchEventProcessed(result)), FromScriptMsg::GetBrowsingContextInfo(pipeline_id, response_sender) => { let result = self .pipelines @@ -2734,8 +2734,7 @@ where } debug!("Asking compositor to complete shutdown."); - self.compositor_proxy - .send(ToCompositorMsg::ShutdownComplete); + self.compositor_proxy.send(CompositorMsg::ShutdownComplete); debug!("Shutting-down IPC router thread in constellation."); ROUTER.shutdown(); @@ -3344,7 +3343,7 @@ where fn handle_pending_paint_metric(&self, pipeline_id: PipelineId, epoch: Epoch) { self.compositor_proxy - .send(ToCompositorMsg::PendingPaintMetric(pipeline_id, epoch)) + .send(CompositorMsg::PendingPaintMetric(pipeline_id, epoch)) } fn handle_set_cursor_msg(&mut self, cursor: Cursor) { @@ -3361,7 +3360,7 @@ where if pipeline.animation_state != animation_state { pipeline.animation_state = animation_state; self.compositor_proxy - .send(ToCompositorMsg::ChangeRunningAnimationsState( + .send(CompositorMsg::ChangeRunningAnimationsState( pipeline_id, animation_state, )) @@ -3598,7 +3597,7 @@ where if !current_top_level_pipeline_will_be_replaced { // Notify embedder and compositor top level document finished loading. self.compositor_proxy - .send(ToCompositorMsg::LoadComplete(top_level_browsing_context_id)); + .send(CompositorMsg::LoadComplete(top_level_browsing_context_id)); } } else { self.handle_subframe_loaded(pipeline_id); @@ -4435,7 +4434,7 @@ where }, WebDriverCommandMsg::MouseButtonAction(mouse_event_type, mouse_button, x, y) => { self.compositor_proxy - .send(ToCompositorMsg::WebDriverMouseButtonEvent( + .send(CompositorMsg::WebDriverMouseButtonEvent( mouse_event_type, mouse_button, x, @@ -4444,11 +4443,11 @@ where }, WebDriverCommandMsg::MouseMoveAction(x, y) => { self.compositor_proxy - .send(ToCompositorMsg::WebDriverMouseMoveEvent(x, y)); + .send(CompositorMsg::WebDriverMouseMoveEvent(x, y)); }, WebDriverCommandMsg::TakeScreenshot(_, rect, response_sender) => { self.compositor_proxy - .send(ToCompositorMsg::CreatePng(rect, response_sender)); + .send(CompositorMsg::CreatePng(rect, response_sender)); }, } } @@ -5454,7 +5453,7 @@ where ); self.active_browser_id = Some(top_level_browsing_context_id); self.compositor_proxy - .send(ToCompositorMsg::SetFrameTree(frame_tree)); + .send(CompositorMsg::SetFrameTree(frame_tree)); } } diff --git a/components/constellation/logging.rs b/components/constellation/logging.rs index c267565658f..5fbd75d86cf 100644 --- a/components/constellation/logging.rs +++ b/components/constellation/logging.rs @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use backtrace::Backtrace; -use compositing::ConstellationMsg as FromCompositorMsg; +use compositing_traits::ConstellationMsg as FromCompositorMsg; use crossbeam_channel::Sender; use log::{Level, LevelFilter, Log, Metadata, Record}; use msg::constellation_msg::TopLevelBrowsingContextId; diff --git a/components/constellation/pipeline.rs b/components/constellation/pipeline.rs index d536d63bc60..b20003ea66a 100644 --- a/components/constellation/pipeline.rs +++ b/components/constellation/pipeline.rs @@ -7,9 +7,9 @@ use crate::sandboxing::{spawn_multiprocess, UnprivilegedContent}; use background_hang_monitor::HangMonitorRegister; use bluetooth_traits::BluetoothRequest; use canvas_traits::webgl::WebGLPipeline; -use compositing::compositor_thread::Msg as CompositorMsg; -use compositing::CompositionPipeline; -use compositing::CompositorProxy; +use compositing_traits::CompositionPipeline; +use compositing_traits::CompositorMsg; +use compositing_traits::CompositorProxy; use crossbeam_channel::{unbounded, Sender}; use devtools_traits::{DevtoolsControlMsg, ScriptToDevtoolsControlMsg}; use embedder_traits::EventLoopWaker; diff --git a/components/servo/Cargo.toml b/components/servo/Cargo.toml index 15c20d20979..221efd72534 100644 --- a/components/servo/Cargo.toml +++ b/components/servo/Cargo.toml @@ -40,6 +40,7 @@ bluetooth_traits = { path = "../bluetooth_traits" } canvas = { path = "../canvas", default-features = false } canvas_traits = { path = "../canvas_traits" } compositing = { path = "../compositing", features = ["gl"] } +compositing_traits = { path = "../compositing_traits" } constellation = { path = "../constellation" } crossbeam-channel = { workspace = true } devtools = { path = "../devtools" } diff --git a/components/servo/lib.rs b/components/servo/lib.rs index e82994e46ff..da43cc672cf 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -68,12 +68,12 @@ use bluetooth_traits::BluetoothRequest; use canvas::canvas_paint_thread::{self, CanvasPaintThread}; use canvas::WebGLComm; use canvas_traits::webgl::WebGLThreads; -use compositing::compositor_thread::{ - CompositorProxy, CompositorReceiver, InitialCompositorState, Msg, WebrenderCanvasMsg, - WebrenderFontMsg, WebrenderMsg, -}; use compositing::windowing::{EmbedderEvent, EmbedderMethods, WindowMethods}; -use compositing::{CompositingReason, ConstellationMsg, IOCompositor, ShutdownState}; +use compositing::{IOCompositor, InitialCompositorState, ShutdownState}; +use compositing_traits::{ + CompositingReason, CompositorMsg, CompositorProxy, CompositorReceiver, ConstellationMsg, + WebrenderCanvasMsg, WebrenderFontMsg, WebrenderMsg, +}; #[cfg(all( not(target_os = "windows"), not(target_os = "ios"), @@ -234,7 +234,7 @@ impl webrender_api::RenderNotifier for RenderNotifier { ) { if scrolled { self.compositor_proxy - .send(Msg::NewScrollFrameReady(composite_needed)); + .send(CompositorMsg::NewScrollFrameReady(composite_needed)); } else { self.wake_up(); } @@ -934,14 +934,14 @@ struct FontCacheWR(CompositorProxy); impl gfx_traits::WebrenderApi for FontCacheWR { fn add_font_instance(&self, font_key: FontKey, size: f32) -> FontInstanceKey { let (sender, receiver) = unbounded(); - let _ = self.0.send(Msg::Webrender(WebrenderMsg::Font( + let _ = self.0.send(CompositorMsg::Webrender(WebrenderMsg::Font( WebrenderFontMsg::AddFontInstance(font_key, size, sender), ))); receiver.recv().unwrap() } fn add_font(&self, data: gfx_traits::FontData) -> FontKey { let (sender, receiver) = unbounded(); - let _ = self.0.send(Msg::Webrender(WebrenderMsg::Font( + let _ = self.0.send(CompositorMsg::Webrender(WebrenderMsg::Font( WebrenderFontMsg::AddFont(data, sender), ))); receiver.recv().unwrap() @@ -954,13 +954,13 @@ struct CanvasWebrenderApi(CompositorProxy); impl canvas_paint_thread::WebrenderApi for CanvasWebrenderApi { fn generate_key(&self) -> Result<ImageKey, ()> { let (sender, receiver) = unbounded(); - let _ = self.0.send(Msg::Webrender(WebrenderMsg::Canvas( + let _ = self.0.send(CompositorMsg::Webrender(WebrenderMsg::Canvas( WebrenderCanvasMsg::GenerateKey(sender), ))); receiver.recv().map_err(|_| ()) } fn update_images(&self, updates: Vec<canvas_paint_thread::ImageUpdate>) { - let _ = self.0.send(Msg::Webrender(WebrenderMsg::Canvas( + let _ = self.0.send(CompositorMsg::Webrender(WebrenderMsg::Canvas( WebrenderCanvasMsg::UpdateImages(updates), ))); } diff --git a/components/webdriver_server/Cargo.toml b/components/webdriver_server/Cargo.toml index c8610759dad..02e8599450d 100644 --- a/components/webdriver_server/Cargo.toml +++ b/components/webdriver_server/Cargo.toml @@ -12,7 +12,7 @@ path = "lib.rs" [dependencies] base64 = { workspace = true } -compositing = { path = "../compositing" } +compositing_traits = { path = "../compositing_traits" } cookie = { workspace = true } crossbeam-channel = { workspace = true } euclid = { workspace = true } diff --git a/components/webdriver_server/actions.rs b/components/webdriver_server/actions.rs index afe7b29eb94..f84f3dc141b 100644 --- a/components/webdriver_server/actions.rs +++ b/components/webdriver_server/actions.rs @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::Handler; -use compositing::ConstellationMsg; +use compositing_traits::ConstellationMsg; use ipc_channel::ipc; use keyboard_types::webdriver::KeyInputState; use script_traits::webdriver_msg::WebDriverScriptCommand; diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 7f03dd54244..b69efb084d0 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -19,7 +19,7 @@ mod capabilities; use crate::actions::{InputSourceState, PointerInputState}; use base64::Engine; use capabilities::ServoCapabilities; -use compositing::ConstellationMsg; +use compositing_traits::ConstellationMsg; use crossbeam_channel::{after, unbounded, Receiver, Sender}; use euclid::{Rect, Size2D}; use http::method::Method; |