Skip to content

Commit

Permalink
Auto merge of #8831 - simartin:ticket_6791, r=eefriedman
Browse files Browse the repository at this point in the history
Issue #6791: Allow more array types in bufferData and bufferSubData.

Fix #6791

<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/8831)
<!-- Reviewable:end -->
  • Loading branch information
bors-servo committed Dec 6, 2015
2 parents e16c930 + fa555d0 commit 95e6b1d
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 9 deletions.
4 changes: 2 additions & 2 deletions components/canvas_traits/lib.rs
Expand Up @@ -134,8 +134,8 @@ pub enum CanvasWebGLMsg {
BlendFunc(u32, u32),
BlendFuncSeparate(u32, u32, u32, u32),
AttachShader(u32, u32),
BufferData(u32, Vec<f32>, u32),
BufferSubData(u32, isize, Vec<f32>),
BufferData(u32, Vec<u8>, u32),
BufferSubData(u32, isize, Vec<u8>),
Clear(u32),
ClearColor(f32, f32, f32, f32),
ClearDepth(f64),
Expand Down
10 changes: 3 additions & 7 deletions components/script/dom/webglrenderingcontext.rs
Expand Up @@ -37,7 +37,7 @@ use net_traits::image_cache_task::ImageResponse;
use offscreen_gl_context::GLContextAttributes;
use std::cell::Cell;
use std::sync::mpsc::channel;
use std::{mem, ptr, slice};
use std::{ptr, slice};
use util::str::DOMString;
use util::vec::byte_swap;

Expand Down Expand Up @@ -400,9 +400,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if buffer_data.is_null() {
return self.webgl_error(InvalidValue) // https://github.com/servo/servo/issues/5014
}
let data_f32 = JS_GetFloat32ArrayData(buffer_data, ptr::null());
let data_vec_length = length / mem::size_of::<f32>() as u32;
slice::from_raw_parts(data_f32, data_vec_length as usize).to_vec()
slice::from_raw_parts(ptr, length as usize).to_vec()
};
self.ipc_renderer
.send(CanvasMsg::WebGL(CanvasWebGLMsg::BufferData(target, data_vec, usage)))
Expand Down Expand Up @@ -431,9 +429,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
if buffer_data.is_null() {
return self.webgl_error(InvalidValue) // https://github.com/servo/servo/issues/5014
}
let data_f32 = JS_GetFloat32ArrayData(buffer_data, ptr::null());
let data_vec_length = length / mem::size_of::<f32>() as u32;
slice::from_raw_parts(data_f32, data_vec_length as usize).to_vec()
slice::from_raw_parts(ptr, length as usize).to_vec()
};
// FIXME(simartin) Check that the defined region is inside the allocated one
// https://github.com/servo/servo/issues/8738
Expand Down
6 changes: 6 additions & 0 deletions tests/wpt/mozilla/meta/MANIFEST.json
Expand Up @@ -5787,6 +5787,12 @@
"url": "/_mozilla/mozilla/variadic-interface.html"
}
],
"mozilla/webgl/bufferData.html": [
{
"path": "mozilla/webgl/bufferData.html",
"url": "/_mozilla/mozilla/webgl/bufferData.html"
}
],
"mozilla/webgl/context_creation_error.html": [
{
"path": "mozilla/webgl/context_creation_error.html",
Expand Down
44 changes: 44 additions & 0 deletions tests/wpt/mozilla/tests/mozilla/webgl/bufferData.html
@@ -0,0 +1,44 @@
<!doctype html>
<meta charset="utf-8">
<title>bufferData and bufferSubData input array type check (issue #6791)</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
test(function() {
var gl = document.createElement("canvas").getContext("webgl");
var texture_buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, texture_buffer);

var coordI8 = new Int8Array([ 1, 0 ]);
gl.bufferData(gl.ARRAY_BUFFER, coordI8, gl.STATIC_DRAW);
gl.bufferSubData(gl.ARRAY_BUFFER, 1, coordI8);

var coordU8 = new Uint8Array([ 1, 0 ]);
gl.bufferData(gl.ARRAY_BUFFER, coordU8, gl.STATIC_DRAW);
gl.bufferSubData(gl.ARRAY_BUFFER, 1, coordU8);

var coordI16 = new Int16Array([ 1, 0 ]);
gl.bufferData(gl.ARRAY_BUFFER, coordI16, gl.STATIC_DRAW);
gl.bufferSubData(gl.ARRAY_BUFFER, 1, coordI16);

var coordU16 = new Uint16Array([ 1, 0 ]);
gl.bufferData(gl.ARRAY_BUFFER, coordU16, gl.STATIC_DRAW);
gl.bufferSubData(gl.ARRAY_BUFFER, 1, coordU16);

var coordI32 = new Int32Array([ 1, 0 ]);
gl.bufferData(gl.ARRAY_BUFFER, coordI32, gl.STATIC_DRAW);
gl.bufferSubData(gl.ARRAY_BUFFER, 1, coordI32);

var coordU32 = new Uint32Array([ 1, 0 ]);
gl.bufferData(gl.ARRAY_BUFFER, coordU32, gl.STATIC_DRAW);
gl.bufferSubData(gl.ARRAY_BUFFER, 1, coordU32);

var coordF32 = new Float32Array([ 1.0, 0.0 ]);
gl.bufferData(gl.ARRAY_BUFFER, coordF32, gl.STATIC_DRAW);
gl.bufferSubData(gl.ARRAY_BUFFER, 1, coordF32);

var coordF64 = new Float64Array([ 1.0, 0.0 ]);
gl.bufferData(gl.ARRAY_BUFFER, coordF64, gl.STATIC_DRAW);
gl.bufferSubData(gl.ARRAY_BUFFER, 1, coordF64);
});
</script>

0 comments on commit 95e6b1d

Please sign in to comment.