diff --git a/src/components/compositing/compositor.rs b/src/components/compositing/compositor.rs index 4c23043175c..722d6c3d629 100644 --- a/src/components/compositing/compositor.rs +++ b/src/components/compositing/compositor.rs @@ -46,6 +46,7 @@ use servo_util::opts::Opts; use servo_util::time::{profile, TimeProfilerChan}; use servo_util::{memory, time, url}; use std::io::timer::sleep; +use std::collections::hashmap::HashMap; use std::path::Path; use std::rc::Rc; use time::precise_time_s; @@ -744,15 +745,17 @@ impl IOCompositor { match self.scene.root { Some(ref mut layer) => { let rect = Rect(Point2D(0f32, 0f32), page_window.to_untyped()); - let mut requests = Vec::new(); + let mut request_map = HashMap::new(); let recomposite = - CompositorData::get_buffer_requests_recursively(&mut requests, + CompositorData::get_buffer_requests_recursively(&mut request_map, layer.clone(), &self.graphics_context, rect, scale.get()); - for (chan, request) in requests.move_iter() { - let _ = chan.send_opt(ReRenderMsg(request)); + for (_pipeline_id, requests) in request_map.move_iter() { + for (chan, request) in requests.move_iter() { + let _ = chan.send_opt(ReRenderMsg(request)); + } } self.recomposite = self.recomposite || recomposite; } diff --git a/src/components/compositing/compositor_data.rs b/src/components/compositing/compositor_data.rs index 1e8f195a775..609845782e5 100644 --- a/src/components/compositing/compositor_data.rs +++ b/src/components/compositing/compositor_data.rs @@ -20,6 +20,7 @@ use servo_msg::compositor_msg::{Epoch, FixedPosition, LayerId}; use servo_msg::compositor_msg::ScrollPolicy; use servo_msg::constellation_msg::PipelineId; use servo_util::geometry::PagePx; +use std::collections::hashmap::HashMap; use std::rc::Rc; #[cfg(target_os="macos")] @@ -120,7 +121,9 @@ impl CompositorData { // Given the current window size, determine which tiles need to be (re-)rendered and sends them // off the the appropriate renderer. Returns true if and only if the scene should be repainted. - pub fn get_buffer_requests_recursively(requests: &mut Vec<(RenderChan, ReRenderRequest)>, + pub fn get_buffer_requests_recursively(requests: &mut HashMap>, layer: Rc>, graphics_context: &NativeCompositingGraphicsContext, window_rect: Rect, @@ -138,13 +141,16 @@ impl CompositorData { // // FIXME(#2003, pcwalton): We may want to batch these up in the case in which // one page has multiple layers, to avoid the user seeing inconsistent states. + let pipeline_id = layer.extra_data.borrow().pipeline.id; + let chan = layer.extra_data.borrow().pipeline.render_chan.clone(); let msg = ReRenderRequest { buffer_requests: request, scale: scale, layer_id: layer.extra_data.borrow().id, epoch: layer.extra_data.borrow().epoch, }; - requests.push((layer.extra_data.borrow().pipeline.render_chan.clone(), msg)); + let vec = requests.find_or_insert(pipeline_id, Vec::new()); + vec.push((chan, msg)); } if redisplay {