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

This commit is contained in:
Brian Anderson 2012-05-04 20:09:33 -07:00
parent 8ea3faac03
commit e57e2bc801
3 changed files with 36 additions and 5 deletions

View file

@ -10,11 +10,20 @@ enum msg {
exit(comm::chan<()>) 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| task::spawn_listener::<msg> {|po|
listen {|draw_target_ch| listen {|draw_target_ch|
#debug("renderer: beginning rendering loop"); #debug("renderer: beginning rendering loop");
osmain.send(osmain::begin_drawing(draw_target_ch)); sink.begin_drawing(draw_target_ch);
loop { loop {
alt po.recv() { alt po.recv() {
@ -24,7 +33,7 @@ fn renderer(osmain: chan<osmain::msg>) -> chan<msg> {
#debug("renderer: rendering"); #debug("renderer: rendering");
draw_display_list(draw_target, display_list); draw_display_list(draw_target, display_list);
#debug("renderer: returning surface"); #debug("renderer: returning surface");
osmain.send(osmain::draw(draw_target_ch, draw_target)); sink.draw(draw_target_ch, draw_target);
} }
exit(response_ch) { exit(response_ch) {
response_ch.send(()); response_ch.send(());

View file

@ -1,9 +1,12 @@
export msg, osmain, gfxsink;
import azure::*; import azure::*;
import azure::bindgen::*; import azure::bindgen::*;
import azure::cairo; import azure::cairo;
import azure::cairo::bindgen::*; import azure::cairo::bindgen::*;
import comm::*; import comm::*;
import azure::cairo::cairo_surface_t; import azure::cairo::cairo_surface_t;
import gfx::renderer;
enum msg { enum msg {
begin_drawing(chan<AzDrawTargetRef>), begin_drawing(chan<AzDrawTargetRef>),
@ -81,6 +84,19 @@ fn mainloop(po: port<msg>) {
sdl::quit(); 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 = { type surface_set = {
mut s1: { mut s1: {
surf: surface, surf: surface,

View file

@ -2,13 +2,19 @@ import comm::*;
import parser::html; import parser::html;
import parser::html::methods; import parser::html::methods;
import result::extensions; import result::extensions;
import gfx::renderer;
import platform::osmain;
fn main(args: [str]) { fn main(args: [str]) {
// The platform event handler thread // The platform event handler thread
let osmain = platform::osmain::osmain(); let osmain = osmain::osmain();
// The renderer // 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 // The layout task
let layout = layout::layout::layout(renderer); let layout = layout::layout::layout(renderer);