mirror of
https://github.com/servo/servo.git
synced 2025-07-23 15:23:42 +01:00
Abstract a graphics sink to shield the renderer from the osmain thread
This commit is contained in:
parent
8ea3faac03
commit
e57e2bc801
3 changed files with 36 additions and 5 deletions
|
@ -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(());
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue