Address metajack's comments

This commit is contained in:
eschweic 2013-07-08 13:17:46 -07:00
parent d40086048c
commit 435941e932
2 changed files with 32 additions and 10 deletions

View file

@ -31,12 +31,28 @@ pub struct RenderLayer {
pub enum Msg {
RenderMsg(RenderLayer),
ReRenderMsg(~[(Rect<uint>, Rect<f32>)], f32),
ReRenderMsg(~[BufferRequest], f32),
PaintPermissionGranted,
PaintPermissionRevoked,
ExitMsg(Chan<()>),
}
/// A request from the compositor to the renderer for tiles that need to be (re)displayed.
pub struct BufferRequest {
// The rect in pixels that will be drawn to the screen
screen_rect: Rect<uint>,
// The rect in page coordinates that this tile represents
page_rect: Rect<f32>,
}
pub fn BufferRequest(screen_rect: Rect<uint>, page_rect: Rect<f32>) -> BufferRequest {
BufferRequest {
screen_rect: screen_rect,
page_rect: page_rect,
}
}
#[deriving(Clone)]
pub struct RenderChan {
chan: SharedChan<Msg>,
@ -145,7 +161,7 @@ impl<C: RenderListener + Send> RenderTask<C> {
}
}
fn render(&mut self, tiles: ~[(Rect<uint>, Rect<f32>)], scale: f32) {
fn render(&mut self, tiles: ~[BufferRequest], scale: f32) {
let render_layer;
match self.render_layer {
Some(ref r_layer) => {
@ -162,18 +178,17 @@ impl<C: RenderListener + Send> RenderTask<C> {
// Divide up the layer into tiles.
do time::profile(time::RenderingPrepBuffCategory, self.profiler_chan.clone()) {
for tiles.each |tile_rects| {
let (screen_rect, page_rect) = *tile_rects;
let width = screen_rect.size.width;
let height = screen_rect.size.height;
for tiles.each |tile| {
let width = tile.screen_rect.size.width;
let height = tile.screen_rect.size.height;
let buffer = LayerBuffer {
draw_target: DrawTarget::new_with_fbo(self.opts.render_backend,
self.share_gl_context,
Size2D(width as i32, height as i32),
B8G8R8A8),
rect: page_rect,
screen_pos: screen_rect,
rect: tile.page_rect,
screen_pos: tile.screen_rect,
resolution: scale,
stride: (width * 4) as uint
};

View file

@ -14,7 +14,7 @@ use servo_msg::compositor_msg::{RenderListener, LayerBuffer, LayerBufferSet, Ren
use servo_msg::compositor_msg::{ReadyState, ScriptListener};
use servo_msg::constellation_msg::{CompositorAck, ConstellationChan};
use servo_msg::constellation_msg;
use gfx::render_task::{RenderChan, ReRenderMsg};
use gfx::render_task::{RenderChan, ReRenderMsg, BufferRequest};
use azure::azure_hl::{DataSourceSurface, DrawTarget, SourceSurfaceMethods, current_gl_context};
use azure::azure::AzGLContext;
@ -261,7 +261,7 @@ impl CompositorTask {
// TODO: clamp tiles to page bounds
// TODO: add null buffer/checkerboard tile to stop a flood of requests
debug!("requesting tile: (%?, %?): %?", x, y, tile_size);
tile_request.push((tile_screen_pos, tile_page_pos));
tile_request.push(BufferRequest(tile_screen_pos, tile_page_pos));
x += tile_size;
}
@ -517,6 +517,9 @@ impl CompositorTask {
root_layer.common.set_transform(scroll_transform);
// FIXME: ask_for_tiles() should be called here, but currently this sends a flood of requests
// to the renderer, which slows the application dramatically. Instead, ask_for_tiles() is only
// called on a click event.
// ask_for_tiles();
*recomposite = true;
@ -557,6 +560,10 @@ impl CompositorTask {
window_size.height as f32 / -2f32,
0.0);
root_layer.common.set_transform(zoom_transform);
// FIXME: ask_for_tiles() should be called here, but currently this sends a flood of requests
// to the renderer, which slows the application dramatically. Instead, ask_for_tiles() is only
// called on a click event.
// ask_for_tiles();
*recomposite = true;