Skip to content
Permalink
Browse files

Support for ExternalVR implementation

  • Loading branch information...
paulrouget committed Feb 5, 2019
1 parent b7e9bab commit c055b74e13f255b351efc969a19acfd9724076e4

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

Oops, something went wrong.
@@ -14,6 +14,7 @@ use script_traits::{MouseButton, TouchEventType, TouchId};
use servo_geometry::DeviceIndependentPixel;
use servo_url::ServoUrl;
use std::fmt::{Debug, Error, Formatter};
use std::os::raw::c_void;
#[cfg(feature = "gl")]
use std::rc::Rc;
use style_traits::DevicePixel;
@@ -145,6 +146,11 @@ pub trait WindowMethods {
/// will want to avoid blocking on UI events, and just
/// run the event loop at the vsync interval.
fn set_animation_state(&self, _state: AnimationState);
/// Provide a c_void pointer to a VRExternal shared memory.
/// See: https://github.com/servo/rust-webvr/tree/master/rust-webvr/src/api/vrexternal
fn get_vrexternal_pointer(&self) -> Option<*mut c_void> {
None
}
}

#[derive(Clone, Copy, Debug)]
@@ -107,7 +107,7 @@ use std::cmp::max;
use std::path::PathBuf;
use std::rc::Rc;
use webrender::{RendererKind, ShaderPrecacheFlags};
use webvr::{WebVRCompositorHandler, WebVRThread};
use webvr::{VRExternalShmemPtr, WebVRCompositorHandler, WebVRThread};

pub use gleam::gl;
pub use msg::constellation_msg::TopLevelBrowsingContextId as BrowserId;
@@ -216,6 +216,10 @@ where
// can't defer it after `create_constellation` has started.
script::init();

let webvr_shmem = window
.get_vrexternal_pointer()
.map(|ptr| VRExternalShmemPtr::new(ptr));

// Create the constellation, which maintains the engine
// pipelines, including the script and layout threads, as well
// as the navigation context.
@@ -232,6 +236,7 @@ where
webrender_document,
webrender_api_sender,
window.gl(),
webvr_shmem,
);

// Send the constellation's swmanager sender to service worker manager thread
@@ -510,6 +515,7 @@ fn create_constellation(
webrender_document: webrender_api::DocumentId,
webrender_api_sender: webrender_api::RenderApiSender,
window_gl: Rc<dyn gl::Gl>,
webvr_shmem: Option<VRExternalShmemPtr>,
) -> (Sender<ConstellationMsg>, SWManagerSenders) {
let bluetooth_thread: IpcSender<BluetoothRequest> =
BluetoothThreadFactory::new(embedder_proxy.clone());
@@ -532,7 +538,7 @@ fn create_constellation(
let (webvr_chan, webvr_constellation_sender, webvr_compositor) = if PREFS.is_webvr_enabled() {
// WebVR initialization
let (mut handler, sender) = WebVRCompositorHandler::new();
let (webvr_thread, constellation_sender) = WebVRThread::spawn(sender);
let (webvr_thread, constellation_sender) = WebVRThread::spawn(sender, webvr_shmem);
handler.set_webvr_thread_sender(webvr_thread.clone());
(
Some(webvr_thread),
@@ -21,7 +21,7 @@ euclid = "0.19"
ipc-channel = "0.11"
log = "0.4"
msg = {path = "../msg"}
rust-webvr = {version = "0.9", features = ["openvr"]}
rust-webvr = {version = "0.9", features = ["openvr", "vrexternal"]}
script_traits = {path = "../script_traits"}
servo_config = {path = "../config"}
webvr_traits = {path = "../webvr_traits" }
@@ -9,3 +9,4 @@ extern crate log;

mod webvr_thread;
pub use crate::webvr_thread::{WebVRCompositorHandler, WebVRThread};
pub use rust_webvr::api::VRExternalShmemPtr;
@@ -2,6 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */

use crate::VRExternalShmemPtr;
use canvas_traits::webgl;
use crossbeam_channel::{unbounded, Receiver, Sender};
use euclid::Size2D;
@@ -52,9 +53,13 @@ impl WebVRThread {
sender: IpcSender<WebVRMsg>,
constellation_chan: Sender<ConstellationMsg>,
vr_compositor_chan: WebVRCompositorSender,
webvr_shmem: Option<VRExternalShmemPtr>,
) -> WebVRThread {
let mut service = VRServiceManager::new();
service.register_defaults();
if let Some(ptr) = webvr_shmem {
service.register_vrexternal(ptr);
}
WebVRThread {
receiver: receiver,
sender: sender,
@@ -69,6 +74,7 @@ impl WebVRThread {

pub fn spawn(
vr_compositor_chan: WebVRCompositorSender,
webvr_shmem: Option<VRExternalShmemPtr>,
) -> (IpcSender<WebVRMsg>, Sender<Sender<ConstellationMsg>>) {
let (sender, receiver) = ipc::channel().unwrap();
let (constellation_sender, constellation_receiver) = unbounded();
@@ -82,6 +88,7 @@ impl WebVRThread {
sender_clone,
constellation_chan,
vr_compositor_chan,
webvr_shmem,
)
.start();
})
@@ -157,7 +164,7 @@ impl WebVRThread {
) {
match self.access_check(pipeline, display_id) {
Ok(display) => sender
.send(Ok(display.borrow().inmediate_frame_data(near, far)))
.send(Ok(display.borrow().immediate_frame_data(near, far)))
.unwrap(),
Err(msg) => sender.send(Err(msg.into())).unwrap(),
}
@@ -21,6 +21,7 @@ use servo::servo_url::ServoUrl;
use servo::{self, gl, webrender_api, BrowserId, Servo};
use std::cell::{Cell, RefCell};
use std::mem;
use std::os::raw::c_void;
use std::path::PathBuf;
use std::rc::Rc;

@@ -39,6 +40,7 @@ pub struct InitOptions {
pub width: u32,
pub height: u32,
pub density: f32,
pub vr_pointer: Option<*mut c_void>,
pub enable_subpixel_text_antialiasing: bool,
}

@@ -152,6 +154,7 @@ pub fn init(
width: Cell::new(init_opts.width),
height: Cell::new(init_opts.height),
density: init_opts.density,
vr_pointer: init_opts.vr_pointer,
waker,
});

@@ -495,6 +498,7 @@ struct ServoCallbacks {
width: Cell<u32>,
height: Cell<u32>,
density: f32,
vr_pointer: Option<*mut c_void>,
}

impl WindowMethods for ServoCallbacks {
@@ -536,6 +540,10 @@ impl WindowMethods for ServoCallbacks {
hidpi_factor: TypedScale::new(self.density),
}
}

fn get_vrexternal_pointer(&self) -> Option<*mut c_void> {
self.vr_pointer.clone()
}
}

struct ResourceReader(Box<dyn ReadFileTrait + Send + Sync>);
@@ -10,7 +10,7 @@ use simpleservo::{
};
use std::ffi::{CStr, CString};
use std::mem;
use std::os::raw::c_char;
use std::os::raw::{c_char, c_void};

fn call<F>(f: F)
where
@@ -51,6 +51,7 @@ pub struct CInitOptions {
pub width: u32,
pub height: u32,
pub density: f32,
pub vr_pointer: *mut c_void,
pub enable_subpixel_text_antialiasing: bool,
}

@@ -83,6 +84,11 @@ fn init(
width: opts.width,
height: opts.height,
density: opts.density,
vr_pointer: if opts.vr_pointer.is_null() {
None
} else {
Some(opts.vr_pointer)
},
enable_subpixel_text_antialiasing: opts.enable_subpixel_text_antialiasing,
};

@@ -66,7 +66,9 @@ pub fn Java_org_mozilla_servoview_JNIServo_init(
// debug!() will only show in a debug build. Use info!() if logs
// should show up in adb logcat with a release build.
let filters = [
"simpleservo",
"servo",
"simpleservo::api",
"simpleservo::jniapi",
"simpleservo::gl_glue::egl",
// Show JS errors by default.
"script::dom::bindings::error",
@@ -686,13 +688,21 @@ fn get_options(env: &JNIEnv, opts: JObject) -> Result<(InitOptions, bool, Option
get_non_null_field(env, opts, "enableSubpixelTextAntialiasing", "Z")?
.z()
.map_err(|_| "enableSubpixelTextAntialiasing not a boolean")?;
let vr_pointer = get_non_null_field(env, opts, "VRExternalContext", "J")?
.j()
.map_err(|_| "VRExternalContext is not a long")? as *mut c_void;
let opts = InitOptions {
args,
url,
width,
height,
density,
enable_subpixel_text_antialiasing,
vr_pointer: if vr_pointer.is_null() {
None
} else {
Some(vr_pointer)
},
};
Ok((opts, log, log_str))
}
@@ -73,6 +73,7 @@
public int height = 0;
public float density = 1;
public boolean enableSubpixelTextAntialiasing = true;
public long VRExternalContext = 0;
public String logStr;
public boolean enableLogs = false;
}
@@ -36,6 +36,7 @@
private Surface mASurface;
private int mWidth;
private int mHeight;
private long mVRExternalContext;
private Servo mServo;
private Client mClient = null;
private String mServoArgs;
@@ -69,6 +70,10 @@ public void setActivity(Activity activity) {
mActivity = activity;
}

public void setVRExternalContext(long context) {
mVRExternalContext = context;
}

public void runLoop() {
mGLThread.start();
}
@@ -265,6 +270,7 @@ public void run() {
options.logStr = mServoLog;
options.enableLogs = true;
options.enableSubpixelTextAntialiasing = false;
options.VRExternalContext = mVRExternalContext;

mServo = new Servo(options, this, mSurface, mClient, mActivity);
});

0 comments on commit c055b74

Please sign in to comment.
You can’t perform that action at this time.