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.
This commit is contained in:
Eric Anholt 2016-08-15 01:02:36 -07:00
parent 545ae86dff
commit 6ec2c41df8

View file

@ -705,15 +705,21 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return self.webgl_error(InvalidEnum); return self.webgl_error(InvalidEnum);
} }
if let Some(renderbuffer) = renderbuffer { 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) renderbuffer.bind(target)
} else { }
_ => {
// Unbind the currently bound renderbuffer // Unbind the currently bound renderbuffer
self.ipc_renderer self.ipc_renderer
.send(CanvasMsg::WebGL(WebGLCommand::BindRenderbuffer(target, None))) .send(CanvasMsg::WebGL(WebGLCommand::BindRenderbuffer(target, None)))
.unwrap() .unwrap()
} }
} }
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8 // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.8
fn BindTexture(&self, target: u32, texture: Option<&WebGLTexture>) { fn BindTexture(&self, target: u32, texture: Option<&WebGLTexture>) {