diff options
author | Alan Jeffrey <ajeffrey@mozilla.com> | 2020-08-03 13:19:22 -0500 |
---|---|---|
committer | Alan Jeffrey <ajeffrey@mozilla.com> | 2020-08-03 13:19:22 -0500 |
commit | 31de34704d4f5911a5db7bec77cbe5c53a909c53 (patch) | |
tree | 21d9d0bd09def31587025fb92d7c2a914aa70f45 /components/script/dom/xrsession.rs | |
parent | bf7f4eae31f0332b0ab8460132c937f8facbed47 (diff) | |
download | servo-31de34704d4f5911a5db7bec77cbe5c53a909c53.tar.gz servo-31de34704d4f5911a5db7bec77cbe5c53a909c53.zip |
Implement the changes to updating the render state from the WebXR Layers spec
Diffstat (limited to 'components/script/dom/xrsession.rs')
-rw-r--r-- | components/script/dom/xrsession.rs | 73 |
1 files changed, 56 insertions, 17 deletions
diff --git a/components/script/dom/xrsession.rs b/components/script/dom/xrsession.rs index bf386c9d6cf..1655328ec5a 100644 --- a/components/script/dom/xrsession.rs +++ b/components/script/dom/xrsession.rs @@ -602,12 +602,67 @@ impl XRSessionMethods for XRSession { return Err(Error::InvalidState); } - // TODO: Add the checks in // https://immersive-web.github.io/layers/#updaterenderstatechanges + // Step 1. + // TODO: support the `layers' feature. + let session_created_with_layers_enabled = false; + if init.baseLayer.is_some() { + if session_created_with_layers_enabled { + return Err(Error::NotSupported); + } + // https://github.com/immersive-web/layers/issues/189 + if init.layers.is_some() { + return Err(Error::Type(String::from( + "Cannot set WebXR layers and baseLayer", + ))); + } + } + + if let Some(Some(ref layers)) = init.layers { + // Step 2 + for layer in layers { + let count = layers + .iter() + .filter(|other| other.layer_id() == layer.layer_id()) + .count(); + if count > 1 { + return Err(Error::Type(String::from("Duplicate entry in WebXR layers"))); + } + } + + // Step 3 + for layer in layers { + if layer.session() != self { + return Err(Error::Type(String::from( + "Layer from different session in WebXR layers", + ))); + } + } + } + // Step 4-5 let pending = self .pending_render_state .or_init(|| self.active_render_state.get().clone_object()); + + // Step 6 + if let Some(ref layers) = init.layers { + let layers = layers.as_deref().unwrap_or_default(); + pending.set_base_layer(None); + pending.set_layers(layers.iter().map(|x| &**x).collect()); + let layers = layers + .iter() + .filter_map(|layer| { + let context_id = WebXRContextId::from(layer.context_id()); + let layer_id = layer.layer_id()?; + Some((context_id, layer_id)) + }) + .collect(); + self.session.borrow_mut().set_layers(layers); + } + + // End of https://immersive-web.github.io/layers/#updaterenderstatechanges + if let Some(near) = init.depthNear { let mut near = *near; // Step 8 from #apply-the-pending-render-state @@ -657,22 +712,6 @@ impl XRSessionMethods for XRSession { .update_clip_planes(*pending.DepthNear() as f32, *pending.DepthFar() as f32); } - // https://immersive-web.github.io/layers/#updaterenderstatechanges - if let Some(ref layers) = init.layers { - let layers = layers.as_deref().unwrap_or_default(); - pending.set_base_layer(None); - pending.set_layers(layers.iter().map(|x| &**x).collect()); - let layers = layers - .iter() - .filter_map(|layer| { - let context_id = WebXRContextId::from(layer.context_id()); - let layer_id = layer.layer_id()?; - Some((context_id, layer_id)) - }) - .collect(); - self.session.borrow_mut().set_layers(layers); - } - Ok(()) } |