From d120c10d494d312f7598732962319da065285fbc Mon Sep 17 00:00:00 2001 From: Alan Jeffrey Date: Tue, 13 Jun 2017 07:38:12 -0700 Subject: [PATCH] servo: Merge #17278 - Clear webrender image id when resizing a canvas (from asajeffrey:canvas-clear-webrender-image-key-when-resizing); r=emilio Webrender isn't very happy if images change size, so clear the webrender image key when resizing a canvas. --- - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [X] These changes fix #17277 - [X] There are tests for these changes Source-Repo: https://github.com/servo/servo Source-Revision: 8c2a7d6787ba6cc1be699643e7a99021f08fe56b --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : 5e42dde44ba721287fd88b3f3d0f6984d4904b0a --- servo/components/canvas/canvas_paint_thread.rs | 4 ++++ servo/components/canvas/webgl_paint_thread.rs | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/servo/components/canvas/canvas_paint_thread.rs b/servo/components/canvas/canvas_paint_thread.rs index 39c633e127ba..b6360c638f9e 100644 --- a/servo/components/canvas/canvas_paint_thread.rs +++ b/servo/components/canvas/canvas_paint_thread.rs @@ -547,6 +547,10 @@ impl<'a> CanvasPaintThread<'a> { fn recreate(&mut self, size: Size2D) { self.drawtarget = CanvasPaintThread::create(size); + // Webrender doesn't let images change size, so we clear the webrender image key. + if let Some(image_key) = self.image_key.take() { + self.webrender_api.delete_image(image_key); + } } fn send_pixels(&mut self, chan: IpcSender>>) { diff --git a/servo/components/canvas/webgl_paint_thread.rs b/servo/components/canvas/webgl_paint_thread.rs index 9f87d3a4f510..feabaed7d2aa 100644 --- a/servo/components/canvas/webgl_paint_thread.rs +++ b/servo/components/canvas/webgl_paint_thread.rs @@ -291,7 +291,7 @@ impl WebGLPaintThread { #[allow(unsafe_code)] fn recreate(&mut self, size: Size2D) -> Result<(), &'static str> { match self.data { - WebGLPaintTaskData::Readback(ref mut context, _, _) => { + WebGLPaintTaskData::Readback(ref mut context, ref webrender_api, ref mut image_key) => { if size.width > self.size.width || size.height > self.size.height { self.size = try!(context.resize(size)); @@ -299,6 +299,10 @@ impl WebGLPaintThread { self.size = size; context.gl().scissor(0, 0, size.width, size.height); } + // Webrender doesn't let images change size, so we clear the webrender image key. + if let Some(image_key) = image_key.take() { + webrender_api.delete_image(image_key); + } } WebGLPaintTaskData::WebRender(ref api, id) => { let device_size = webrender_traits::DeviceIntSize::from_untyped(&size);