diff options
author | Eric Anholt <eric@anholt.net> | 2016-08-15 01:02:36 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2016-08-26 14:04:19 -0700 |
commit | 6ec2c41df8a07c81ada5d4d1d6f5ec647fb9868b (patch) | |
tree | d0687b2d110b79d2f1e3c20a0f6fbdb40fe7fb14 /components/script/dom/webglrenderingcontext.rs | |
parent | 545ae86dff6513f1f5de083ba3ce64b181368482 (diff) | |
download | servo-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.rs | 20 |
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() + } } } |