diff options
author | Ben Bridle <ben@derelict.engineering> | 2024-07-30 21:43:25 +1200 |
---|---|---|
committer | Ben Bridle <ben@derelict.engineering> | 2024-07-30 21:43:25 +1200 |
commit | 30c61fd6bc3c1c45156c853ed320312072e24893 (patch) | |
tree | 8148838488b6df04157639f397722322badfbb3b /src/window.rs | |
parent | 1e3a5ef92d834861816e6f9f671ad5df47007a58 (diff) | |
download | phosphor-30c61fd6bc3c1c45156c853ed320312072e24893.zip |
Ignore unrequested renders
Unrequested renders are detected and ignored to prevent unnecessary
rendering work. This was accomplished by keeping track of not just the
current render hint, but also keeping track of whether a render has
been requested at all.
Unrequested renders have been observed while testing on Windows 10.
Diffstat (limited to 'src/window.rs')
-rw-r--r-- | src/window.rs | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/src/window.rs b/src/window.rs index c33f5aa..72ae143 100644 --- a/src/window.rs +++ b/src/window.rs @@ -13,7 +13,7 @@ pub struct Window { surface: softbuffer::Surface, surface_dimensions: Dimensions, #[allow(dead_code)] context: softbuffer::Context, - current_render_hint: RenderHint, + render_request: RenderRequest, previous_cursor_position: Option<Point>, } @@ -53,7 +53,7 @@ impl Window { surface, surface_dimensions: Dimensions::ZERO, context, - current_render_hint: RenderHint::Redraw, + render_request: RenderRequest::REDRAW, previous_cursor_position: None, } } @@ -89,7 +89,7 @@ impl Window { self.window.set_min_inner_size(Some(size)); self.window.set_max_inner_size(Some(size)); self.window.set_inner_size(size); - self.current_render_hint = RenderHint::Redraw; + self.render_request = RenderRequest::REDRAW; self.resize_buffer_and_surface(dimensions * pixel_scale); } else { self.window.set_resizable(true); @@ -100,7 +100,7 @@ impl Window { if pixel_scale != self.pixel_scale { let increment = PhysicalSize { width: pixel_scale, height: pixel_scale }; self.window.set_resize_increments(Some(increment)); - self.current_render_hint = RenderHint::Redraw; + self.render_request = RenderRequest::REDRAW; self.resize_buffer_and_surface(self.surface_dimensions); } } @@ -121,7 +121,7 @@ impl Window { if logical_dimensions != self.buffer.dimensions() { self.buffer.resize(logical_dimensions); self.controller.on_resize(logical_dimensions); - self.current_render_hint = RenderHint::Redraw; + self.render_request = RenderRequest::REDRAW; } } @@ -139,9 +139,9 @@ impl Window { pub fn handle_render_request(&mut self) { if let RenderRequest::Render(hint) = self.controller.render_request() { - self.current_render_hint &= hint; + self.render_request &= RenderRequest::Render(hint); self.window.request_redraw(); - } else if self.current_render_hint.is_redraw() { + } else if let RenderRequest::Render(_) = self.render_request { self.window.request_redraw(); } } @@ -157,7 +157,15 @@ impl Window { let scale = self.pixel_scale as usize; let physical_dim = self.surface_dimensions; let logical_dim = self.buffer.dimensions(); - self.controller.on_render(&mut self.buffer, self.current_render_hint); + + // Return early if this render wasn't requested by us. Unrequested + // renders have been observed under Windows 10. + if let RenderRequest::Render(hint) = self.render_request { + self.controller.on_render(&mut self.buffer, hint); + } else { + return; + } + let buffer = self.buffer.as_u32_slice(); let mut surface = self.surface.buffer_mut().unwrap(); @@ -199,8 +207,8 @@ impl Window { } surface.present().unwrap(); - // Reset current_render_hint back to the lowest variant for the next frame. - self.current_render_hint = RenderHint::Update; + // Reset render_request back to the lowest variant for the next frame. + self.render_request = RenderRequest::None; } } |