diff --git a/components/canvas/webgl_thread.rs b/components/canvas/webgl_thread.rs index ef4ccd5794e..b6e7959ef24 100644 --- a/components/canvas/webgl_thread.rs +++ b/components/canvas/webgl_thread.rs @@ -8,7 +8,6 @@ use euclid::Size2D; use fnv::FnvHashMap; use gleam::gl; use offscreen_gl_context::{GLContext, GLContextAttributes, GLLimits, NativeGLContextMethods}; -use std::mem; use std::thread; use super::gl_context::{GLContextFactory, GLContextWrapper}; use webrender; @@ -202,8 +201,6 @@ impl WebGLThread WebGLThread { + Self::update_wr_external_image(&self.webrender_api, + info.size, + info.alpha, + context_id, + image_key); + }, + _ => {} } sender.send(Ok(())).unwrap(); @@ -257,12 +259,6 @@ impl WebGLThread WebGLThread) { @@ -290,7 +286,7 @@ impl WebGLThread WebGLThread WebGLThread webrender_api::ImageKey { let descriptor = Self::image_descriptor(size, alpha); - - let data = webrender_api::ExternalImageData { - id: webrender_api::ExternalImageId(context_id.0 as u64), - channel_index: 0, - image_type: webrender_api::ExternalImageType::Texture2DHandle, - }; - let data = webrender_api::ImageData::External(data); + let data = Self::external_image_data(context_id); let image_key = webrender_api.generate_image_key(); let mut updates = webrender_api::ResourceUpdates::new(); @@ -384,6 +367,23 @@ impl WebGLThread, + alpha: bool, + context_id: WebGLContextId, + image_key: webrender_api::ImageKey) { + let descriptor = Self::image_descriptor(size, alpha); + let data = Self::external_image_data(context_id); + + let mut updates = webrender_api::ResourceUpdates::new(); + updates.update_image(image_key, + descriptor, + data, + None); + webrender_api.update_resources(updates); + } + /// Creates a `webrender_api::ImageKey` that uses raw pixels. fn create_wr_readback_image(webrender_api: &webrender_api::RenderApi, size: Size2D, @@ -432,6 +432,16 @@ impl WebGLThread webrender_api::ImageData { + let data = webrender_api::ExternalImageData { + id: webrender_api::ExternalImageId(context_id.0 as u64), + channel_index: 0, + image_type: webrender_api::ExternalImageType::Texture2DHandle, + }; + webrender_api::ImageData::External(data) + } + /// Helper function to fetch the raw pixels used in readback mode. fn raw_pixels(context: &GLContextWrapper, size: Size2D) -> Vec { let width = size.width as usize; @@ -479,10 +489,6 @@ struct WebGLContextInfo { share_mode: WebGLContextShareMode, /// GLSync Object used for a correct synchronization with Webrender external image callbacks. gl_sync: Option, - /// An old WebRender image key that can be deleted when the next epoch ends. - old_image_key: Option, - /// An old WebRender image key that can be deleted when the current epoch ends. - very_old_image_key: Option, } /// Trait used to observe events in a WebGL Thread. diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index ed5ff53bfe7..c9112ddc9ff 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -264,10 +264,6 @@ impl WebGLRenderingContext { return; }; - // Reset webrender_image because resize creates a new image_key. - // The new image key is set in the next handle_layout() method. - self.webrender_image.set(None); - // ClearColor needs to be restored because after a resize the GLContext is recreated // and the framebuffer is cleared using the default black transparent color. let color = self.current_clear_color.get();