aboutsummaryrefslogtreecommitdiffstats
path: root/ports/libsimpleservo/api/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ports/libsimpleservo/api/src/lib.rs')
-rw-r--r--ports/libsimpleservo/api/src/lib.rs42
1 files changed, 38 insertions, 4 deletions
diff --git a/ports/libsimpleservo/api/src/lib.rs b/ports/libsimpleservo/api/src/lib.rs
index fcbcf89cc6d..64eddcb40e2 100644
--- a/ports/libsimpleservo/api/src/lib.rs
+++ b/ports/libsimpleservo/api/src/lib.rs
@@ -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);