diff options
author | Simon Martin <simartin@users.sourceforge.net> | 2015-12-04 23:23:17 +0100 |
---|---|---|
committer | Simon Martin <simartin@users.sourceforge.net> | 2015-12-06 15:28:59 +0100 |
commit | fa555d0e2e66bd7bd63e57299ef53cb3c7f132ab (patch) | |
tree | e2249276ef49ab54539a339478d32665e8da9d60 | |
parent | 2cfcc26d9e5cc732a7594f0c0d96d4174c6b0a8a (diff) | |
download | servo-fa555d0e2e66bd7bd63e57299ef53cb3c7f132ab.tar.gz servo-fa555d0e2e66bd7bd63e57299ef53cb3c7f132ab.zip |
Issue #6791: Allow more array types in bufferData and bufferSubData.
-rw-r--r-- | components/canvas_traits/lib.rs | 4 | ||||
-rw-r--r-- | components/script/dom/webglrenderingcontext.rs | 10 | ||||
-rw-r--r-- | tests/wpt/mozilla/meta/MANIFEST.json | 6 | ||||
-rw-r--r-- | tests/wpt/mozilla/tests/mozilla/webgl/bufferData.html | 44 |
4 files changed, 55 insertions, 9 deletions
diff --git a/components/canvas_traits/lib.rs b/components/canvas_traits/lib.rs index 305704b584d..7bf10fe41ed 100644 --- a/components/canvas_traits/lib.rs +++ b/components/canvas_traits/lib.rs @@ -127,8 +127,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), diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 6655a56f921..37fc47d9d78 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -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; @@ -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))) @@ -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 diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 5fa510c5fe0..cdb4e4b59ae 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -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", diff --git a/tests/wpt/mozilla/tests/mozilla/webgl/bufferData.html b/tests/wpt/mozilla/tests/mozilla/webgl/bufferData.html new file mode 100644 index 00000000000..f278d7513dc --- /dev/null +++ b/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> |