diff options
author | Josh Matthews <josh@joshmatthews.net> | 2020-07-28 13:08:32 -0400 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2020-08-06 14:25:17 -0400 |
commit | a5e488bc2c6c0bec0cb00c736433b0017ae6357d (patch) | |
tree | b1c80f04877edea856c4a97249c5ba93e5dc7438 /components/canvas/webgl_thread.rs | |
parent | 08328c22d69d728ea7ed78434dbe8d15356738e0 (diff) | |
download | servo-a5e488bc2c6c0bec0cb00c736433b0017ae6357d.tar.gz servo-a5e488bc2c6c0bec0cb00c736433b0017ae6357d.zip |
webgl: Support preserveDrawingBuffer.
Diffstat (limited to 'components/canvas/webgl_thread.rs')
-rw-r--r-- | components/canvas/webgl_thread.rs | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/components/canvas/webgl_thread.rs b/components/canvas/webgl_thread.rs index 3c27c523866..168a7e9f070 100644 --- a/components/canvas/webgl_thread.rs +++ b/components/canvas/webgl_thread.rs @@ -827,22 +827,30 @@ impl WebGLThread { debug!("Swapping {:?}", context_id); swap_chain - .swap_buffers(&mut self.device, &mut data.ctx) + .swap_buffers( + &mut self.device, + &mut data.ctx, + if data.attributes.preserve_drawing_buffer { + surfman_chains::PreserveBuffer::Yes(&*data.gl) + } else { + surfman_chains::PreserveBuffer::No + }, + ) .unwrap(); debug_assert_eq!(data.gl.get_error(), gl::NO_ERROR); - // TODO: if preserveDrawingBuffer is true, then blit the front buffer to the back buffer - // https://github.com/servo/servo/issues/24604 - debug!("Clearing {:?}", context_id); - let alpha = data - .state - .requested_flags - .contains(ContextAttributeFlags::ALPHA); - let clear_color = [0.0, 0.0, 0.0, !alpha as i32 as f32]; - swap_chain - .clear_surface(&mut self.device, &mut data.ctx, &*data.gl, clear_color) - .unwrap(); - debug_assert_eq!(data.gl.get_error(), gl::NO_ERROR); + if !data.attributes.preserve_drawing_buffer { + debug!("Clearing {:?}", context_id); + let alpha = data + .state + .requested_flags + .contains(ContextAttributeFlags::ALPHA); + let clear_color = [0.0, 0.0, 0.0, !alpha as i32 as f32]; + swap_chain + .clear_surface(&mut self.device, &mut data.ctx, &*data.gl, clear_color) + .unwrap(); + debug_assert_eq!(data.gl.get_error(), gl::NO_ERROR); + } // Rebind framebuffers as appropriate. debug!("Rebinding {:?}", context_id); |