aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/webglrenderingcontext.rs
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2016-08-15 01:02:36 -0700
committerEric Anholt <eric@anholt.net>2016-08-26 14:04:19 -0700
commit6ec2c41df8a07c81ada5d4d1d6f5ec647fb9868b (patch)
treed0687b2d110b79d2f1e3c20a0f6fbdb40fe7fb14 /components/script/dom/webglrenderingcontext.rs
parent545ae86dff6513f1f5de083ba3ce64b181368482 (diff)
downloadservo-6ec2c41df8a07c81ada5d4d1d6f5ec647fb9868b.tar.gz
servo-6ec2c41df8a07c81ada5d4d1d6f5ec647fb9868b.zip
webgl: Protect against GL error on glBindRenderbuffer(deleted rbo).
On a GLES or compatibility underlying GL context, we were fine because an underlying renderbuffer object would just get re-created, and nothing too bad happened because we aren't tracking the currently bound renderbuffer at the DOM level. However, on a desktop GL core context, binding non-genned or deleted names is an error. Fixes a crash in object-deletion-behavior.html.
Diffstat (limited to 'components/script/dom/webglrenderingcontext.rs')
-rw-r--r--components/script/dom/webglrenderingcontext.rs20
1 files changed, 13 insertions, 7 deletions
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
index 059c6941bc1..cd336e02e50 100644
--- a/components/script/dom/webglrenderingcontext.rs
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -705,13 +705,19 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return self.webgl_error(InvalidEnum);
}
- if let Some(renderbuffer) = renderbuffer {
- renderbuffer.bind(target)
- } else {
- // Unbind the currently bound renderbuffer
- self.ipc_renderer
- .send(CanvasMsg::WebGL(WebGLCommand::BindRenderbuffer(target, None)))
- .unwrap()
+ match renderbuffer {
+ // Implementations differ on what to do in the deleted
+ // case: Chromium currently unbinds, and Gecko silently
+ // returns. The conformance tests don't cover this case.
+ Some(renderbuffer) if !renderbuffer.is_deleted() => {
+ renderbuffer.bind(target)
+ }
+ _ => {
+ // Unbind the currently bound renderbuffer
+ self.ipc_renderer
+ .send(CanvasMsg::WebGL(WebGLCommand::BindRenderbuffer(target, None)))
+ .unwrap()
+ }
}
}