aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/xrwebgllayer.rs
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2019-12-05 14:28:13 -0800
committerManish Goregaokar <manishsmail@gmail.com>2019-12-10 15:13:42 -0800
commita1c1a16e9818cff45f2fba24ba2f71651de9ff6d (patch)
treefb0ee077327b8c9e6239575e33e25d6643346c18 /components/script/dom/xrwebgllayer.rs
parenta64e02a4517b04365678ea983cec1a645db0e461 (diff)
downloadservo-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.rs46
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