Auto merge of #20674 - simartin:issue_20556, r=nox

Issue #20556: Implement proper checks in WebGLRenderingContext's bindBuffer()

Implement missing check, about deleted buffers.
---
- [X] `./mach build -d` does not report any errors
- [X] `./mach build-geckolib` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #20556
- [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/20674)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2018-05-18 23:49:37 -04:00 committed by GitHub
commit cb764be7cd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 49 additions and 0 deletions

View file

@ -77,6 +77,9 @@ impl WebGLBuffer {
// NB: Only valid buffer targets come here // NB: Only valid buffer targets come here
pub fn bind(&self, target: u32) -> WebGLResult<()> { pub fn bind(&self, target: u32) -> WebGLResult<()> {
if self.is_deleted() || self.is_pending_delete() {
return Err(WebGLError::InvalidOperation);
}
if let Some(previous_target) = self.target.get() { if let Some(previous_target) = self.target.get() {
if target != previous_target { if target != previous_target {
return Err(WebGLError::InvalidOperation); return Err(WebGLError::InvalidOperation);
@ -141,6 +144,10 @@ impl WebGLBuffer {
self.pending_delete.set(true); self.pending_delete.set(true);
} }
pub fn is_pending_delete(&self) -> bool {
self.pending_delete.get()
}
pub fn add_vao_reference(&self, id: WebGLVertexArrayId) { pub fn add_vao_reference(&self, id: WebGLVertexArrayId) {
let mut vao_refs = self.vao_references.borrow_mut(); let mut vao_refs = self.vao_references.borrow_mut();
if let Some(ref mut vao_refs) = *vao_refs { if let Some(ref mut vao_refs) = *vao_refs {

View file

@ -39217,6 +39217,12 @@
{} {}
] ]
], ],
"mozilla/webgl/bindBuffer.html": [
[
"/_mozilla/mozilla/webgl/bindBuffer.html",
{}
]
],
"mozilla/webgl/bufferData.html": [ "mozilla/webgl/bufferData.html": [
[ [
"/_mozilla/mozilla/webgl/bufferData.html", "/_mozilla/mozilla/webgl/bufferData.html",
@ -70856,6 +70862,10 @@
"bc2a964c294e678b3c0e98ba83ce30a59a8bee3f", "bc2a964c294e678b3c0e98ba83ce30a59a8bee3f",
"testharness" "testharness"
], ],
"mozilla/webgl/bindBuffer.html": [
"659d53041373a6e40b9ab4cbf7e2afad45048377",
"testharness"
],
"mozilla/webgl/bufferData.html": [ "mozilla/webgl/bufferData.html": [
"e58b2257043682723fbd17eac6dcbadb32c3ca3e", "e58b2257043682723fbd17eac6dcbadb32c3ca3e",
"testharness" "testharness"

View file

@ -0,0 +1,32 @@
<!doctype html>
<meta charset="utf-8">
<title>bindBuffer checks test (issue #20556)</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
test(function() {
var gl = document.createElement("canvas").getContext("webgl");
// Simple bindings should work
var array_buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, array_buffer);
assert_equals(gl.NO_ERROR, gl.getError());
var element_array_buffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, element_array_buffer);
assert_equals(gl.NO_ERROR, gl.getError());
// Re-bindings should not work
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, array_buffer);
assert_equals(gl.INVALID_OPERATION, gl.getError());
gl.bindBuffer(gl.ARRAY_BUFFER, element_array_buffer);
assert_equals(gl.INVALID_OPERATION, gl.getError());
// Binding buffers pending deletion should fail
var buffer = gl.createBuffer();
gl.deleteBuffer(buffer);
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
assert_equals(gl.INVALID_OPERATION, gl.getError());
});
</script>