mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Integrate swapchain surface provider changes into webgl and webxr implementations.
This commit is contained in:
parent
b062f51495
commit
fbcf2bbc3e
17 changed files with 223 additions and 117 deletions
|
@ -12,6 +12,7 @@ use glutin;
|
|||
use glutin::dpi::LogicalSize;
|
||||
use glutin::EventsLoopClosed;
|
||||
use rust_webvr::GlWindowVRService;
|
||||
use servo::canvas::{SurfaceProviders, WebGlExecutor};
|
||||
use servo::compositing::windowing::EmbedderMethods;
|
||||
use servo::embedder_traits::EventLoopWaker;
|
||||
use servo::servo_config::{opts, pref};
|
||||
|
@ -89,7 +90,12 @@ impl EmbedderMethods for EmbedderCallbacks {
|
|||
}
|
||||
}
|
||||
|
||||
fn register_webxr(&mut self, xr: &mut webxr::MainThreadRegistry) {
|
||||
fn register_webxr(
|
||||
&mut self,
|
||||
xr: &mut webxr::MainThreadRegistry,
|
||||
_executor: WebGlExecutor,
|
||||
_surface_provider_registration: SurfaceProviders
|
||||
) {
|
||||
if pref!(dom.webxr.test) {
|
||||
xr.register_mock(webxr::headless::HeadlessMockDiscovery::new());
|
||||
} else if !opts::get().headless && pref!(dom.webxr.glwindow) {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue