auto merge of #1418 : dhedlund/servo/composite_when_ready, r=pcwalton

The rendergl::render_scene() function is being called more often than it needs to be, sometimes before the renderer has finished.  This could result in PNG images that are drawn before the frame trees set in SetIds is rendered.
This commit is contained in:
bors-servo 2013-12-16 00:10:18 -08:00
commit 5302d870f4

View file

@ -25,6 +25,7 @@ use layers::rendergl;
use layers::scene::Scene;
use opengles::gl2;
use png;
use servo_msg::compositor_msg::IdleRenderState;
use servo_msg::constellation_msg::{ConstellationChan, NavigateMsg, ResizedWindowMsg, LoadUrlMsg};
use servo_msg::constellation_msg;
use servo_util::time::profile;
@ -52,6 +53,9 @@ pub fn run_compositor(compositor: &CompositorTask, app: &Application) {
let mut recomposite = false;
let graphics_context = CompositorTask::create_graphics_context();
// Tracks whether the renderer has finished its first rendering
let mut composite_ready = false;
// Keeps track of the current zoom factor
let mut world_zoom = 1f32;
let mut zoom_action = false;
@ -83,7 +87,10 @@ pub fn run_compositor(compositor: &CompositorTask, app: &Application) {
Exit => done = true,
ChangeReadyState(ready_state) => window.set_ready_state(ready_state),
ChangeRenderState(render_state) => window.set_render_state(render_state),
ChangeRenderState(render_state) => {
window.set_render_state(render_state);
if render_state == IdleRenderState { composite_ready = true; }
}
SetUnRenderedColor(_id, color) => {
match compositor_layer {
@ -405,7 +412,8 @@ pub fn run_compositor(compositor: &CompositorTask, app: &Application) {
// Check for messages coming from the windowing system.
check_for_window_messages(window.recv());
if recomposite {
// If asked to recomposite and renderer has run at least once
if recomposite && composite_ready {
recomposite = false;
composite();
}