Enable OpenXR backend from the WebXR crate (#32817)

* Enable OpenXR backend from the WebXR crate

Signed-off-by: Daniel Adams <msub2official@gmail.com>

* Ensure openxr feature is only included on windows

Signed-off-by: Daniel Adams <msub2official@gmail.com>

* Add cfgs for OpenXR usages

Signed-off-by: Daniel Adams <msub2official@gmail.com>

---------

Signed-off-by: Daniel Adams <msub2official@gmail.com>
This commit is contained in:
Daniel Adams 2024-07-19 20:24:40 -10:00 committed by GitHub
parent a29e5c8115
commit 9212ed203a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 56 additions and 6 deletions

24
Cargo.lock generated
View file

@ -4449,6 +4449,27 @@ version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 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]] [[package]]
name = "option-operations" name = "option-operations"
version = "0.5.0" version = "0.5.0"
@ -7354,11 +7375,14 @@ dependencies = [
"gl_generator", "gl_generator",
"gvr-sys", "gvr-sys",
"log", "log",
"openxr",
"serde", "serde",
"sparkle", "sparkle",
"surfman", "surfman",
"time 0.1.45", "time 0.1.45",
"webxr-api", "webxr-api",
"winapi",
"wio",
] ]
[[package]] [[package]]

View file

@ -400,6 +400,9 @@ mod gen {
layers: { layers: {
enabled: bool, enabled: bool,
}, },
openxr: {
enabled: bool,
},
sessionavailable: bool, sessionavailable: bool,
#[serde(rename = "dom.webxr.unsafe-assume-user-intent")] #[serde(rename = "dom.webxr.unsafe-assume-user-intent")]
unsafe_assume_user_intent: bool, unsafe_assume_user_intent: bool,

View file

@ -116,5 +116,6 @@ image = { workspace = true }
sig = "1.0" sig = "1.0"
[target.'cfg(target_os = "windows")'.dependencies] [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"] } windows-sys = { workspace = true, features = ["Win32_Graphics_Gdi"] }
libservo = { path = "../../components/servo", features = ["no-wgl"] } libservo = { path = "../../components/servo", features = ["no-wgl"] }

View file

@ -19,6 +19,8 @@ use servo::servo_config::pref;
use servo::Servo; use servo::Servo;
use surfman::GLApi; use surfman::GLApi;
use webxr::glwindow::GlWindowDiscovery; use webxr::glwindow::GlWindowDiscovery;
#[cfg(target_os = "windows")]
use webxr::openxr::OpenXrDiscovery;
use winit::event::WindowEvent; use winit::event::WindowEvent;
use winit::event_loop::EventLoopWindowTarget; use winit::event_loop::EventLoopWindowTarget;
use winit::window::WindowId; use winit::window::WindowId;
@ -27,7 +29,7 @@ use super::events_loop::{EventsLoop, WakerEvent};
use super::minibrowser::Minibrowser; use super::minibrowser::Minibrowser;
use super::webview::WebViewManager; use super::webview::WebViewManager;
use super::{headed_window, headless_window}; 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::tracing::trace_winit_event;
use crate::desktop::window_trait::WindowPortsMethods; use crate::desktop::window_trait::WindowPortsMethods;
use crate::parser::get_default_url; use crate::parser::get_default_url;
@ -153,12 +155,19 @@ impl App {
>(w.unwrap()) >(w.unwrap())
}; };
let factory = Box::new(move || Ok(window.new_glwindow(w))); let factory = Box::new(move || Ok(window.new_glwindow(w)));
Some(GlWindowDiscovery::new( Some(XrDiscovery::GlWindow(GlWindowDiscovery::new(
surfman.connection(), surfman.connection(),
surfman.adapter(), surfman.adapter(),
surfman.context_attributes(), surfman.context_attributes(),
factory, 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 { } else {
None None
}; };

View file

@ -8,16 +8,24 @@ use servo::compositing::windowing::EmbedderMethods;
use servo::embedder_traits::{EmbedderProxy, EventLoopWaker}; use servo::embedder_traits::{EmbedderProxy, EventLoopWaker};
use servo::servo_config::pref; use servo::servo_config::pref;
use webxr::glwindow::GlWindowDiscovery; 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 { pub struct EmbedderCallbacks {
event_loop_waker: Box<dyn EventLoopWaker>, event_loop_waker: Box<dyn EventLoopWaker>,
xr_discovery: Option<GlWindowDiscovery>, xr_discovery: Option<XrDiscovery>,
} }
impl EmbedderCallbacks { impl EmbedderCallbacks {
pub fn new( pub fn new(
event_loop_waker: Box<dyn EventLoopWaker>, event_loop_waker: Box<dyn EventLoopWaker>,
xr_discovery: Option<GlWindowDiscovery>, xr_discovery: Option<XrDiscovery>,
) -> EmbedderCallbacks { ) -> EmbedderCallbacks {
EmbedderCallbacks { EmbedderCallbacks {
event_loop_waker, event_loop_waker,
@ -39,7 +47,11 @@ impl EmbedderMethods for EmbedderCallbacks {
if pref!(dom.webxr.test) { if pref!(dom.webxr.test) {
xr.register_mock(webxr::headless::HeadlessMockDiscovery::new()); xr.register_mock(webxr::headless::HeadlessMockDiscovery::new());
} else if let Some(xr_discovery) = self.xr_discovery.take() { } 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),
}
} }
} }
} }

View file

@ -49,6 +49,7 @@
"dom.webxr.glwindow.spherical": false, "dom.webxr.glwindow.spherical": false,
"dom.webxr.hands.enabled": false, "dom.webxr.hands.enabled": false,
"dom.webxr.layers.enabled": false, "dom.webxr.layers.enabled": false,
"dom.webxr.openxr.enabled": false,
"dom.webxr.sessionavailable": false, "dom.webxr.sessionavailable": false,
"dom.webxr.test": false, "dom.webxr.test": false,
"dom.webxr.unsafe-assume-user-intent": false, "dom.webxr.unsafe-assume-user-intent": false,