mirror of
https://github.com/servo/servo.git
synced 2025-07-22 23:03:42 +01:00
Support WebXR devices with main thread affinity
This commit is contained in:
parent
683bd0d881
commit
e9d410d0ab
5 changed files with 20 additions and 8 deletions
4
Cargo.lock
generated
4
Cargo.lock
generated
|
@ -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)",
|
||||||
|
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)]
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue