mirror of
https://github.com/servo/servo.git
synced 2025-08-04 05:00:08 +01:00
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:
parent
a29e5c8115
commit
9212ed203a
6 changed files with 56 additions and 6 deletions
24
Cargo.lock
generated
24
Cargo.lock
generated
|
@ -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]]
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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"] }
|
||||||
|
|
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
|
@ -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),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue