From a9af3749420b1e0ff32753f19f7131ddb6d3edd0 Mon Sep 17 00:00:00 2001 From: Daniel Hedlund Date: Sun, 15 Dec 2013 13:38:25 -0800 Subject: [PATCH] Don't perform composite unless renderer has indicated it's idle 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. --- src/components/main/compositing/run.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/components/main/compositing/run.rs b/src/components/main/compositing/run.rs index 4e841239f19..b07b44025b7 100644 --- a/src/components/main/compositing/run.rs +++ b/src/components/main/compositing/run.rs @@ -23,6 +23,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; @@ -49,6 +50,7 @@ pub fn run_compositor(compositor: &CompositorTask) { let mut window_size = Size2D(window_size.width as uint, window_size.height as uint); let mut done = false; let mut recomposite = false; + let mut composite_ready = false; let graphics_context = CompositorTask::create_graphics_context(); // Keeps track of the current zoom factor @@ -82,7 +84,13 @@ pub fn run_compositor(compositor: &CompositorTask) { 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); + composite_ready = match render_state { + IdleRenderState => true, + _ => false, + } + } SetUnRenderedColor(_id, color) => { match compositor_layer { @@ -404,7 +412,7 @@ pub fn run_compositor(compositor: &CompositorTask) { // Check for messages coming from the windowing system. check_for_window_messages(window.recv()); - if recomposite { + if recomposite && composite_ready { recomposite = false; composite(); }