diff options
author | Alan Jeffrey <ajeffrey@mozilla.com> | 2020-04-08 17:35:20 -0500 |
---|---|---|
committer | Alan Jeffrey <ajeffrey@mozilla.com> | 2020-04-13 13:57:58 -0500 |
commit | fda8da0e9dcb575205fd29e566ece1d72fe1ab11 (patch) | |
tree | a51a14cb21db8989ab019ec748ed4658f2ca6a08 /components/script/dom/xrsession.rs | |
parent | 7ae11588dc36e644750008d1224a6d93c9e49d08 (diff) | |
download | servo-fda8da0e9dcb575205fd29e566ece1d72fe1ab11.tar.gz servo-fda8da0e9dcb575205fd29e566ece1d72fe1ab11.zip |
Added first-cut implementation of XR layers
Diffstat (limited to 'components/script/dom/xrsession.rs')
-rw-r--r-- | components/script/dom/xrsession.rs | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index 3396ca669c1..53e6c492b68 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -31,7 +31,6 @@ use crate::dom::xrreferencespace::XRReferenceSpace; use crate::dom::xrrenderstate::XRRenderState; use crate::dom::xrsessionevent::XRSessionEvent; use crate::dom::xrspace::XRSpace; -use crate::dom::xrwebgllayer::XRWebGLLayer; use crate::realms::InRealm; use crate::task_source::TaskSource; use dom_struct::dom_struct; @@ -52,7 +51,6 @@ use webxr_api::{ #[dom_struct] pub struct XRSession { eventtarget: EventTarget, - base_layer: MutNullableDom<XRWebGLLayer>, blend_mode: XREnvironmentBlendMode, mode: XRSessionMode, visibility_state: Cell<XRVisibilityState>, @@ -88,7 +86,6 @@ impl XRSession { ) -> XRSession { XRSession { eventtarget: EventTarget::new_inherited(), - base_layer: Default::default(), blend_mode: session.environment_blend_mode().into(), mode, visibility_state: Cell::new(XRVisibilityState::Visible), @@ -119,7 +116,7 @@ impl XRSession { } else { None }; - let render_state = XRRenderState::new(global, 0.1, 1000.0, ivfov, None); + let render_state = XRRenderState::new(global, 0.1, 1000.0, ivfov, None, &[]); let input_sources = XRInputSourceArray::new(global); let ret = reflect_dom_object( Box::new(XRSession::new_inherited( @@ -355,7 +352,14 @@ impl XRSession { // Step 6-7: XXXManishearth handle inlineVerticalFieldOfView if self.is_immersive() { - let swap_chain_id = pending.GetBaseLayer().map(|layer| layer.swap_chain_id()); + let swap_chain_id = pending + .GetBaseLayer() + .map(|layer| layer.swap_chain_id()) + .or_else(|| { + self.active_render_state.get().with_layers(|layers| { + layers.get(0).and_then(|layer| layer.swap_chain_id()) + }) + }); self.session.borrow_mut().set_swap_chain(swap_chain_id); } else { self.update_inline_projection_matrix() @@ -367,10 +371,9 @@ impl XRSession { } // Step 2 - let base_layer = match self.active_render_state.get().GetBaseLayer() { - Some(layer) => layer, - None => return, - }; + if !self.active_render_state.get().has_layer() { + return; + } // Step 3: XXXManishearth handle inline session @@ -395,7 +398,15 @@ impl XRSession { frame.set_active(false); if self.is_immersive() { - base_layer.swap_buffers(); + if let Some(base_layer) = self.active_render_state.get().GetBaseLayer() { + base_layer.swap_buffers(); + } else { + self.active_render_state.get().with_layers(|layers| { + for layer in layers { + layer.swap_buffers(); + } + }); + } self.session.borrow_mut().render_animation_frame(); } else { self.session.borrow_mut().start_render_loop(); @@ -513,6 +524,23 @@ impl XRSessionMethods for XRSession { return Err(Error::InvalidState); } + // TODO: add spec link for this step once XR layers has settled down + // https://immersive-web.github.io/layers/ + if init.baseLayer.is_some() && init.layers.is_some() { + return Err(Error::InvalidState); + } + + // TODO: add spec link for this step once XR layers has settled down + // https://immersive-web.github.io/layers/ + if init + .layers + .as_ref() + .map(|layers| layers.is_empty()) + .unwrap_or(false) + { + return Err(Error::InvalidState); + } + let pending = self .pending_render_state .or_init(|| self.active_render_state.get().clone_object()); @@ -546,7 +574,8 @@ impl XRSessionMethods for XRSession { pending.set_inline_vertical_fov(fov); } if let Some(ref layer) = init.baseLayer { - pending.set_layer(Some(&layer)) + pending.set_layer(Some(&layer)); + pending.set_layers(&[]); } if init.depthFar.is_some() || init.depthNear.is_some() { @@ -554,6 +583,14 @@ impl XRSessionMethods for XRSession { .borrow_mut() .update_clip_planes(*pending.DepthNear() as f32, *pending.DepthFar() as f32); } + + // TODO: add spec link for this step once XR layers has settled down + // https://immersive-web.github.io/layers/ + if let Some(ref layers) = init.layers { + pending.set_layer(None); + pending.set_layers(layers); + } + Ok(()) } |