Support WebXR devices with main thread affinity

This commit is contained in:
Alan Jeffrey 2019-07-05 08:46:11 -05:00
parent 683bd0d881
commit e9d410d0ab
5 changed files with 20 additions and 8 deletions

4
Cargo.lock generated
View file

@ -5510,7 +5510,7 @@ dependencies = [
[[package]] [[package]]
name = "webxr" name = "webxr"
version = "0.0.1" version = "0.0.1"
source = "git+https://github.com/servo/webxr#d4e8e1599a34a3c07953cfa2b81187763748daac" source = "git+https://github.com/servo/webxr#f8bfa261bcd54bfeb47f68f23043e547153d7491"
dependencies = [ dependencies = [
"euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)", "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"gleam 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "gleam 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",
@ -5521,7 +5521,7 @@ dependencies = [
[[package]] [[package]]
name = "webxr-api" name = "webxr-api"
version = "0.0.1" version = "0.0.1"
source = "git+https://github.com/servo/webxr#d4e8e1599a34a3c07953cfa2b81187763748daac" source = "git+https://github.com/servo/webxr#f8bfa261bcd54bfeb47f68f23043e547153d7491"
dependencies = [ dependencies = [
"euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)", "euclid 0.19.8 (registry+https://github.com/rust-lang/crates.io-index)",
"gleam 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", "gleam 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)",

View file

@ -182,6 +182,9 @@ pub struct IOCompositor<Window: WindowMethods + ?Sized> {
/// Some VR displays want to be sent a heartbeat from the main thread. /// Some VR displays want to be sent a heartbeat from the main thread.
webvr_heartbeats: Vec<Box<dyn WebVRMainThreadHeartbeat>>, webvr_heartbeats: Vec<Box<dyn WebVRMainThreadHeartbeat>>,
/// Some XR devices want to run on the main thread.
pub webxr_main_thread: webxr_api::MainThreadRegistry,
/// Map of the pending paint metrics per layout thread. /// Map of the pending paint metrics per layout thread.
/// The layout thread for each specific pipeline expects the compositor to /// The layout thread for each specific pipeline expects the compositor to
/// paint frames with specific given IDs (epoch). Once the compositor paints /// paint frames with specific given IDs (epoch). Once the compositor paints
@ -314,6 +317,7 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
webrender_document: state.webrender_document, webrender_document: state.webrender_document,
webrender_api: state.webrender_api, webrender_api: state.webrender_api,
webvr_heartbeats: state.webvr_heartbeats, webvr_heartbeats: state.webvr_heartbeats,
webxr_main_thread: state.webxr_main_thread,
pending_paint_metrics: HashMap::new(), pending_paint_metrics: HashMap::new(),
cursor: Cursor::None, cursor: Cursor::None,
output_file, output_file,
@ -999,7 +1003,10 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
pipeline_ids.push(*pipeline_id); pipeline_ids.push(*pipeline_id);
} }
} }
let animation_state = if pipeline_ids.is_empty() && !self.webvr_heartbeats_racing() { let animation_state = if pipeline_ids.is_empty() &&
!self.webvr_heartbeats_racing() &&
!self.webxr_main_thread.running()
{
windowing::AnimationState::Idle windowing::AnimationState::Idle
} else { } else {
windowing::AnimationState::Animating windowing::AnimationState::Animating
@ -1456,6 +1463,9 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
webvr_heartbeat.heartbeat(); webvr_heartbeat.heartbeat();
} }
// Run the WebXR main thread
self.webxr_main_thread.run_one_frame();
if !self.pending_scroll_zoom_events.is_empty() && !self.waiting_for_results_of_scroll { if !self.pending_scroll_zoom_events.is_empty() && !self.waiting_for_results_of_scroll {
self.process_pending_scroll_events() self.process_pending_scroll_events()
} }

View file

@ -155,4 +155,5 @@ pub struct InitialCompositorState {
pub webrender_document: webrender_api::DocumentId, pub webrender_document: webrender_api::DocumentId,
pub webrender_api: webrender_api::RenderApi, pub webrender_api: webrender_api::RenderApi,
pub webvr_heartbeats: Vec<Box<dyn WebVRMainThreadHeartbeat>>, pub webvr_heartbeats: Vec<Box<dyn WebVRMainThreadHeartbeat>>,
pub webxr_main_thread: webxr_api::MainThreadRegistry,
} }

View file

@ -178,7 +178,7 @@ pub trait EmbedderMethods {
} }
/// Register services with a WebXR Registry. /// Register services with a WebXR Registry.
fn register_webxr(&mut self, _: &mut webxr_api::Registry) {} fn register_webxr(&mut self, _: &mut webxr_api::MainThreadRegistry) {}
} }
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug)]

View file

@ -292,10 +292,10 @@ where
// For the moment, we enable use both the webxr crate and the rust-webvr crate, // For the moment, we enable use both the webxr crate and the rust-webvr crate,
// but we are migrating over to just using webxr. // but we are migrating over to just using webxr.
let mut webxr_registry = let mut webxr_main_thread =
webxr_api::Registry::new().expect("Failed to create WebXR device registry"); webxr_api::MainThreadRegistry::new().expect("Failed to create WebXR device registry");
if pref!(dom.webvr.enabled) || pref!(dom.webxr.enabled) { if pref!(dom.webvr.enabled) || pref!(dom.webxr.enabled) {
embedder.register_webxr(&mut webxr_registry); embedder.register_webxr(&mut webxr_main_thread);
} }
let mut webvr_heartbeats = Vec::new(); let mut webvr_heartbeats = Vec::new();
@ -332,7 +332,7 @@ where
webrender_api_sender, webrender_api_sender,
window.gl(), window.gl(),
webvr_services, webvr_services,
webxr_registry, webxr_main_thread.registry(),
player_context, player_context,
); );
@ -359,6 +359,7 @@ where
webrender_document, webrender_document,
webrender_api, webrender_api,
webvr_heartbeats, webvr_heartbeats,
webxr_main_thread,
}, },
opts.output_file.clone(), opts.output_file.clone(),
opts.is_running_problem_test, opts.is_running_problem_test,