Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support WebXR devices with main thread affinity #23720

Merged
merged 1 commit into from Jul 6, 2019
Merged
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Support WebXR devices with main thread affinity

  • Loading branch information
asajeffrey committed Jul 5, 2019
commit e9d410d0ab7b985ec6c43d453524c88f1ef37379

Some generated files are not rendered by default. Learn more.

@@ -182,6 +182,9 @@ pub struct IOCompositor<Window: WindowMethods + ?Sized> {
/// Some VR displays want to be sent a heartbeat from the main thread.
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.
/// The layout thread for each specific pipeline expects the compositor to
/// 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_api: state.webrender_api,
webvr_heartbeats: state.webvr_heartbeats,
webxr_main_thread: state.webxr_main_thread,
pending_paint_metrics: HashMap::new(),
cursor: Cursor::None,
output_file,
@@ -999,7 +1003,10 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
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
} else {
windowing::AnimationState::Animating
@@ -1456,6 +1463,9 @@ impl<Window: WindowMethods + ?Sized> IOCompositor<Window> {
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 {
self.process_pending_scroll_events()
}
@@ -155,4 +155,5 @@ pub struct InitialCompositorState {
pub webrender_document: webrender_api::DocumentId,
pub webrender_api: webrender_api::RenderApi,
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.
fn register_webxr(&mut self, _: &mut webxr_api::Registry) {}
fn register_webxr(&mut self, _: &mut webxr_api::MainThreadRegistry) {}
}

#[derive(Clone, Copy, Debug)]
@@ -292,10 +292,10 @@ where

// For the moment, we enable use both the webxr crate and the rust-webvr crate,
// but we are migrating over to just using webxr.
let mut webxr_registry =
webxr_api::Registry::new().expect("Failed to create WebXR device registry");
let mut webxr_main_thread =
webxr_api::MainThreadRegistry::new().expect("Failed to create WebXR device registry");
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();
@@ -332,7 +332,7 @@ where
webrender_api_sender,
window.gl(),
webvr_services,
webxr_registry,
webxr_main_thread.registry(),
player_context,
);

@@ -359,6 +359,7 @@ where
webrender_document,
webrender_api,
webvr_heartbeats,
webxr_main_thread,
},
opts.output_file.clone(),
opts.is_running_problem_test,
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.