Skip to content

Commit

Permalink
Added magicleap webxr back end
Browse files Browse the repository at this point in the history
  • Loading branch information
Alan Jeffrey committed Aug 2, 2019
1 parent 196c511 commit 1ca495b
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 11 deletions.
10 changes: 8 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions ports/libmlservo/Cargo.toml
Expand Up @@ -23,6 +23,8 @@ layout-2020 = ["simpleservo/layout-2020"]
libservo = { path = "../../components/servo", features = ["no_static_freetype"] }
simpleservo = { path = "../libsimpleservo/api", features = ["no_static_freetype"] }
rust-webvr = { version = "0.13", features = ["magicleap"] }
webxr-api = { git = "https://github.com/servo/webxr", features = ["ipc"] }
webxr = { git = "https://github.com/servo/webxr", features = ["ipc", "magicleap"] }
libc = "0.2"
log = "0.4"
servo-egl = "0.2"
Expand Down
36 changes: 27 additions & 9 deletions ports/libmlservo/src/lib.rs
Expand Up @@ -29,6 +29,7 @@ use std::rc::Rc;
use std::thread;
use std::time::Duration;
use std::time::Instant;
use webxr::magicleap::MagicLeapDiscovery;

#[repr(u32)]
pub enum MLLogLevel {
Expand Down Expand Up @@ -106,7 +107,7 @@ pub unsafe extern "C" fn init_servo(
url_update: MLURLUpdate,
keyboard: MLKeyboard,
url: *const c_char,
args: *const c_char,
default_args: *const c_char,
width: u32,
height: u32,
hidpi: f32,
Expand All @@ -117,7 +118,6 @@ pub unsafe extern "C" fn init_servo(

let gl = gl_glue::egl::init().expect("EGL initialization failure");

let url = CStr::from_ptr(url).to_str().unwrap_or("about:blank");
let coordinates = Coordinates::new(
0,
0,
Expand All @@ -126,34 +126,52 @@ pub unsafe extern "C" fn init_servo(
width as i32,
height as i32,
);
let args = if args.is_null() {
vec![]
} else {
CStr::from_ptr(args)

let mut url = CStr::from_ptr(url).to_str().unwrap_or("about:blank");

// If the URL has a space in it, then treat everything before the space as arguments
let args = if let Some(i) = url.rfind(' ') {
let (front, back) = url.split_at(i);
url = back;
front.split(' ').map(|s| s.to_owned()).collect()
} else if !default_args.is_null() {
CStr::from_ptr(default_args)
.to_str()
.unwrap_or("")
.split(' ')
.map(|s| s.to_owned())
.collect()
} else {
Vec::new()
};

info!("got args: {:?}", args);

let vr_init = if landscape {
VRInitOptions::None
} else {
let vr_init = if !landscape {
let name = String::from("Magic Leap VR Display");
let (service, heartbeat) = MagicLeapVRService::new(name, ctxt, gl.gl_wrapper.clone())
.expect("Failed to create VR service");
let service = Box::new(service);
let heartbeat = Box::new(heartbeat);
VRInitOptions::VRService(service, heartbeat)
} else {
VRInitOptions::None
};

let xr_discovery: Option<Box<dyn webxr_api::Discovery>> = if !landscape {
let discovery = MagicLeapDiscovery::new(ctxt, gl.gl_wrapper.clone());
Some(Box::new(discovery))
} else {
None
};

let opts = InitOptions {
args,
url: Some(url.to_string()),
density: hidpi,
enable_subpixel_text_antialiasing: false,
vr_init,
xr_discovery,
coordinates,
gl_context_pointer: Some(gl.gl_context),
native_display_pointer: Some(gl.display),
Expand Down
1 change: 1 addition & 0 deletions ports/libsimpleservo/api/Cargo.toml
Expand Up @@ -10,6 +10,7 @@ publish = false
libservo = { path = "../../../components/servo" }
log = "0.4"
servo-media = { git = "https://github.com/servo/media" }
webxr-api = { git = "https://github.com/servo/webxr" }

[target.'cfg(not(target_os = "macos"))'.dependencies]
libc = "0.2"
Expand Down
10 changes: 10 additions & 0 deletions ports/libsimpleservo/api/src/lib.rs
Expand Up @@ -48,6 +48,7 @@ pub struct InitOptions {
pub coordinates: Coordinates,
pub density: f32,
pub vr_init: VRInitOptions,
pub xr_discovery: Option<Box<dyn webxr_api::Discovery>>,
pub enable_subpixel_text_antialiasing: bool,
pub gl_context_pointer: Option<*const c_void>,
pub native_display_pointer: Option<*const c_void>,
Expand Down Expand Up @@ -198,6 +199,7 @@ pub fn init(

let embedder_callbacks = Box::new(ServoEmbedderCallbacks {
vr_init: init_opts.vr_init,
xr_discovery: init_opts.xr_discovery,
waker,
});

Expand Down Expand Up @@ -576,6 +578,7 @@ impl ServoGlue {

struct ServoEmbedderCallbacks {
waker: Box<dyn EventLoopWaker>,
xr_discovery: Option<Box<dyn webxr_api::Discovery>>,
vr_init: VRInitOptions,
}

Expand Down Expand Up @@ -607,6 +610,13 @@ impl EmbedderMethods for ServoEmbedderCallbacks {
}
}

fn register_webxr(&mut self, registry: &mut webxr_api::MainThreadRegistry) {
debug!("EmbedderMethods::register_xr");
if let Some(discovery) = self.xr_discovery.take() {
registry.register(discovery);
}
}

fn create_event_loop_waker(&mut self) -> Box<dyn EventLoopWaker> {
debug!("EmbedderMethods::create_event_loop_waker");
self.waker.clone()
Expand Down
1 change: 1 addition & 0 deletions ports/libsimpleservo/capi/src/lib.rs
Expand Up @@ -143,6 +143,7 @@ unsafe fn init(
} else {
VRInitOptions::VRExternal(opts.vr_pointer)
},
xr_discovery: None,
enable_subpixel_text_antialiasing: opts.enable_subpixel_text_antialiasing,
gl_context_pointer: gl_context,
native_display_pointer: display,
Expand Down
1 change: 1 addition & 0 deletions ports/libsimpleservo/jniapi/src/lib.rs
Expand Up @@ -745,6 +745,7 @@ fn get_options(env: &JNIEnv, opts: JObject) -> Result<(InitOptions, bool, Option
} else {
VRInitOptions::VRExternal(vr_pointer)
},
xr_discovery: None,
gl_context_pointer: None,
native_display_pointer: None,
};
Expand Down

0 comments on commit 1ca495b

Please sign in to comment.