From e57e2bc801ee97fef660728c01bea6d5a1daa532 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Fri, 4 May 2012 20:09:33 -0700 Subject: [PATCH] Abstract a graphics sink to shield the renderer from the osmain thread --- src/servo/gfx/renderer.rs | 15 ++++++++++++--- src/servo/platform/osmain.rs | 16 ++++++++++++++++ src/servo/servo.rs | 10 ++++++++-- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/servo/gfx/renderer.rs b/src/servo/gfx/renderer.rs index 65cf7405e6b..71716547ad0 100644 --- a/src/servo/gfx/renderer.rs +++ b/src/servo/gfx/renderer.rs @@ -10,11 +10,20 @@ enum msg { exit(comm::chan<()>) } -fn renderer(osmain: chan) -> chan { +#[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); + fn draw(next_dt: chan, draw_me: AzDrawTargetRef); +} + +fn renderer(sink: S) -> chan { task::spawn_listener:: {|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) -> chan { #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(()); diff --git a/src/servo/platform/osmain.rs b/src/servo/platform/osmain.rs index a27315b6625..c89afd3d604 100644 --- a/src/servo/platform/osmain.rs +++ b/src/servo/platform/osmain.rs @@ -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), @@ -81,6 +84,19 @@ fn mainloop(po: port) { 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 { + fn begin_drawing(next_dt: chan) { + self.send(begin_drawing(next_dt)) + } + fn draw(next_dt: chan, draw_me: AzDrawTargetRef) { + self.send(draw(next_dt, draw_me)) + } +} + type surface_set = { mut s1: { surf: surface, diff --git a/src/servo/servo.rs b/src/servo/servo.rs index 740b3b9f41d..90348c5c5d8 100644 --- a/src/servo/servo.rs +++ b/src/servo/servo.rs @@ -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);