From 9212ed203a7dcec88008fca47bce0bff3fe2649b Mon Sep 17 00:00:00 2001 From: Daniel Adams <70986246+msub2@users.noreply.github.com> Date: Fri, 19 Jul 2024 20:24:40 -1000 Subject: [PATCH] Enable OpenXR backend from the WebXR crate (#32817) * Enable OpenXR backend from the WebXR crate Signed-off-by: Daniel Adams * Ensure openxr feature is only included on windows Signed-off-by: Daniel Adams * Add cfgs for OpenXR usages Signed-off-by: Daniel Adams --------- Signed-off-by: Daniel Adams --- Cargo.lock | 24 ++++++++++++++++++++++++ components/config/prefs.rs | 3 +++ ports/servoshell/Cargo.toml | 1 + ports/servoshell/desktop/app.rs | 15 ++++++++++++--- ports/servoshell/desktop/embedder.rs | 18 +++++++++++++++--- resources/prefs.json | 1 + 6 files changed, 56 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b15f9d74309..5f2ee3514f7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4449,6 +4449,27 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "openxr" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a03958eb34719625119448d483ebd2fe008a2128b6286f2a7138b7e48072053" +dependencies = [ + "libc", + "libloading", + "ndk-context", + "openxr-sys", +] + +[[package]] +name = "openxr-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1534b2c14b56564e58b91f5015817e1d87bd43ca12a188eda6a9ea3859b0ec25" +dependencies = [ + "libc", +] + [[package]] name = "option-operations" version = "0.5.0" @@ -7354,11 +7375,14 @@ dependencies = [ "gl_generator", "gvr-sys", "log", + "openxr", "serde", "sparkle", "surfman", "time 0.1.45", "webxr-api", + "winapi", + "wio", ] [[package]] diff --git a/components/config/prefs.rs b/components/config/prefs.rs index 0780dcd9536..84e304bdd2e 100644 --- a/components/config/prefs.rs +++ b/components/config/prefs.rs @@ -400,6 +400,9 @@ mod gen { layers: { enabled: bool, }, + openxr: { + enabled: bool, + }, sessionavailable: bool, #[serde(rename = "dom.webxr.unsafe-assume-user-intent")] unsafe_assume_user_intent: bool, diff --git a/ports/servoshell/Cargo.toml b/ports/servoshell/Cargo.toml index 0c24266630e..be995af59a1 100644 --- a/ports/servoshell/Cargo.toml +++ b/ports/servoshell/Cargo.toml @@ -116,5 +116,6 @@ image = { workspace = true } sig = "1.0" [target.'cfg(target_os = "windows")'.dependencies] +webxr = { git = "https://github.com/servo/webxr", features = ["ipc", "glwindow", "headless", "openxr-api"] } windows-sys = { workspace = true, features = ["Win32_Graphics_Gdi"] } libservo = { path = "../../components/servo", features = ["no-wgl"] } diff --git a/ports/servoshell/desktop/app.rs b/ports/servoshell/desktop/app.rs index 9cdf1eb8c08..f2b47770ad7 100644 --- a/ports/servoshell/desktop/app.rs +++ b/ports/servoshell/desktop/app.rs @@ -19,6 +19,8 @@ use servo::servo_config::pref; use servo::Servo; use surfman::GLApi; use webxr::glwindow::GlWindowDiscovery; +#[cfg(target_os = "windows")] +use webxr::openxr::OpenXrDiscovery; use winit::event::WindowEvent; use winit::event_loop::EventLoopWindowTarget; use winit::window::WindowId; @@ -27,7 +29,7 @@ use super::events_loop::{EventsLoop, WakerEvent}; use super::minibrowser::Minibrowser; use super::webview::WebViewManager; use super::{headed_window, headless_window}; -use crate::desktop::embedder::EmbedderCallbacks; +use crate::desktop::embedder::{EmbedderCallbacks, XrDiscovery}; use crate::desktop::tracing::trace_winit_event; use crate::desktop::window_trait::WindowPortsMethods; use crate::parser::get_default_url; @@ -153,12 +155,19 @@ impl App { >(w.unwrap()) }; let factory = Box::new(move || Ok(window.new_glwindow(w))); - Some(GlWindowDiscovery::new( + Some(XrDiscovery::GlWindow(GlWindowDiscovery::new( surfman.connection(), surfman.adapter(), surfman.context_attributes(), factory, - )) + ))) + } else if pref!(dom.webxr.openxr.enabled) && !opts::get().headless { + #[cfg(target_os = "windows")] + let openxr = Some(XrDiscovery::OpenXr(OpenXrDiscovery::new(None))); + #[cfg(not(target_os = "windows"))] + let openxr = None; + + openxr } else { None }; diff --git a/ports/servoshell/desktop/embedder.rs b/ports/servoshell/desktop/embedder.rs index 7f0c1f6034c..67061ddea29 100644 --- a/ports/servoshell/desktop/embedder.rs +++ b/ports/servoshell/desktop/embedder.rs @@ -8,16 +8,24 @@ use servo::compositing::windowing::EmbedderMethods; use servo::embedder_traits::{EmbedderProxy, EventLoopWaker}; use servo::servo_config::pref; use webxr::glwindow::GlWindowDiscovery; +#[cfg(target_os = "windows")] +use webxr::openxr::OpenXrDiscovery; + +pub enum XrDiscovery { + GlWindow(GlWindowDiscovery), + #[cfg(target_os = "windows")] + OpenXr(OpenXrDiscovery), +} pub struct EmbedderCallbacks { event_loop_waker: Box, - xr_discovery: Option, + xr_discovery: Option, } impl EmbedderCallbacks { pub fn new( event_loop_waker: Box, - xr_discovery: Option, + xr_discovery: Option, ) -> EmbedderCallbacks { EmbedderCallbacks { event_loop_waker, @@ -39,7 +47,11 @@ impl EmbedderMethods for EmbedderCallbacks { if pref!(dom.webxr.test) { xr.register_mock(webxr::headless::HeadlessMockDiscovery::new()); } else if let Some(xr_discovery) = self.xr_discovery.take() { - xr.register(xr_discovery); + match xr_discovery { + XrDiscovery::GlWindow(discovery) => xr.register(discovery), + #[cfg(target_os = "windows")] + XrDiscovery::OpenXr(discovery) => xr.register(discovery), + } } } } diff --git a/resources/prefs.json b/resources/prefs.json index b9de4aa1b28..644f63d2e21 100644 --- a/resources/prefs.json +++ b/resources/prefs.json @@ -49,6 +49,7 @@ "dom.webxr.glwindow.spherical": false, "dom.webxr.hands.enabled": false, "dom.webxr.layers.enabled": false, + "dom.webxr.openxr.enabled": false, "dom.webxr.sessionavailable": false, "dom.webxr.test": false, "dom.webxr.unsafe-assume-user-intent": false,