Integrate swapchain surface provider changes into webgl and webxr implementations.

This commit is contained in:
Josh Matthews 2020-02-27 16:41:35 -05:00
parent b062f51495
commit fbcf2bbc3e
17 changed files with 223 additions and 117 deletions

View file

@ -13,6 +13,7 @@ pub use servo::embedder_traits::{
pub use servo::script_traits::{MediaSessionActionType, MouseButton};
use getopts::Options;
use servo::canvas::{SurfaceProviders, WebGlExecutor};
use servo::compositing::windowing::{
AnimationState, EmbedderCoordinates, EmbedderMethods, MouseWindowEvent, WindowEvent,
WindowMethods,
@ -723,19 +724,52 @@ impl EmbedderMethods for ServoEmbedderCallbacks {
}
#[cfg(feature = "uwp")]
fn register_webxr(&mut self, registry: &mut webxr::MainThreadRegistry) {
fn register_webxr(
&mut self,
registry: &mut webxr::MainThreadRegistry,
executor: WebGlExecutor,
surface_providers: SurfaceProviders,
) {
debug!("EmbedderMethods::register_xr");
assert!(
self.xr_discovery.is_none(),
"UWP builds should not be initialized with a WebXR Discovery object"
);
let gl = self.gl.clone();
let discovery = webxr::openxr::OpenXrDiscovery::new(gl);
struct ProviderRegistration(SurfaceProviders);
impl webxr::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 webxr::openxr::SurfaceProviderRegistration> {
Box::new(ProviderRegistration(self.0.clone()))
}
}
struct GlThread(WebGlExecutor);
impl webxr::openxr::GlThread for GlThread {
fn execute(&self, runnable: Box<dyn FnOnce() + Send>) {
let _ = self.0.send(runnable);
}
fn clone(&self) -> Box<dyn webxr::openxr::GlThread> {
Box::new(GlThread(self.0.clone()))
}
}
let discovery = webxr::openxr::OpenXrDiscovery::new(
Box::new(GlThread(executor)),
Box::new(ProviderRegistration(surface_providers)),
);
registry.register(discovery);
}
#[cfg(not(feature = "uwp"))]
fn register_webxr(&mut self, registry: &mut webxr::MainThreadRegistry) {
fn register_webxr(
&mut self,
registry: &mut webxr::MainThreadRegistry,
_executor: WebGlExecutor,
_surface_provider_registration: SurfaceProviders,
) {
debug!("EmbedderMethods::register_xr");
if let Some(discovery) = self.xr_discovery.take() {
registry.register(discovery);