aboutsummaryrefslogtreecommitdiffstats
path: root/components/compositing
diff options
context:
space:
mode:
Diffstat (limited to 'components/compositing')
-rw-r--r--components/compositing/Cargo.toml1
-rw-r--r--components/compositing/compositor.rs16
-rw-r--r--components/compositing/compositor_thread.rs2
-rw-r--r--components/compositing/windowing.rs8
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)]