aboutsummaryrefslogtreecommitdiffstats
path: root/components/canvas/webgl_thread.rs
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2020-07-28 13:08:32 -0400
committerJosh Matthews <josh@joshmatthews.net>2020-08-06 14:25:17 -0400
commita5e488bc2c6c0bec0cb00c736433b0017ae6357d (patch)
treeb1c80f04877edea856c4a97249c5ba93e5dc7438 /components/canvas/webgl_thread.rs
parent08328c22d69d728ea7ed78434dbe8d15356738e0 (diff)
downloadservo-a5e488bc2c6c0bec0cb00c736433b0017ae6357d.tar.gz
servo-a5e488bc2c6c0bec0cb00c736433b0017ae6357d.zip
webgl: Support preserveDrawingBuffer.
Diffstat (limited to 'components/canvas/webgl_thread.rs')
-rw-r--r--components/canvas/webgl_thread.rs34
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);