Move viewports to being per-session, not per-frame

This commit is contained in:
Manish Goregaokar 2020-05-14 11:18:34 -07:00
parent eaad692c0b
commit 794624b42b
5 changed files with 44 additions and 23 deletions

View file

@ -21,7 +21,7 @@ use crate::dom::xrview::XRView;
use crate::dom::xrviewport::XRViewport;
use canvas_traits::webgl::WebGLFramebufferId;
use dom_struct::dom_struct;
use euclid::Size2D;
use euclid::{Rect, Size2D};
use std::convert::TryInto;
use webxr_api::SwapChainId as WebXRSwapChainId;
use webxr_api::Viewport;
@ -114,7 +114,11 @@ impl XRWebGLLayer {
// Step 9.2. "Initialize layers framebuffer to a new opaque framebuffer created with context."
let (swap_chain_id, framebuffer) = if session.is_immersive() {
let size = session.with_session(|session| session.recommended_framebuffer_resolution());
let size = session.with_session(|session| {
session
.recommended_framebuffer_resolution()
.expect("immersive session must have viewports")
});
let (swap_chain_id, fb) = WebGLFramebuffer::maybe_new_webxr(session, &context, size)
.ok_or(Error::Operation)?;
framebuffer = fb;
@ -240,6 +244,17 @@ impl XRWebGLLayerMethods for XRWebGLLayer {
return None;
}
Some(XRViewport::new(&self.global(), view.view().viewport))
let index = view.viewport_index();
let viewport = self.session.with_session(|s| {
// Inline sssions
if s.viewports().is_empty() {
Rect::from_size(self.size().to_i32())
} else {
s.viewports()[index]
}
});
Some(XRViewport::new(&self.global(), viewport))
}
}