servo: Abstract a graphics sink to shield the renderer from the osmain thread

Source-Repo: https://github.com/servo/servo
Source-Revision: e57e2bc801ee97fef660728c01bea6d5a1daa532
This commit is contained in:
Brian Anderson 2012-05-04 20:09:33 -07:00
parent a4e5f033d3
commit 335e2a8e91
3 changed files with 36 additions and 5 deletions

View File

@ -10,11 +10,20 @@ enum msg {
exit(comm::chan<()>)
}
fn renderer(osmain: chan<osmain::msg>) -> chan<msg> {
#[doc = "
The interface used to by the renderer to aquire draw targets for
each rendered frame and submit them to be drawn to the display
"]
iface sink {
fn begin_drawing(next_dt: chan<AzDrawTargetRef>);
fn draw(next_dt: chan<AzDrawTargetRef>, draw_me: AzDrawTargetRef);
}
fn renderer<S: sink send>(sink: S) -> chan<msg> {
task::spawn_listener::<msg> {|po|
listen {|draw_target_ch|
#debug("renderer: beginning rendering loop");
osmain.send(osmain::begin_drawing(draw_target_ch));
sink.begin_drawing(draw_target_ch);
loop {
alt po.recv() {
@ -24,7 +33,7 @@ fn renderer(osmain: chan<osmain::msg>) -> chan<msg> {
#debug("renderer: rendering");
draw_display_list(draw_target, display_list);
#debug("renderer: returning surface");
osmain.send(osmain::draw(draw_target_ch, draw_target));
sink.draw(draw_target_ch, draw_target);
}
exit(response_ch) {
response_ch.send(());

View File

@ -1,9 +1,12 @@
export msg, osmain, gfxsink;
import azure::*;
import azure::bindgen::*;
import azure::cairo;
import azure::cairo::bindgen::*;
import comm::*;
import azure::cairo::cairo_surface_t;
import gfx::renderer;
enum msg {
begin_drawing(chan<AzDrawTargetRef>),
@ -81,6 +84,19 @@ fn mainloop(po: port<msg>) {
sdl::quit();
}
#[doc = "
Implementation to allow the osmain channel to be used as a graphics
sink for the renderer
"]
impl gfxsink of renderer::sink for chan<msg> {
fn begin_drawing(next_dt: chan<AzDrawTargetRef>) {
self.send(begin_drawing(next_dt))
}
fn draw(next_dt: chan<AzDrawTargetRef>, draw_me: AzDrawTargetRef) {
self.send(draw(next_dt, draw_me))
}
}
type surface_set = {
mut s1: {
surf: surface,

View File

@ -2,13 +2,19 @@ import comm::*;
import parser::html;
import parser::html::methods;
import result::extensions;
import gfx::renderer;
import platform::osmain;
fn main(args: [str]) {
// The platform event handler thread
let osmain = platform::osmain::osmain();
let osmain = osmain::osmain();
// The renderer
let renderer = gfx::renderer::renderer(osmain);
let renderer = {
// Use the platform thread as the renderer sink
import osmain::gfxsink;
renderer::renderer(osmain)
};
// The layout task
let layout = layout::layout::layout(renderer);