From a9af3749420b1e0ff32753f19f7131ddb6d3edd0 Mon Sep 17 00:00:00 2001 From: Daniel Hedlund Date: Sun, 15 Dec 2013 13:38:25 -0800 Subject: [PATCH 1/3] 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(); } From 1aed7a390e8fd5dadf29348291cd1170ac657b36 Mon Sep 17 00:00:00 2001 From: Daniel Hedlund Date: Sun, 15 Dec 2013 15:52:52 -0800 Subject: [PATCH 2/3] Add comments and improve performance of a comparison --- src/components/main/compositing/run.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/main/compositing/run.rs b/src/components/main/compositing/run.rs index b07b44025b7..2da97857ad6 100644 --- a/src/components/main/compositing/run.rs +++ b/src/components/main/compositing/run.rs @@ -50,9 +50,11 @@ 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(); + // Tracks whether the renderer is idle and it's now safe to perform a composite + let mut composite_ready = false; + // Keeps track of the current zoom factor let mut world_zoom = 1f32; let mut zoom_action = false; @@ -86,10 +88,7 @@ pub fn run_compositor(compositor: &CompositorTask) { ChangeReadyState(ready_state) => window.set_ready_state(ready_state), ChangeRenderState(render_state) => { window.set_render_state(render_state); - composite_ready = match render_state { - IdleRenderState => true, - _ => false, - } + composite_ready = render_state == IdleRenderState; } SetUnRenderedColor(_id, color) => { @@ -412,6 +411,7 @@ pub fn run_compositor(compositor: &CompositorTask) { // Check for messages coming from the windowing system. check_for_window_messages(window.recv()); + // If asked to recomposite and renderer is in a safe/idle state if recomposite && composite_ready { recomposite = false; composite(); From 16b5afb1b56a3880b5216afc3ab364510f54cd86 Mon Sep 17 00:00:00 2001 From: Daniel Hedlund Date: Sun, 15 Dec 2013 16:08:30 -0800 Subject: [PATCH 3/3] Track whether first render has run, not whether it's currently idle --- src/components/main/compositing/run.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/main/compositing/run.rs b/src/components/main/compositing/run.rs index 2da97857ad6..e7178c87a80 100644 --- a/src/components/main/compositing/run.rs +++ b/src/components/main/compositing/run.rs @@ -52,7 +52,7 @@ pub fn run_compositor(compositor: &CompositorTask) { let mut recomposite = false; let graphics_context = CompositorTask::create_graphics_context(); - // Tracks whether the renderer is idle and it's now safe to perform a composite + // Tracks whether the renderer has finished its first rendering let mut composite_ready = false; // Keeps track of the current zoom factor @@ -88,7 +88,7 @@ pub fn run_compositor(compositor: &CompositorTask) { ChangeReadyState(ready_state) => window.set_ready_state(ready_state), ChangeRenderState(render_state) => { window.set_render_state(render_state); - composite_ready = render_state == IdleRenderState; + if render_state == IdleRenderState { composite_ready = true; } } SetUnRenderedColor(_id, color) => { @@ -411,7 +411,7 @@ pub fn run_compositor(compositor: &CompositorTask) { // Check for messages coming from the windowing system. check_for_window_messages(window.recv()); - // If asked to recomposite and renderer is in a safe/idle state + // If asked to recomposite and renderer has run at least once if recomposite && composite_ready { recomposite = false; composite();