Add inline support to XRWebGLLayer

This commit is contained in:
Manish Goregaokar 2019-12-05 14:28:13 -08:00
parent a64e02a451
commit a1c1a16e98
2 changed files with 27 additions and 21 deletions

View file

@ -30,7 +30,7 @@ interface XRWebGLLayer {
readonly attribute boolean stencil; readonly attribute boolean stencil;
readonly attribute boolean alpha; readonly attribute boolean alpha;
readonly attribute WebGLFramebuffer framebuffer; readonly attribute WebGLFramebuffer? framebuffer;
readonly attribute unsigned long framebufferWidth; readonly attribute unsigned long framebufferWidth;
readonly attribute unsigned long framebufferHeight; readonly attribute unsigned long framebufferHeight;

View file

@ -20,6 +20,7 @@ use crate::dom::xrview::XRView;
use crate::dom::xrviewport::XRViewport; use crate::dom::xrviewport::XRViewport;
use canvas_traits::webgl::WebGLFramebufferId; use canvas_traits::webgl::WebGLFramebufferId;
use dom_struct::dom_struct; use dom_struct::dom_struct;
use euclid::default::Size2D;
use std::convert::TryInto; use std::convert::TryInto;
use webxr_api::SwapChainId as WebXRSwapChainId; use webxr_api::SwapChainId as WebXRSwapChainId;
use webxr_api::Views; use webxr_api::Views;
@ -35,7 +36,8 @@ pub struct XRWebGLLayer {
swap_chain_id: WebXRSwapChainId, swap_chain_id: WebXRSwapChainId,
context: Dom<WebGLRenderingContext>, context: Dom<WebGLRenderingContext>,
session: Dom<XRSession>, 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 { impl XRWebGLLayer {
@ -44,7 +46,7 @@ impl XRWebGLLayer {
session: &XRSession, session: &XRSession,
context: &WebGLRenderingContext, context: &WebGLRenderingContext,
init: &XRWebGLLayerInit, init: &XRWebGLLayerInit,
framebuffer: &WebGLFramebuffer, framebuffer: Option<&WebGLFramebuffer>,
) -> XRWebGLLayer { ) -> XRWebGLLayer {
XRWebGLLayer { XRWebGLLayer {
reflector_: Reflector::new(), reflector_: Reflector::new(),
@ -55,7 +57,7 @@ impl XRWebGLLayer {
swap_chain_id, swap_chain_id,
context: Dom::from_ref(context), context: Dom::from_ref(context),
session: Dom::from_ref(session), session: Dom::from_ref(session),
framebuffer: Dom::from_ref(framebuffer), framebuffer: framebuffer.map(Dom::from_ref),
} }
} }
@ -65,7 +67,7 @@ impl XRWebGLLayer {
session: &XRSession, session: &XRSession,
context: &WebGLRenderingContext, context: &WebGLRenderingContext,
init: &XRWebGLLayerInit, init: &XRWebGLLayerInit,
framebuffer: &WebGLFramebuffer, framebuffer: Option<&WebGLFramebuffer>,
) -> DomRoot<XRWebGLLayer> { ) -> DomRoot<XRWebGLLayer> {
reflect_dom_object( reflect_dom_object(
Box::new(XRWebGLLayer::new_inherited( Box::new(XRWebGLLayer::new_inherited(
@ -115,7 +117,7 @@ impl XRWebGLLayer {
session, session,
context, context,
init, init,
&framebuffer, Some(&framebuffer),
)) ))
} }
@ -128,10 +130,24 @@ impl XRWebGLLayer {
} }
pub fn swap_buffers(&self) { 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)); 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 { impl XRWebGLLayerMethods for XRWebGLLayer {
@ -161,28 +177,18 @@ impl XRWebGLLayerMethods for XRWebGLLayer {
} }
/// https://immersive-web.github.io/webxr/#dom-xrwebgllayer-framebuffer /// https://immersive-web.github.io/webxr/#dom-xrwebgllayer-framebuffer
fn Framebuffer(&self) -> DomRoot<WebGLFramebuffer> { fn GetFramebuffer(&self) -> Option<DomRoot<WebGLFramebuffer>> {
DomRoot::from_ref(&self.framebuffer) self.framebuffer.as_ref().map(|x| DomRoot::from_ref(&**x))
} }
/// https://immersive-web.github.io/webxr/#dom-xrwebgllayer-framebufferwidth /// https://immersive-web.github.io/webxr/#dom-xrwebgllayer-framebufferwidth
fn FramebufferWidth(&self) -> u32 { fn FramebufferWidth(&self) -> u32 {
self.framebuffer self.size().width.try_into().unwrap_or(0)
.size()
.unwrap_or((0, 0))
.0
.try_into()
.unwrap_or(0)
} }
/// https://immersive-web.github.io/webxr/#dom-xrwebgllayer-framebufferheight /// https://immersive-web.github.io/webxr/#dom-xrwebgllayer-framebufferheight
fn FramebufferHeight(&self) -> u32 { fn FramebufferHeight(&self) -> u32 {
self.framebuffer self.size().height.try_into().unwrap_or(0)
.size()
.unwrap_or((0, 0))
.1
.try_into()
.unwrap_or(0)
} }
/// https://immersive-web.github.io/webxr/#dom-xrwebgllayer-getviewport /// https://immersive-web.github.io/webxr/#dom-xrwebgllayer-getviewport