diff options
author | Manish Goregaokar <manishsmail@gmail.com> | 2019-12-05 14:28:13 -0800 |
---|---|---|
committer | Manish Goregaokar <manishsmail@gmail.com> | 2019-12-10 15:13:42 -0800 |
commit | a1c1a16e9818cff45f2fba24ba2f71651de9ff6d (patch) | |
tree | fb0ee077327b8c9e6239575e33e25d6643346c18 /components/script/dom/xrwebgllayer.rs | |
parent | a64e02a4517b04365678ea983cec1a645db0e461 (diff) | |
download | servo-a1c1a16e9818cff45f2fba24ba2f71651de9ff6d.tar.gz servo-a1c1a16e9818cff45f2fba24ba2f71651de9ff6d.zip |
Add inline support to XRWebGLLayer
Diffstat (limited to 'components/script/dom/xrwebgllayer.rs')
-rw-r--r-- | components/script/dom/xrwebgllayer.rs | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/components/script/dom/xrwebgllayer.rs b/components/script/dom/xrwebgllayer.rs index 44bc10868b6..2d39a47286b 100644 --- a/components/script/dom/xrwebgllayer.rs +++ b/components/script/dom/xrwebgllayer.rs @@ -20,6 +20,7 @@ use crate::dom::xrview::XRView; use crate::dom::xrviewport::XRViewport; use canvas_traits::webgl::WebGLFramebufferId; use dom_struct::dom_struct; +use euclid::default::Size2D; use std::convert::TryInto; use webxr_api::SwapChainId as WebXRSwapChainId; use webxr_api::Views; @@ -35,7 +36,8 @@ pub struct XRWebGLLayer { swap_chain_id: WebXRSwapChainId, context: Dom<WebGLRenderingContext>, session: Dom<XRSession>, - framebuffer: Dom<WebGLFramebuffer>, + /// If none, this is an inline session (the composition disabled flag is true) + framebuffer: Option<Dom<WebGLFramebuffer>>, } impl XRWebGLLayer { @@ -44,7 +46,7 @@ impl XRWebGLLayer { session: &XRSession, context: &WebGLRenderingContext, init: &XRWebGLLayerInit, - framebuffer: &WebGLFramebuffer, + framebuffer: Option<&WebGLFramebuffer>, ) -> XRWebGLLayer { XRWebGLLayer { reflector_: Reflector::new(), @@ -55,7 +57,7 @@ impl XRWebGLLayer { swap_chain_id, context: Dom::from_ref(context), session: Dom::from_ref(session), - framebuffer: Dom::from_ref(framebuffer), + framebuffer: framebuffer.map(Dom::from_ref), } } @@ -65,7 +67,7 @@ impl XRWebGLLayer { session: &XRSession, context: &WebGLRenderingContext, init: &XRWebGLLayerInit, - framebuffer: &WebGLFramebuffer, + framebuffer: Option<&WebGLFramebuffer>, ) -> DomRoot<XRWebGLLayer> { reflect_dom_object( Box::new(XRWebGLLayer::new_inherited( @@ -115,7 +117,7 @@ impl XRWebGLLayer { session, context, init, - &framebuffer, + Some(&framebuffer), )) } @@ -128,10 +130,24 @@ impl XRWebGLLayer { } pub fn swap_buffers(&self) { - if let WebGLFramebufferId::Opaque(id) = self.framebuffer.id() { + if let WebGLFramebufferId::Opaque(id) = self + .framebuffer + .as_ref() + .expect("Must have framebuffer") + .id() + { self.context.swap_buffers(Some(id)); } } + + fn size(&self) -> Size2D<i32> { + if let Some(framebuffer) = self.framebuffer { + let size = framebuffer.size().unwrap_or((0, 0)); + Size2D::new(size.0, size.1) + } else { + self.context.Canvas().get_size() + } + } } impl XRWebGLLayerMethods for XRWebGLLayer { @@ -161,28 +177,18 @@ impl XRWebGLLayerMethods for XRWebGLLayer { } /// https://immersive-web.github.io/webxr/#dom-xrwebgllayer-framebuffer - fn Framebuffer(&self) -> DomRoot<WebGLFramebuffer> { - DomRoot::from_ref(&self.framebuffer) + fn GetFramebuffer(&self) -> Option<DomRoot<WebGLFramebuffer>> { + self.framebuffer.as_ref().map(|x| DomRoot::from_ref(&**x)) } /// https://immersive-web.github.io/webxr/#dom-xrwebgllayer-framebufferwidth fn FramebufferWidth(&self) -> u32 { - self.framebuffer - .size() - .unwrap_or((0, 0)) - .0 - .try_into() - .unwrap_or(0) + self.size().width.try_into().unwrap_or(0) } /// https://immersive-web.github.io/webxr/#dom-xrwebgllayer-framebufferheight fn FramebufferHeight(&self) -> u32 { - self.framebuffer - .size() - .unwrap_or((0, 0)) - .1 - .try_into() - .unwrap_or(0) + self.size().height.try_into().unwrap_or(0) } /// https://immersive-web.github.io/webxr/#dom-xrwebgllayer-getviewport |