From 905bff4228fdec9522bb6ad20ce385c84d65702d Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 18 Oct 2012 01:22:16 -0700 Subject: [PATCH] Refactor RenderTask into a struct --- src/servo/engine.rs | 4 +- src/servo/gfx/render_task.rs | 112 ++++++++++++++++++++--------------- 2 files changed, 66 insertions(+), 50 deletions(-) diff --git a/src/servo/engine.rs b/src/servo/engine.rs index b7a5d5a4d82..2bc9a7f2542 100644 --- a/src/servo/engine.rs +++ b/src/servo/engine.rs @@ -1,6 +1,6 @@ use gfx::compositor::Compositor; use mod gfx::render_task; -use gfx::render_task::{Renderer, RenderTask}; +use gfx::render_task::RenderTask; use task::spawn_listener; use layout::layout_task; use layout_task::LayoutTask; @@ -25,7 +25,7 @@ pub enum Msg { struct Engine { request_port: comm::Port, compositor: C, - render_task: Renderer, + render_task: RenderTask, resource_task: ResourceTask, image_cache_task: ImageCacheTask, layout_task: LayoutTask, diff --git a/src/servo/gfx/render_task.rs b/src/servo/gfx/render_task.rs index cb03de53ea4..0c7a7022e9c 100644 --- a/src/servo/gfx/render_task.rs +++ b/src/servo/gfx/render_task.rs @@ -1,9 +1,10 @@ use au = gfx::geometry; use au::au; use comm::*; -use compositor::Compositor; +use compositor::{Compositor, LayerBuffer}; use dl = display_list; use mod gfx::render_layers; +use render_layers::render_layers; use gfx::render_layers::RenderLayer; use libc::size_t; use libc::types::common::c99::uint16_t; @@ -13,8 +14,6 @@ use std::cell::Cell; use text::font_cache::FontCache; use render_context::RenderContext; -pub type Renderer = comm::Chan; - pub enum Msg { RenderMsg(RenderLayer), ExitMsg(pipes::Chan<()>) @@ -25,54 +24,32 @@ pub type RenderTask = comm::Chan; pub fn RenderTask(compositor: C) -> RenderTask { do task::spawn_listener |po: comm::Port| { let (layer_buffer_channel, layer_buffer_port) = pipes::stream(); - let mut layer_buffer_channel = layer_buffer_channel; - let mut layer_buffer_port = layer_buffer_port; - - let font_cache = FontCache(); - - debug!("renderer: beginning rendering loop"); compositor.begin_drawing(move layer_buffer_channel); + Renderer { + port: po, + compositor: compositor, + mut layer_buffer_port: Cell(layer_buffer_port), + font_cache: FontCache(), + }.start(); + } +} + +priv struct Renderer { + port: comm::Port, + compositor: C, + layer_buffer_port: Cell>, + font_cache: @FontCache +} + +impl Renderer { + fn start() { + debug!("renderer: beginning rendering loop"); + loop { - match po.recv() { - RenderMsg(move render_layer) => { - debug!("renderer: got render request"); - - if !layer_buffer_port.peek() { - warn!("renderer: waiting on layer buffer"); - } - - let layer_buffer_cell = Cell(layer_buffer_port.recv()); - - let (layer_buffer_channel, new_layer_buffer_port) = pipes::stream(); - let layer_buffer_channel = Cell(move layer_buffer_channel); - layer_buffer_port = new_layer_buffer_port; - - let render_layer = Cell(move render_layer); - - #debug("renderer: rendering"); - - do util::time::time(~"rendering") { - let layer_buffer = layer_buffer_cell.take(); - let render_layer = move render_layer.take(); - - let layer_buffer = - for render_layers::render_layers(&render_layer, move layer_buffer) - |render_layer, layer_buffer| { - let ctx = RenderContext { - canvas: layer_buffer, - font_cache: font_cache - }; - - ctx.clear(); - render_layer.display_list.draw(&ctx); - }; - - #debug("renderer: returning surface"); - compositor.draw(layer_buffer_channel.take(), move layer_buffer); - } - } + match self.port.recv() { + RenderMsg(move render_layer) => self.render(render_layer), ExitMsg(response_ch) => { response_ch.send(()); break; @@ -80,4 +57,43 @@ pub fn RenderTask(compositor: C) -> RenderTask { } } } -} + + fn render(render_layer: RenderLayer) { + debug!("renderer: got render request"); + + let layer_buffer_port = self.layer_buffer_port.take(); + + if !layer_buffer_port.peek() { + warn!("renderer: waiting on layer buffer"); + } + + let layer_buffer = layer_buffer_port.recv(); + let (layer_buffer_channel, new_layer_buffer_port) = pipes::stream(); + self.layer_buffer_port.put_back(new_layer_buffer_port); + + let render_layer_cell = Cell(move render_layer); + let layer_buffer_cell = Cell(layer_buffer); + let layer_buffer_channel_cell = Cell(move layer_buffer_channel); + + #debug("renderer: rendering"); + + do util::time::time(~"rendering") { + let render_layer = render_layer_cell.take(); + let layer_buffer = layer_buffer_cell.take(); + let layer_buffer_channel = layer_buffer_channel_cell.take(); + + let layer_buffer = for render_layers(&render_layer, move layer_buffer) |render_layer, layer_buffer| { + let ctx = RenderContext { + canvas: layer_buffer, + font_cache: self.font_cache + }; + + ctx.clear(); + render_layer.display_list.draw(&ctx); + }; + + #debug("renderer: returning surface"); + self.compositor.draw(layer_buffer_channel, move layer_buffer); + } + } +} \ No newline at end of file