diff options
Diffstat (limited to 'components/compositing')
-rw-r--r-- | components/compositing/Cargo.toml | 1 | ||||
-rw-r--r-- | components/compositing/compositor.rs | 16 | ||||
-rw-r--r-- | components/compositing/compositor_thread.rs | 2 | ||||
-rw-r--r-- | components/compositing/windowing.rs | 8 |
4 files changed, 25 insertions, 2 deletions
diff --git a/components/compositing/Cargo.toml b/components/compositing/Cargo.toml index 426746838b3..c07e7365ad9 100644 --- a/components/compositing/Cargo.toml +++ b/components/compositing/Cargo.toml @@ -39,6 +39,7 @@ style_traits = {path = "../style_traits"} time = "0.1.17" webrender = {git = "https://github.com/servo/webrender", features = ["capture"]} webrender_api = {git = "https://github.com/servo/webrender", features = ["ipc"]} +webvr_traits = {path = "../webvr_traits"} webvr = {path = "../webvr"} [build-dependencies] diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 253fc1cb925..9ff74668e0d 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -43,6 +43,7 @@ use style_traits::{CSSPixel, DevicePixel, PinchZoomFactor}; use time::{now, precise_time_ns, precise_time_s}; use webrender_api::{self, DeviceIntPoint, DevicePoint, HitTestFlags, HitTestResult}; use webrender_api::{LayoutVector2D, ScrollLocation}; +use webvr_traits::WebVRMainThreadHeartbeat; #[derive(Debug, PartialEq)] enum UnableToComposite { @@ -176,6 +177,9 @@ pub struct IOCompositor<Window: WindowMethods> { /// The webrender interface, if enabled. webrender_api: webrender_api::RenderApi, + /// Some VR displays want to be sent a heartbeat from the main thread. + webvr_heartbeats: Vec<Box<dyn WebVRMainThreadHeartbeat>>, + /// Map of the pending paint metrics per layout thread. /// The layout thread for each specific pipeline expects the compositor to /// paint frames with specific given IDs (epoch). Once the compositor paints @@ -283,6 +287,7 @@ impl<Window: WindowMethods> IOCompositor<Window> { webrender: state.webrender, webrender_document: state.webrender_document, webrender_api: state.webrender_api, + webvr_heartbeats: state.webvr_heartbeats, pending_paint_metrics: HashMap::new(), } } @@ -919,7 +924,7 @@ impl<Window: WindowMethods> IOCompositor<Window> { pipeline_ids.push(*pipeline_id); } } - let animation_state = if pipeline_ids.is_empty() { + let animation_state = if pipeline_ids.is_empty() && !self.webvr_heartbeats_racing() { windowing::AnimationState::Idle } else { windowing::AnimationState::Animating @@ -930,6 +935,10 @@ impl<Window: WindowMethods> IOCompositor<Window> { } } + fn webvr_heartbeats_racing(&self) -> bool { + self.webvr_heartbeats.iter().any(|hb| hb.heart_racing()) + } + fn tick_animations_for_pipeline(&mut self, pipeline_id: PipelineId) { let animation_callbacks_running = self .pipeline_details(pipeline_id) @@ -1345,6 +1354,11 @@ impl<Window: WindowMethods> IOCompositor<Window> { CompositionRequest::CompositeNow(_) => self.composite(), } + // Send every VR display that wants one a main-thread heartbeat + for webvr_heartbeat in &mut self.webvr_heartbeats { + webvr_heartbeat.heartbeat(); + } + if !self.pending_scroll_zoom_events.is_empty() && !self.waiting_for_results_of_scroll { self.process_pending_scroll_events() } diff --git a/components/compositing/compositor_thread.rs b/components/compositing/compositor_thread.rs index e4dee4f595a..1a7ee9309cb 100644 --- a/components/compositing/compositor_thread.rs +++ b/components/compositing/compositor_thread.rs @@ -18,6 +18,7 @@ use script_traits::{AnimationState, ConstellationMsg, EventResult}; use std::fmt::{Debug, Error, Formatter}; use style_traits::viewport::ViewportConstraints; use webrender_api::{self, DeviceIntPoint, DeviceIntSize}; +use webvr_traits::WebVRMainThreadHeartbeat; /// Sends messages to the compositor. pub struct CompositorProxy { @@ -153,4 +154,5 @@ pub struct InitialCompositorState { pub webrender: webrender::Renderer, pub webrender_document: webrender_api::DocumentId, pub webrender_api: webrender_api::RenderApi, + pub webvr_heartbeats: Vec<Box<WebVRMainThreadHeartbeat>>, } diff --git a/components/compositing/windowing.rs b/components/compositing/windowing.rs index 091eb661a5e..6c4ba4b3cee 100644 --- a/components/compositing/windowing.rs +++ b/components/compositing/windowing.rs @@ -19,6 +19,7 @@ use std::rc::Rc; use style_traits::DevicePixel; use webrender_api::{DeviceIntPoint, DeviceIntRect, DeviceIntSize, DevicePoint, ScrollLocation}; use webvr::VRServiceManager; +use webvr_traits::WebVRMainThreadHeartbeat; #[derive(Clone)] pub enum MouseWindowEvent { @@ -147,7 +148,12 @@ pub trait WindowMethods { /// run the event loop at the vsync interval. fn set_animation_state(&self, _state: AnimationState); /// Register services with a VRServiceManager. - fn register_vr_services(&self, _: &mut VRServiceManager) {} + fn register_vr_services( + &self, + _: &mut VRServiceManager, + _: &mut Vec<Box<WebVRMainThreadHeartbeat>>, + ) { + } } #[derive(Clone, Copy, Debug)] |