Allow the embedder to register their own VRServices

This commit is contained in:
Alan Jeffrey 2019-02-13 17:16:02 -06:00
parent c80c3f3167
commit a062c40567
9 changed files with 48 additions and 45 deletions

15
Cargo.lock generated
View file

@ -616,6 +616,7 @@ dependencies = [
"toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
"webrender 0.58.0 (git+https://github.com/servo/webrender)", "webrender 0.58.0 (git+https://github.com/servo/webrender)",
"webrender_api 0.58.0 (git+https://github.com/servo/webrender)", "webrender_api 0.58.0 (git+https://github.com/servo/webrender)",
"webvr 0.0.1",
] ]
[[package]] [[package]]
@ -3310,7 +3311,7 @@ dependencies = [
[[package]] [[package]]
name = "rust-webvr" name = "rust-webvr"
version = "0.9.17" version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"bindgen 0.46.0 (registry+https://github.com/rust-lang/crates.io-index)", "bindgen 0.46.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -3320,12 +3321,12 @@ dependencies = [
"libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
"ovr-mobile-sys 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "ovr-mobile-sys 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rust-webvr-api 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", "rust-webvr-api 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "rust-webvr-api" name = "rust-webvr-api"
version = "0.9.3" version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"android_injected_glue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "android_injected_glue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
@ -4837,7 +4838,7 @@ dependencies = [
"ipc-channel 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-channel 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
"msg 0.0.1", "msg 0.0.1",
"rust-webvr 0.9.17 (registry+https://github.com/rust-lang/crates.io-index)", "rust-webvr 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
"script_traits 0.0.1", "script_traits 0.0.1",
"servo_config 0.0.1", "servo_config 0.0.1",
"webvr_traits 0.0.1", "webvr_traits 0.0.1",
@ -4849,7 +4850,7 @@ version = "0.0.1"
dependencies = [ dependencies = [
"ipc-channel 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", "ipc-channel 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
"msg 0.0.1", "msg 0.0.1",
"rust-webvr-api 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", "rust-webvr-api 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
@ -5327,8 +5328,8 @@ dependencies = [
"checksum regex-syntax 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fbc557aac2b708fe84121caf261346cc2eed71978024337e42eb46b8a252ac6e" "checksum regex-syntax 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fbc557aac2b708fe84121caf261346cc2eed71978024337e42eb46b8a252ac6e"
"checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5" "checksum remove_dir_all 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3488ba1b9a2084d38645c4c08276a1752dcbf2c7130d74f1569681ad5d2799c5"
"checksum ron 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "da06feaa07f69125ab9ddc769b11de29090122170b402547f64b86fe16ebc399" "checksum ron 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "da06feaa07f69125ab9ddc769b11de29090122170b402547f64b86fe16ebc399"
"checksum rust-webvr 0.9.17 (registry+https://github.com/rust-lang/crates.io-index)" = "c44fadb2f8b67a3ee909c158e0bdd0c1c2f21cab7d37c8f30cd8955419ece9a7" "checksum rust-webvr 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4251e156fc27e2ce17a747e3270ee6940c754145cead0cf5da29792328baf473"
"checksum rust-webvr-api 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "daf1b163d8522d2b25ec99de77785573dbd2db4825df515d241d3d5408b958d5" "checksum rust-webvr-api 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d54f1423df09c01a1937133229d3617bf40cdbc473f0decd98b6013e6c2fef5"
"checksum rustc-demangle 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3058a43ada2c2d0b92b3ae38007a2d0fa5e9db971be260e0171408a4ff471c95" "checksum rustc-demangle 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3058a43ada2c2d0b92b3ae38007a2d0fa5e9db971be260e0171408a4ff471c95"
"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
"checksum rusttype 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b8eb11f5b0a98c8eca2fb1483f42646d8c340e83e46ab416f8a063a0fd0eeb20" "checksum rusttype 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b8eb11f5b0a98c8eca2fb1483f42646d8c340e83e46ab416f8a063a0fd0eeb20"

View file

@ -39,6 +39,7 @@ style_traits = {path = "../style_traits"}
time = "0.1.17" time = "0.1.17"
webrender = {git = "https://github.com/servo/webrender", features = ["capture"]} webrender = {git = "https://github.com/servo/webrender", features = ["capture"]}
webrender_api = {git = "https://github.com/servo/webrender", features = ["ipc"]} webrender_api = {git = "https://github.com/servo/webrender", features = ["ipc"]}
webvr = {path = "../webvr"}
[build-dependencies] [build-dependencies]
toml = "0.4.5" toml = "0.4.5"

View file

@ -14,11 +14,11 @@ use script_traits::{MouseButton, TouchEventType, TouchId};
use servo_geometry::DeviceIndependentPixel; use servo_geometry::DeviceIndependentPixel;
use servo_url::ServoUrl; use servo_url::ServoUrl;
use std::fmt::{Debug, Error, Formatter}; use std::fmt::{Debug, Error, Formatter};
use std::os::raw::c_void;
#[cfg(feature = "gl")] #[cfg(feature = "gl")]
use std::rc::Rc; use std::rc::Rc;
use style_traits::DevicePixel; use style_traits::DevicePixel;
use webrender_api::{DeviceIntPoint, DeviceIntRect, DeviceIntSize, DevicePoint, ScrollLocation}; use webrender_api::{DeviceIntPoint, DeviceIntRect, DeviceIntSize, DevicePoint, ScrollLocation};
use webvr::VRServiceManager;
#[derive(Clone)] #[derive(Clone)]
pub enum MouseWindowEvent { pub enum MouseWindowEvent {
@ -146,11 +146,8 @@ pub trait WindowMethods {
/// will want to avoid blocking on UI events, and just /// will want to avoid blocking on UI events, and just
/// run the event loop at the vsync interval. /// run the event loop at the vsync interval.
fn set_animation_state(&self, _state: AnimationState); fn set_animation_state(&self, _state: AnimationState);
/// Provide a c_void pointer to a VRExternal shared memory. /// Register services with a VRServiceManager.
/// See: https://github.com/servo/rust-webvr/tree/master/rust-webvr/src/api/vrexternal fn register_vr_services(&self, _: &mut VRServiceManager) {}
fn get_vrexternal_pointer(&self) -> Option<*mut c_void> {
None
}
} }
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug)]

View file

@ -107,7 +107,7 @@ use std::cmp::max;
use std::path::PathBuf; use std::path::PathBuf;
use std::rc::Rc; use std::rc::Rc;
use webrender::{RendererKind, ShaderPrecacheFlags}; use webrender::{RendererKind, ShaderPrecacheFlags};
use webvr::{VRExternalShmemPtr, WebVRCompositorHandler, WebVRThread}; use webvr::{VRServiceManager, WebVRCompositorHandler, WebVRThread};
pub use gleam::gl; pub use gleam::gl;
pub use msg::constellation_msg::TopLevelBrowsingContextId as BrowserId; pub use msg::constellation_msg::TopLevelBrowsingContextId as BrowserId;
@ -216,9 +216,14 @@ where
// can't defer it after `create_constellation` has started. // can't defer it after `create_constellation` has started.
script::init(); script::init();
let webvr_shmem = window let webvr_services = if PREFS.is_webvr_enabled() {
.get_vrexternal_pointer() let mut services = VRServiceManager::new();
.map(|ptr| VRExternalShmemPtr::new(ptr)); services.register_defaults();
window.register_vr_services(&mut services);
Some(services)
} else {
None
};
// Create the constellation, which maintains the engine // Create the constellation, which maintains the engine
// pipelines, including the script and layout threads, as well // pipelines, including the script and layout threads, as well
@ -236,7 +241,7 @@ where
webrender_document, webrender_document,
webrender_api_sender, webrender_api_sender,
window.gl(), window.gl(),
webvr_shmem, webvr_services,
); );
// Send the constellation's swmanager sender to service worker manager thread // Send the constellation's swmanager sender to service worker manager thread
@ -515,7 +520,7 @@ fn create_constellation(
webrender_document: webrender_api::DocumentId, webrender_document: webrender_api::DocumentId,
webrender_api_sender: webrender_api::RenderApiSender, webrender_api_sender: webrender_api::RenderApiSender,
window_gl: Rc<dyn gl::Gl>, window_gl: Rc<dyn gl::Gl>,
webvr_shmem: Option<VRExternalShmemPtr>, webvr_services: Option<VRServiceManager>,
) -> (Sender<ConstellationMsg>, SWManagerSenders) { ) -> (Sender<ConstellationMsg>, SWManagerSenders) {
let bluetooth_thread: IpcSender<BluetoothRequest> = let bluetooth_thread: IpcSender<BluetoothRequest> =
BluetoothThreadFactory::new(embedder_proxy.clone()); BluetoothThreadFactory::new(embedder_proxy.clone());
@ -535,19 +540,20 @@ fn create_constellation(
let resource_sender = public_resource_threads.sender(); let resource_sender = public_resource_threads.sender();
let (webvr_chan, webvr_constellation_sender, webvr_compositor) = if PREFS.is_webvr_enabled() { let (webvr_chan, webvr_constellation_sender, webvr_compositor) =
// WebVR initialization if let Some(services) = webvr_services {
let (mut handler, sender) = WebVRCompositorHandler::new(); // WebVR initialization
let (webvr_thread, constellation_sender) = WebVRThread::spawn(sender, webvr_shmem); let (mut handler, sender) = WebVRCompositorHandler::new();
handler.set_webvr_thread_sender(webvr_thread.clone()); let (webvr_thread, constellation_sender) = WebVRThread::spawn(sender, services);
( handler.set_webvr_thread_sender(webvr_thread.clone());
Some(webvr_thread), (
Some(constellation_sender), Some(webvr_thread),
Some(handler), Some(constellation_sender),
) Some(handler),
} else { )
(None, None, None) } else {
}; (None, None, None)
};
// GLContext factory used to create WebGL Contexts // GLContext factory used to create WebGL Contexts
let gl_factory = if opts::get().should_use_osmesa() { let gl_factory = if opts::get().should_use_osmesa() {

View file

@ -21,7 +21,7 @@ euclid = "0.19"
ipc-channel = "0.11" ipc-channel = "0.11"
log = "0.4" log = "0.4"
msg = {path = "../msg"} msg = {path = "../msg"}
rust-webvr = {version = "0.9", features = ["openvr", "vrexternal"]} rust-webvr = {version = "0.10", features = ["openvr", "vrexternal"]}
script_traits = {path = "../script_traits"} script_traits = {path = "../script_traits"}
servo_config = {path = "../config"} servo_config = {path = "../config"}
webvr_traits = {path = "../webvr_traits" } webvr_traits = {path = "../webvr_traits" }

View file

@ -10,3 +10,4 @@ extern crate log;
mod webvr_thread; mod webvr_thread;
pub use crate::webvr_thread::{WebVRCompositorHandler, WebVRThread}; pub use crate::webvr_thread::{WebVRCompositorHandler, WebVRThread};
pub use rust_webvr::api::VRExternalShmemPtr; pub use rust_webvr::api::VRExternalShmemPtr;
pub use rust_webvr::VRServiceManager;

View file

@ -2,7 +2,6 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * 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/. */ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use crate::VRExternalShmemPtr;
use canvas_traits::webgl; use canvas_traits::webgl;
use crossbeam_channel::{unbounded, Receiver, Sender}; use crossbeam_channel::{unbounded, Receiver, Sender};
use euclid::Size2D; use euclid::Size2D;
@ -53,13 +52,8 @@ impl WebVRThread {
sender: IpcSender<WebVRMsg>, sender: IpcSender<WebVRMsg>,
constellation_chan: Sender<ConstellationMsg>, constellation_chan: Sender<ConstellationMsg>,
vr_compositor_chan: WebVRCompositorSender, vr_compositor_chan: WebVRCompositorSender,
webvr_shmem: Option<VRExternalShmemPtr>, service: VRServiceManager,
) -> WebVRThread { ) -> WebVRThread {
let mut service = VRServiceManager::new();
service.register_defaults();
if let Some(ptr) = webvr_shmem {
service.register_vrexternal(ptr);
}
WebVRThread { WebVRThread {
receiver: receiver, receiver: receiver,
sender: sender, sender: sender,
@ -74,7 +68,7 @@ impl WebVRThread {
pub fn spawn( pub fn spawn(
vr_compositor_chan: WebVRCompositorSender, vr_compositor_chan: WebVRCompositorSender,
webvr_shmem: Option<VRExternalShmemPtr>, service: VRServiceManager,
) -> (IpcSender<WebVRMsg>, Sender<Sender<ConstellationMsg>>) { ) -> (IpcSender<WebVRMsg>, Sender<Sender<ConstellationMsg>>) {
let (sender, receiver) = ipc::channel().unwrap(); let (sender, receiver) = ipc::channel().unwrap();
let (constellation_sender, constellation_receiver) = unbounded(); let (constellation_sender, constellation_receiver) = unbounded();
@ -88,7 +82,7 @@ impl WebVRThread {
sender_clone, sender_clone,
constellation_chan, constellation_chan,
vr_compositor_chan, vr_compositor_chan,
webvr_shmem, service,
) )
.start(); .start();
}) })

View file

@ -13,5 +13,5 @@ path = "lib.rs"
[dependencies] [dependencies]
ipc-channel = "0.11" ipc-channel = "0.11"
msg = {path = "../msg"} msg = {path = "../msg"}
rust-webvr-api = {version = "0.9", features = ["serde-serialization"]} rust-webvr-api = {version = "0.10", features = ["serde-serialization"]}
serde = "1.0" serde = "1.0"

View file

@ -18,6 +18,7 @@ use servo::script_traits::{MouseButton, TouchEventType, TouchId};
use servo::servo_config::opts; use servo::servo_config::opts;
use servo::servo_config::prefs::{PrefValue, PREFS}; use servo::servo_config::prefs::{PrefValue, PREFS};
use servo::servo_url::ServoUrl; use servo::servo_url::ServoUrl;
use servo::webvr::{VRExternalShmemPtr, VRServiceManager};
use servo::{self, gl, webrender_api, BrowserId, Servo}; use servo::{self, gl, webrender_api, BrowserId, Servo};
use std::cell::{Cell, RefCell}; use std::cell::{Cell, RefCell};
use std::mem; use std::mem;
@ -535,8 +536,10 @@ impl WindowMethods for ServoCallbacks {
} }
} }
fn get_vrexternal_pointer(&self) -> Option<*mut c_void> { fn register_vr_services(&self, services: &mut VRServiceManager) {
self.vr_pointer.clone() if let Some(ptr) = self.vr_pointer {
services.register_vrexternal(VRExternalShmemPtr::new(ptr));
}
} }
} }