aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/webglrenderingcontext.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2019-10-10 12:09:32 -0400
committerGitHub <noreply@github.com>2019-10-10 12:09:32 -0400
commitab8d99856ec50752f1ec58086fc684d5e83eeaaf (patch)
treea12b1d368c8160bcab00e4b2def53c4682ba8e02 /components/script/dom/webglrenderingcontext.rs
parent4ce72bb4d13a6fe9138b5c01ba08a98553f5b2b4 (diff)
parentc53680b282aa5bf77ca15b8a4f9ae84afb8b9361 (diff)
downloadservo-ab8d99856ec50752f1ec58086fc684d5e83eeaaf.tar.gz
servo-ab8d99856ec50752f1ec58086fc684d5e83eeaaf.zip
Auto merge of #24386 - jdm:no-preserve-drawing-buffer, r=nox
webgl: Clear the drawing buffer when preserveDrawingBuffer is false. This adds an explicit clear operation to a webgl canvas when the preserveDrawingBuffer attribute is false when creating the context. Because we're not using double buffering this may end up making some demos worse (ie. a clear operation at a random time while drawing a frame), but this problem is expected to go away when #24256 is fixed and we move to a multi-buffered frame setup. This change is important at this time because so many babylon.js demos rely on the engine clearing the frame, per the specification. --- - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix #21132 - [x] There are tests for these changes <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/24386) <!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/webglrenderingcontext.rs')
-rw-r--r--components/script/dom/webglrenderingcontext.rs46
1 files changed, 13 insertions, 33 deletions
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
index 06141d5b5e7..f19664ad0ad 100644
--- a/components/script/dom/webglrenderingcontext.rs
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -81,7 +81,6 @@ use std::cell::Cell;
use std::cmp;
use std::ptr::{self, NonNull};
use std::rc::Rc;
-use webrender_api::ImageKey;
// From the GLES 2.0.25 spec, page 85:
//
@@ -130,7 +129,7 @@ pub struct WebGLRenderingContext {
#[ignore_malloc_size_of = "Channels are hard"]
webgl_sender: WebGLMessageSender,
#[ignore_malloc_size_of = "Defined in webrender"]
- webrender_image: Cell<Option<webrender_api::ImageKey>>,
+ webrender_image: webrender_api::ImageKey,
share_mode: WebGLContextShareMode,
webgl_version: WebGLVersion,
glsl_version: WebGLSLVersion,
@@ -195,7 +194,7 @@ impl WebGLRenderingContext {
ctx_data.sender,
window.get_event_loop_waker(),
),
- webrender_image: Cell::new(None),
+ webrender_image: ctx_data.image_key,
share_mode: ctx_data.share_mode,
webgl_version,
glsl_version: ctx_data.glsl_version,
@@ -453,13 +452,17 @@ impl WebGLRenderingContext {
}
fn mark_as_dirty(&self) {
- // If we don't have a bound framebuffer, then don't mark the canvas
- // as dirty.
- if self.bound_framebuffer.get().is_none() {
- self.canvas
- .upcast::<Node>()
- .dirty(NodeDamage::OtherNodeDamage);
+ // If we have a bound framebuffer, then don't mark the canvas as dirty.
+ if self.bound_framebuffer.get().is_some() {
+ return;
}
+
+ self.canvas
+ .upcast::<Node>()
+ .dirty(NodeDamage::OtherNodeDamage);
+
+ let document = document_from_node(&*self.canvas);
+ document.add_dirty_canvas(self.context_id());
}
fn vertex_attrib(&self, indx: u32, x: f32, y: f32, z: f32, w: f32) {
@@ -808,26 +811,7 @@ impl WebGLRenderingContext {
}
pub fn layout_handle(&self) -> webrender_api::ImageKey {
- match self.share_mode {
- WebGLContextShareMode::SharedTexture => {
- // WR using ExternalTexture requires a single update message.
- self.webrender_image.get().unwrap_or_else(|| {
- let (sender, receiver) = webgl_channel().unwrap();
- self.webgl_sender.send_update_wr_image(sender).unwrap();
- let image_key = receiver.recv().unwrap();
- self.webrender_image.set(Some(image_key));
-
- image_key
- })
- },
- WebGLContextShareMode::Readback => {
- // WR using Readback requires to update WR image every frame
- // in order to send the new raw pixels.
- let (sender, receiver) = webgl_channel().unwrap();
- self.webgl_sender.send_update_wr_image(sender).unwrap();
- receiver.recv().unwrap()
- },
- }
+ self.webrender_image
}
// https://www.khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays/
@@ -4438,10 +4422,6 @@ impl WebGLMessageSender {
self.wake_after_send(|| self.sender.send_remove())
}
- pub fn send_update_wr_image(&self, sender: WebGLSender<ImageKey>) -> WebGLSendResult {
- self.wake_after_send(|| self.sender.send_update_wr_image(sender))
- }
-
pub fn send_dom_to_texture(&self, command: DOMToTextureCommand) -> WebGLSendResult {
self.wake_after_send(|| self.sender.send_dom_to_texture(command))
}