Auto merge of #26077 - jdm:xr-canvas-dirty, r=asajeffrey

webgl: Don't dirty canvas element while in immersive mode.

There are various WebGL APIs that are supposed to trigger a frame composite at the end of the event loop when they're used. We enforce this via dirtying the canvas element and ensuring that reflow occurs for normal content. This is redundant when we're using immersive mode and incurs extra work by the layout thread and compositor that inhibits the immersive rendering performance.

---
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes fix (part of) #26019
- [x] These changes do not require tests because we do not have infrastructure to test immersive mode on CI.
This commit is contained in:
bors-servo 2020-03-31 22:23:32 -04:00 committed by GitHub
commit 2c0bbcf2aa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 0 deletions

View file

@ -59,6 +59,10 @@ impl Navigator {
pub fn new(window: &Window) -> DomRoot<Navigator> { pub fn new(window: &Window) -> DomRoot<Navigator> {
reflect_dom_object(Box::new(Navigator::new_inherited()), window) reflect_dom_object(Box::new(Navigator::new_inherited()), window)
} }
pub fn xr(&self) -> Option<DomRoot<XRSystem>> {
self.xr.get()
}
} }
impl NavigatorMethods for Navigator { impl NavigatorMethods for Navigator {

View file

@ -502,6 +502,12 @@ impl WebGLRenderingContext {
return; return;
} }
// Dirtying the canvas is unnecessary if we're actively displaying immersive
// XR content right now.
if self.global().as_window().in_immersive_xr_session() {
return;
}
self.canvas self.canvas
.upcast::<Node>() .upcast::<Node>()
.dirty(NodeDamage::OtherNodeDamage); .dirty(NodeDamage::OtherNodeDamage);

View file

@ -2252,6 +2252,14 @@ impl Window {
pub fn webrender_document(&self) -> DocumentId { pub fn webrender_document(&self) -> DocumentId {
self.webrender_document self.webrender_document
} }
pub fn in_immersive_xr_session(&self) -> bool {
self.navigator
.get()
.as_ref()
.and_then(|nav| nav.xr())
.map_or(false, |xr| xr.pending_or_active_session())
}
} }
impl Window { impl Window {