Support for webxr layer management

This commit is contained in:
Alan Jeffrey 2020-04-15 18:04:32 -05:00
parent af110ac21f
commit 349619ed2d
34 changed files with 949 additions and 642 deletions

View file

@ -29,8 +29,8 @@ libservo = { path = "../../components/servo" }
log = "0.4"
servo-media = { git = "https://github.com/servo/media" }
sparkle = "0.1"
surfman = { git = "https://github.com/servo/surfman" }
surfman-chains = { git = "https://github.com/asajeffrey/surfman-chains" }
surfman = "0.3"
surfman-chains = "0.4"
surfman-chains-api = "0.2"
[build-dependencies]

View file

@ -12,7 +12,7 @@ ipc-channel = "0.14"
libservo = { path = "../../../components/servo" }
log = "0.4"
servo-media = { git = "https://github.com/servo/media" }
surfman = { version = "0.2", features = ["sm-angle-default"] }
surfman = { version = "0.3", features = ["sm-angle-default"] }
webxr = { git = "https://github.com/servo/webxr"}
webxr-api = { git = "https://github.com/servo/webxr", features = ["ipc"] }

View file

@ -15,7 +15,6 @@ pub use servo::script_traits::{MediaSessionActionType, MouseButton};
use getopts::Options;
use ipc_channel::ipc::IpcSender;
use servo::canvas::{SurfaceProviders, WebGlExecutor};
use servo::compositing::windowing::{
AnimationState, EmbedderCoordinates, EmbedderMethods, MouseWindowEvent, WindowEvent,
WindowMethods,
@ -794,8 +793,6 @@ impl EmbedderMethods for ServoEmbedderCallbacks {
fn register_webxr(
&mut self,
registry: &mut webxr::MainThreadRegistry,
executor: WebGlExecutor,
surface_providers: SurfaceProviders,
embedder_proxy: EmbedderProxy,
) {
use ipc_channel::ipc::{self, IpcReceiver};
@ -806,16 +803,6 @@ impl EmbedderMethods for ServoEmbedderCallbacks {
"UWP builds should not be initialized with a WebXR Discovery object"
);
struct ProviderRegistration(SurfaceProviders);
impl openxr::SurfaceProviderRegistration for ProviderRegistration {
fn register(&self, id: webxr_api::SessionId, provider: servo::canvas::SurfaceProvider) {
self.0.lock().unwrap().insert(id, provider);
}
fn clone(&self) -> Box<dyn openxr::SurfaceProviderRegistration> {
Box::new(ProviderRegistration(self.0.clone()))
}
}
#[derive(Clone)]
struct ContextMenuCallback(EmbedderProxy);
@ -854,22 +841,9 @@ impl EmbedderMethods for ServoEmbedderCallbacks {
}
}
struct GlThread(WebGlExecutor);
impl openxr::GlThread for GlThread {
fn execute(&self, runnable: Box<dyn FnOnce(&surfman::Device) + Send>) {
let _ = self.0.send(runnable);
}
fn clone(&self) -> Box<dyn webxr::openxr::GlThread> {
Box::new(GlThread(self.0.clone()))
}
}
if openxr::create_instance(false).is_ok() {
let discovery = openxr::OpenXrDiscovery::new(
Box::new(GlThread(executor)),
Box::new(ProviderRegistration(surface_providers)),
Box::new(ContextMenuCallback(embedder_proxy)),
);
let discovery =
openxr::OpenXrDiscovery::new(Box::new(ContextMenuCallback(embedder_proxy)));
registry.register(discovery);
} else {
let msg =
@ -891,8 +865,6 @@ impl EmbedderMethods for ServoEmbedderCallbacks {
fn register_webxr(
&mut self,
registry: &mut webxr::MainThreadRegistry,
_executor: WebGlExecutor,
_surface_provider_registration: SurfaceProviders,
_embedder_proxy: EmbedderProxy,
) {
debug!("EmbedderMethods::register_xr");

View file

@ -18,7 +18,7 @@ env_logger = "0.7"
lazy_static = "1"
log = "0.4"
simpleservo = { path = "../api" }
surfman = "0.2"
surfman = "0.3"
[target.'cfg(target_os = "windows")'.dependencies]
libc = "0.2"

View file

@ -57,7 +57,7 @@ libservo = { path = "../../components/servo" }
log = "0.4"
servo-media = { git = "https://github.com/servo/media" }
shellwords = "1.0.0"
surfman = { version = "0.2", features = ["sm-winit", "sm-x11"] }
surfman = { version = "0.3", features = ["sm-winit", "sm-x11"] }
tinyfiledialogs = "3.0"
webxr = { git = "https://github.com/servo/webxr", features = ["ipc", "glwindow", "headless"] }
winit = "0.19"

View file

@ -5,7 +5,6 @@
//! Implements the global methods required by Servo (not window/gl/compositor related).
use crate::events_loop::EventsLoop;
use servo::canvas::{SurfaceProviders, WebGlExecutor};
use servo::compositing::windowing::EmbedderMethods;
use servo::embedder_traits::{EmbedderProxy, EventLoopWaker};
use servo::servo_config::pref;
@ -38,8 +37,6 @@ impl EmbedderMethods for EmbedderCallbacks {
fn register_webxr(
&mut self,
xr: &mut webxr::MainThreadRegistry,
_executor: WebGlExecutor,
_surface_provider_registration: SurfaceProviders,
_embedder_proxy: EmbedderProxy,
) {
if pref!(dom.webxr.test) {