diff --git a/src/servo/platform/osmain.rs b/src/servo/platform/osmain.rs index 1e29fa2fdf1..8b744a66961 100644 --- a/src/servo/platform/osmain.rs +++ b/src/servo/platform/osmain.rs @@ -14,6 +14,7 @@ use gfx::compositor::Compositor; use dom::event::{Event, ResizeEvent}; use layers::ImageLayer; use geom::size::Size2D; +use ShareGlContext = sharegl::platform::Context; use std::cmp::FuzzyEq; use task::TaskBuilder; use vec::push; @@ -22,6 +23,16 @@ use pipes::Chan; type OSMain = comm::Chan; +enum Mode { + GlutMode, + ShareMode +} + +enum Window { + GlutWindow(glut::Window), + ShareWindow(ShareGlContext) +} + enum Msg { BeginDrawing(pipes::Chan), Draw(pipes::Chan, DrawTarget), @@ -34,23 +45,40 @@ fn OSMain() -> OSMain { do on_osmain:: |po| { do platform::runmain { #debug("preparing to enter main loop"); - mainloop(po); + + let mode; + match os::getenv("SERVO_SHARE") { + Some(_) => mode = ShareMode, + None => mode = GlutMode + } + + mainloop(mode, po); } } } -fn mainloop(po: Port) { +fn mainloop(+mode: Mode, po: Port) { let key_handlers: @DVec> = @DVec(); let event_listeners: @DVec> = @DVec(); - glut::init(); - glut::init_display_mode(glut::DOUBLE); + let window; + match mode { + GlutMode => { + glut::init(); + glut::init_display_mode(glut::DOUBLE); + let glut_window = glut::create_window(~"Servo"); + glut::reshape_window(glut_window, 800, 600); + window = GlutWindow(move glut_window); + } + ShareMode => { + let share_context: ShareGlContext = sharegl::base::new(Size2D(800, 600)); + io::println(fmt!("Sharing ID is %d", share_context.id())); + window = ShareWindow(move share_context); + } + } let surfaces = @SurfaceSet(); - let window = glut::create_window(~"Servo"); - glut::reshape_window(window, 800, 600); - let context = layers::rendergl::init_render_context(); let image = @layers::layers::Image(0, 0, layers::layers::RGB24Format, ~[]); @@ -82,7 +110,8 @@ fn mainloop(po: Port) { lend_surface(*surfaces, sender); let buffer = surfaces.front.cairo_surface.data(); - let image = @layers::layers::Image(800, 600, layers::layers::ARGB32Format, buffer); + let image = @layers::layers::Image(800, 600, layers::layers::ARGB32Format, + buffer); image_layer.set_image(image); } Exit => { @@ -92,32 +121,46 @@ fn mainloop(po: Port) { } }; - do glut::reshape_func(window) |width, height| { - check_for_messages(); + match window { + GlutWindow(window) => { + do glut::reshape_func(window) |width, height| { + check_for_messages(); - #debug("osmain: window resized to %d,%d", width as int, height as int); - for event_listeners.each |event_listener| { - event_listener.send(ResizeEvent(width as int, height as int)); - } - } + #debug("osmain: window resized to %d,%d", width as int, height as int); + for event_listeners.each |event_listener| { + event_listener.send(ResizeEvent(width as int, height as int)); + } + } - do glut::display_func() { - check_for_messages(); + do glut::display_func() { + check_for_messages(); - #debug("osmain: drawing to screen"); + #debug("osmain: drawing to screen"); - do util::time::time(~"compositing") { - layers::rendergl::render_scene(context, *scene); - } + do util::time::time(~"compositing") { + layers::rendergl::render_scene(context, *scene); + } - glut::swap_buffers(); - glut::post_redisplay(); - } + glut::swap_buffers(); + glut::post_redisplay(); + } - while !*done { - #debug("osmain: running GLUT check loop"); - glut::check_loop(); - } + while !*done { + #debug("osmain: running GLUT check loop"); + glut::check_loop(); + } + } + ShareWindow(share_context) => { + loop { + check_for_messages(); + do util::time::time(~"compositing") { + layers::rendergl::render_scene(context, *scene); + } + + share_context.flush(); + } + } + } } #[doc = " diff --git a/src/servo/servo.rc b/src/servo/servo.rc index 8be9be5e94f..88040e64f5e 100755 --- a/src/servo/servo.rc +++ b/src/servo/servo.rc @@ -19,6 +19,7 @@ extern mod layers; extern mod opengles; extern mod http_client; extern mod hubbub; +extern mod sharegl; mod engine;