Make send_buffer_requests_recursively batch messages

Also, rename it to get_buffer_requests_recursively to reflect that the
caller has to send all of the batched messages itself.
This commit is contained in:
Cameron Zwarich 2014-07-10 01:31:47 -07:00
parent d4e15697c2
commit adfd6492ad
2 changed files with 25 additions and 17 deletions

View file

@ -743,11 +743,16 @@ impl IOCompositor {
match self.scene.root { match self.scene.root {
Some(ref mut layer) => { Some(ref mut layer) => {
let rect = Rect(Point2D(0f32, 0f32), page_window.to_untyped()); let rect = Rect(Point2D(0f32, 0f32), page_window.to_untyped());
let mut requests = Vec::new();
let recomposite = let recomposite =
CompositorData::send_buffer_requests_recursively(layer.clone(), CompositorData::get_buffer_requests_recursively(&mut requests,
&self.graphics_context, layer.clone(),
rect, &self.graphics_context,
scale.get()); rect,
scale.get());
for (chan, msg) in requests.move_iter() {
let _ = chan.send_opt(msg);
}
self.recomposite = self.recomposite || recomposite; self.recomposite = self.recomposite || recomposite;
} }
None => { } None => { }

View file

@ -11,7 +11,8 @@ use geom::matrix::identity;
use geom::point::TypedPoint2D; use geom::point::TypedPoint2D;
use geom::rect::Rect; use geom::rect::Rect;
use geom::size::{Size2D, TypedSize2D}; use geom::size::{Size2D, TypedSize2D};
use gfx::render_task::{ReRenderMsg, UnusedBufferMsg}; use gfx::render_task;
use gfx::render_task::{ReRenderMsg, RenderChan, UnusedBufferMsg};
use layers::layers::{Layer, Flip, LayerBuffer, LayerBufferSet, NoFlip, TextureLayer}; use layers::layers::{Layer, Flip, LayerBuffer, LayerBufferSet, NoFlip, TextureLayer};
use layers::quadtree::Tile; use layers::quadtree::Tile;
use layers::platform::surface::{NativeCompositingGraphicsContext, NativeSurfaceMethods}; use layers::platform::surface::{NativeCompositingGraphicsContext, NativeSurfaceMethods};
@ -120,11 +121,12 @@ impl CompositorData {
// Given the current window size, determine which tiles need to be (re-)rendered and sends them // 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. // off the the appropriate renderer. Returns true if and only if the scene should be repainted.
pub fn send_buffer_requests_recursively(layer: Rc<Layer<CompositorData>>, pub fn get_buffer_requests_recursively(requests: &mut Vec<(RenderChan, render_task::Msg)>,
graphics_context: &NativeCompositingGraphicsContext, layer: Rc<Layer<CompositorData>>,
window_rect: Rect<f32>, graphics_context: &NativeCompositingGraphicsContext,
scale: f32) window_rect: Rect<f32>,
-> bool { scale: f32)
-> bool {
let (request, unused) = Layer::get_tile_rects_page(layer.clone(), window_rect, scale); let (request, unused) = Layer::get_tile_rects_page(layer.clone(), window_rect, scale);
let redisplay = !unused.is_empty(); let redisplay = !unused.is_empty();
if redisplay { if redisplay {
@ -141,14 +143,14 @@ impl CompositorData {
scale, scale,
layer.extra_data.borrow().id, layer.extra_data.borrow().id,
layer.extra_data.borrow().epoch); layer.extra_data.borrow().epoch);
let _ = layer.extra_data.borrow().pipeline.render_chan.send_opt(msg); requests.push((layer.extra_data.borrow().pipeline.render_chan.clone(), msg));
} }
if redisplay { if redisplay {
CompositorData::build_layer_tree(layer.clone(), graphics_context); CompositorData::build_layer_tree(layer.clone(), graphics_context);
} }
let send_child_buffer_request = |kid: &Rc<Layer<CompositorData>>| -> bool { let get_child_buffer_request = |kid: &Rc<Layer<CompositorData>>| -> bool {
let mut new_rect = window_rect; let mut new_rect = window_rect;
let offset = kid.extra_data.borrow().scroll_offset.to_untyped(); let offset = kid.extra_data.borrow().scroll_offset.to_untyped();
new_rect.origin.x = new_rect.origin.x - offset.x; new_rect.origin.x = new_rect.origin.x - offset.x;
@ -160,10 +162,11 @@ impl CompositorData {
// to make the child_rect appear in coordinates local to it. // to make the child_rect appear in coordinates local to it.
let child_rect = Rect(new_rect.origin.sub(&kid.bounds.borrow().origin), let child_rect = Rect(new_rect.origin.sub(&kid.bounds.borrow().origin),
new_rect.size); new_rect.size);
CompositorData::send_buffer_requests_recursively(kid.clone(), CompositorData::get_buffer_requests_recursively(requests,
graphics_context, kid.clone(),
child_rect, graphics_context,
scale) child_rect,
scale)
} }
None => { None => {
false // Layer is offscreen false // Layer is offscreen
@ -171,7 +174,7 @@ impl CompositorData {
} }
}; };
layer.children().iter().map(send_child_buffer_request).any(|b| b) || redisplay layer.children().iter().map(get_child_buffer_request).any(|b| b) || redisplay
} }
// Move the sublayer to an absolute position in page coordinates relative to its parent, // Move the sublayer to an absolute position in page coordinates relative to its parent,