mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-22 09:45:41 +00:00
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:
parent
a4e5f033d3
commit
335e2a8e91
@ -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(());
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user