From a708b5f7ce8167cd3a1f75524666962a41a584dd Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Fri, 17 Jul 2020 17:31:33 -0500 Subject: [PATCH 1/2] Save / restore state when updating opaque framebuffer bindings --- components/script/dom/xrwebgllayer.rs | 31 +++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/components/script/dom/xrwebgllayer.rs b/components/script/dom/xrwebgllayer.rs index 69f3e30de1a..dd77cedb27e 100644 --- a/components/script/dom/xrwebgllayer.rs +++ b/components/script/dom/xrwebgllayer.rs @@ -229,9 +229,27 @@ impl XRWebGLLayer { WebGLTextureId::maybe_new(sub_images.sub_image.as_ref()?.color_texture)?; let color_texture = WebGLTexture::new(context, color_texture_id); let target = self.texture_target(); - // TODO: rebind the current bindings + + // Save the current bindings + let saved_framebuffer = context.get_draw_framebuffer_slot().get(); + let saved_framebuffer_target = framebuffer.target(); + let saved_texture_id = context + .textures() + .active_texture_slot(target, context.webgl_version()) + .ok() + .and_then(|slot| slot.get().map(|texture| texture.id())); + + // We have to pick a framebuffer target. + // If there is a draw framebuffer, we use its target, + // otherwise we just use DRAW_FRAMEBUFFER. + let framebuffer_target = saved_framebuffer + .as_ref() + .and_then(|fb| fb.target()) + .unwrap_or(constants::DRAW_FRAMEBUFFER); + + // Update the attachments context.send_command(WebGLCommand::BindTexture(target, Some(color_texture_id))); - framebuffer.bind(constants::FRAMEBUFFER); + framebuffer.bind(framebuffer_target); framebuffer .texture2d_even_if_opaque( constants::COLOR_ATTACHMENT0, @@ -253,6 +271,15 @@ impl XRWebGLLayer { ) .ok()?; } + + // Restore the old bindings + context.send_command(WebGLCommand::BindTexture(target, saved_texture_id)); + if let Some(framebuffer_target) = saved_framebuffer_target { + framebuffer.bind(framebuffer_target); + } + if let Some(framebuffer) = saved_framebuffer { + framebuffer.bind(framebuffer_target); + } Some(()) } From f01527503e1ffaf28728b18296345638c85dad50 Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Fri, 17 Jul 2020 18:02:02 -0500 Subject: [PATCH 2/2] Updated webxr --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b20275dddf3..bfd62e65e47 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6780,7 +6780,7 @@ dependencies = [ [[package]] name = "webxr" version = "0.0.1" -source = "git+https://github.com/servo/webxr#3e731eac4180f739e85f8b6b9dacbc5a2015aec8" +source = "git+https://github.com/servo/webxr#53c07f787d882c1b0dede5f4bb645a3bcf38d676" dependencies = [ "android_injected_glue", "bindgen", @@ -6803,7 +6803,7 @@ dependencies = [ [[package]] name = "webxr-api" version = "0.0.1" -source = "git+https://github.com/servo/webxr#3e731eac4180f739e85f8b6b9dacbc5a2015aec8" +source = "git+https://github.com/servo/webxr#53c07f787d882c1b0dede5f4bb645a3bcf38d676" dependencies = [ "euclid", "ipc-channel",