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,13 +705,19 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
return self.webgl_error(InvalidEnum); return self.webgl_error(InvalidEnum);
} }
if let Some(renderbuffer) = renderbuffer { match renderbuffer {
renderbuffer.bind(target) // Implementations differ on what to do in the deleted
} else { // case: Chromium currently unbinds, and Gecko silently
// Unbind the currently bound renderbuffer // returns. The conformance tests don't cover this case.
self.ipc_renderer Some(renderbuffer) if !renderbuffer.is_deleted() => {
.send(CanvasMsg::WebGL(WebGLCommand::BindRenderbuffer(target, None))) renderbuffer.bind(target)
.unwrap() }
_ => {
// Unbind the currently bound renderbuffer
self.ipc_renderer
.send(CanvasMsg::WebGL(WebGLCommand::BindRenderbuffer(target, None)))
.unwrap()
}
} }
} }