Implement gl.getUniform()

This commit is contained in:
Anthony Ramine 2018-07-18 18:22:15 +02:00
parent 20714bd08c
commit 3e8c2d659a
14 changed files with 306 additions and 200 deletions

View file

@ -982,6 +982,119 @@ impl WebGLImpl {
WebGLCommand::VertexAttribDivisor { index, divisor } => {
ctx.gl().vertex_attrib_divisor(index, divisor)
}
WebGLCommand::GetUniformBool(program_id, loc, ref sender) => {
let mut value = [0];
unsafe {
ctx.gl().get_uniform_iv(program_id.get(), loc, &mut value);
}
sender.send(value[0] != 0).unwrap();
}
WebGLCommand::GetUniformBool2(program_id, loc, ref sender) => {
let mut value = [0; 2];
unsafe {
ctx.gl().get_uniform_iv(program_id.get(), loc, &mut value);
}
let value = [
value[0] != 0,
value[1] != 0,
];
sender.send(value).unwrap();
}
WebGLCommand::GetUniformBool3(program_id, loc, ref sender) => {
let mut value = [0; 3];
unsafe {
ctx.gl().get_uniform_iv(program_id.get(), loc, &mut value);
}
let value = [
value[0] != 0,
value[1] != 0,
value[2] != 0,
];
sender.send(value).unwrap();
}
WebGLCommand::GetUniformBool4(program_id, loc, ref sender) => {
let mut value = [0; 4];
unsafe {
ctx.gl().get_uniform_iv(program_id.get(), loc, &mut value);
}
let value = [
value[0] != 0,
value[1] != 0,
value[2] != 0,
value[3] != 0,
];
sender.send(value).unwrap();
}
WebGLCommand::GetUniformInt(program_id, loc, ref sender) => {
let mut value = [0];
unsafe {
ctx.gl().get_uniform_iv(program_id.get(), loc, &mut value);
}
sender.send(value[0]).unwrap();
}
WebGLCommand::GetUniformInt2(program_id, loc, ref sender) => {
let mut value = [0; 2];
unsafe {
ctx.gl().get_uniform_iv(program_id.get(), loc, &mut value);
}
sender.send(value).unwrap();
}
WebGLCommand::GetUniformInt3(program_id, loc, ref sender) => {
let mut value = [0; 3];
unsafe {
ctx.gl().get_uniform_iv(program_id.get(), loc, &mut value);
}
sender.send(value).unwrap();
}
WebGLCommand::GetUniformInt4(program_id, loc, ref sender) => {
let mut value = [0; 4];
unsafe {
ctx.gl().get_uniform_iv(program_id.get(), loc, &mut value);
}
sender.send(value).unwrap();
}
WebGLCommand::GetUniformFloat(program_id, loc, ref sender) => {
let mut value = [0.];
unsafe {
ctx.gl().get_uniform_fv(program_id.get(), loc, &mut value);
}
sender.send(value[0]).unwrap();
}
WebGLCommand::GetUniformFloat2(program_id, loc, ref sender) => {
let mut value = [0.; 2];
unsafe {
ctx.gl().get_uniform_fv(program_id.get(), loc, &mut value);
}
sender.send(value).unwrap();
}
WebGLCommand::GetUniformFloat3(program_id, loc, ref sender) => {
let mut value = [0.; 3];
unsafe {
ctx.gl().get_uniform_fv(program_id.get(), loc, &mut value);
}
sender.send(value).unwrap();
}
WebGLCommand::GetUniformFloat4(program_id, loc, ref sender) => {
let mut value = [0.; 4];
unsafe {
ctx.gl().get_uniform_fv(program_id.get(), loc, &mut value);
}
sender.send(value).unwrap();
}
WebGLCommand::GetUniformFloat9(program_id, loc, ref sender) => {
let mut value = [0.; 9];
unsafe {
ctx.gl().get_uniform_fv(program_id.get(), loc, &mut value);
}
sender.send(value).unwrap();
}
WebGLCommand::GetUniformFloat16(program_id, loc, ref sender) => {
let mut value = [0.; 16];
unsafe {
ctx.gl().get_uniform_fv(program_id.get(), loc, &mut value);
}
sender.send(value).unwrap();
}
}
// TODO: update test expectations in order to enable debug assertions

View file

@ -284,6 +284,20 @@ pub enum WebGLCommand {
DrawArraysInstanced { mode: u32, first: i32, count: i32, primcount: i32 },
DrawElementsInstanced { mode: u32, count: i32, type_: u32, offset: u32, primcount: i32 },
VertexAttribDivisor { index: u32, divisor: u32 },
GetUniformBool(WebGLProgramId, i32, WebGLSender<bool>),
GetUniformBool2(WebGLProgramId, i32, WebGLSender<[bool; 2]>),
GetUniformBool3(WebGLProgramId, i32, WebGLSender<[bool; 3]>),
GetUniformBool4(WebGLProgramId, i32, WebGLSender<[bool; 4]>),
GetUniformInt(WebGLProgramId, i32, WebGLSender<i32>),
GetUniformInt2(WebGLProgramId, i32, WebGLSender<[i32; 2]>),
GetUniformInt3(WebGLProgramId, i32, WebGLSender<[i32; 3]>),
GetUniformInt4(WebGLProgramId, i32, WebGLSender<[i32; 4]>),
GetUniformFloat(WebGLProgramId, i32, WebGLSender<f32>),
GetUniformFloat2(WebGLProgramId, i32, WebGLSender<[f32; 2]>),
GetUniformFloat3(WebGLProgramId, i32, WebGLSender<[f32; 3]>),
GetUniformFloat4(WebGLProgramId, i32, WebGLSender<[f32; 4]>),
GetUniformFloat9(WebGLProgramId, i32, WebGLSender<[f32; 9]>),
GetUniformFloat16(WebGLProgramId, i32, WebGLSender<[f32; 16]>),
}
macro_rules! define_resource_id_struct {

View file

@ -766,6 +766,17 @@ impl WebGL2RenderingContextMethods for WebGL2RenderingContext {
self.base.UniformMatrix4fv(location, transpose, v)
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
#[allow(unsafe_code)]
unsafe fn GetUniform(
&self,
cx: *mut JSContext,
program: &WebGLProgram,
location: &WebGLUniformLocation,
) -> JSVal {
self.base.GetUniform(cx, program, location)
}
/// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
fn UseProgram(&self, program: Option<&WebGLProgram>) {
self.base.UseProgram(program)

View file

@ -8,8 +8,8 @@ use canvas_traits::webgl::{ActiveAttribInfo, DOMToTextureCommand, Parameter};
use canvas_traits::webgl::{ShaderParameter, TexParameter, WebGLCommand};
use canvas_traits::webgl::{WebGLContextShareMode, WebGLError};
use canvas_traits::webgl::{WebGLFramebufferBindingRequest, WebGLMsg, WebGLMsgSender};
use canvas_traits::webgl::{WebGLResult, WebGLSLVersion, WebGLVersion};
use canvas_traits::webgl::{WebVRCommand, webgl_channel};
use canvas_traits::webgl::{WebGLProgramId, WebGLResult, WebGLSLVersion, WebGLSender};
use canvas_traits::webgl::{WebGLVersion, WebVRCommand, webgl_channel};
use canvas_traits::webgl::WebGLError::*;
use dom::bindings::cell::DomRefCell;
use dom::bindings::codegen::Bindings::ANGLEInstancedArraysBinding::ANGLEInstancedArraysConstants;
@ -56,12 +56,14 @@ use js::jsapi::{JSContext, JSObject, Type};
use js::jsval::{BooleanValue, DoubleValue, Int32Value, UInt32Value, JSVal};
use js::jsval::{ObjectValue, NullValue, UndefinedValue};
use js::rust::CustomAutoRooterGuard;
use js::typedarray::{ArrayBufferView, CreateWith, Float32Array, Int32Array, Uint32Array};
use js::typedarray::{ArrayBufferView, CreateWith, Float32, Float32Array, Int32, Int32Array, Uint32Array};
use js::typedarray::{TypedArray, TypedArrayElementCreator};
use net_traits::image::base::PixelFormat;
use net_traits::image_cache::ImageResponse;
use offscreen_gl_context::{GLContextAttributes, GLLimits};
use ref_filter_map::ref_filter_map;
use script_layout_interface::HTMLCanvasDataSource;
use serde::{Deserialize, Serialize};
use servo_config::prefs::PREFS;
use std::cell::{Cell, Ref};
use std::cmp;
@ -3600,6 +3602,80 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
});
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.10
#[allow(unsafe_code)]
unsafe fn GetUniform(
&self,
cx: *mut JSContext,
program: &WebGLProgram,
location: &WebGLUniformLocation,
) -> JSVal {
// FIXME(nox): https://github.com/servo/servo/issues/21133
if program.is_deleted() || !program.is_linked() || program.id() != location.program_id() {
self.webgl_error(InvalidOperation);
return NullValue();
}
fn get<T, F>(
triple: (&WebGLRenderingContext, WebGLProgramId, i32),
f: F,
) -> T
where
F: FnOnce(WebGLProgramId, i32, WebGLSender<T>) -> WebGLCommand,
T: for<'de> Deserialize<'de> + Serialize,
{
let (sender, receiver) = webgl_channel().unwrap();
triple.0.send_command(f(triple.1, triple.2, sender));
receiver.recv().unwrap()
}
let triple = (self, program.id(), location.id());
unsafe fn typed<T>(cx: *mut JSContext, value: &[T::Element]) -> JSVal
where
T: TypedArrayElementCreator,
{
rooted!(in(cx) let mut rval = ptr::null_mut::<JSObject>());
<TypedArray<T, *mut JSObject>>::create(cx, CreateWith::Slice(&value), rval.handle_mut()).unwrap();
ObjectValue(rval.get())
}
match location.type_() {
constants::BOOL => BooleanValue(get(triple, WebGLCommand::GetUniformBool)),
constants::BOOL_VEC2 => {
rooted!(in(cx) let mut rval = NullValue());
get(triple, WebGLCommand::GetUniformBool2).to_jsval(cx, rval.handle_mut());
rval.get()
}
constants::BOOL_VEC3 => {
rooted!(in(cx) let mut rval = NullValue());
get(triple, WebGLCommand::GetUniformBool3).to_jsval(cx, rval.handle_mut());
rval.get()
}
constants::BOOL_VEC4 => {
rooted!(in(cx) let mut rval = NullValue());
get(triple, WebGLCommand::GetUniformBool4).to_jsval(cx, rval.handle_mut());
rval.get()
}
constants::INT | constants::SAMPLER_2D | constants::SAMPLER_CUBE => {
Int32Value(get(triple, WebGLCommand::GetUniformInt))
}
constants::INT_VEC2 => typed::<Int32>(cx, &get(triple, WebGLCommand::GetUniformInt2)),
constants::INT_VEC3 => typed::<Int32>(cx, &get(triple, WebGLCommand::GetUniformInt3)),
constants::INT_VEC4 => typed::<Int32>(cx, &get(triple, WebGLCommand::GetUniformInt4)),
constants::FLOAT => DoubleValue(get(triple, WebGLCommand::GetUniformFloat) as f64),
constants::FLOAT_VEC2 => typed::<Float32>(cx, &get(triple, WebGLCommand::GetUniformFloat2)),
constants::FLOAT_VEC3 => typed::<Float32>(cx, &get(triple, WebGLCommand::GetUniformFloat3)),
constants::FLOAT_VEC4 | constants::FLOAT_MAT2 => {
typed::<Float32>(cx, &get(triple, WebGLCommand::GetUniformFloat4))
}
constants::FLOAT_MAT3 => typed::<Float32>(cx, &get(triple, WebGLCommand::GetUniformFloat9)),
constants::FLOAT_MAT4 => typed::<Float32>(cx, &get(triple, WebGLCommand::GetUniformFloat16)),
_ => panic!("wrong uniform type"),
}
}
// https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.14.9
fn UseProgram(&self, program: Option<&WebGLProgram>) {
if let Some(program) = program {

View file

@ -580,7 +580,7 @@ interface WebGLRenderingContextBase
any getTexParameter(GLenum target, GLenum pname);
// any getUniform(WebGLProgram program, WebGLUniformLocation location);
any getUniform(WebGLProgram program, WebGLUniformLocation location);
WebGLUniformLocation? getUniformLocation(WebGLProgram program, DOMString name);

View file

@ -43,9 +43,6 @@
[WebGL test #19: getError expected: INVALID_OPERATION. Was NO_ERROR : after evaluating: contextA.getShaderSource(shaderB)]
expected: FAIL
[WebGL test #20: contextA.getUniform(programB, locationA) threw exception TypeError: contextA.getUniform is not a function]
expected: FAIL
[WebGL test #21: getError expected: INVALID_OPERATION. Was NO_ERROR : after evaluating: contextA.getUniformLocation(programB, 'u_modelViewProjMatrix')]
expected: FAIL

View file

@ -1,7 +1,4 @@
[methods.html]
[WebGL test #0: Property either does not exist or is not a function: getUniform]
expected: FAIL
[WebGL test #1: Property either does not exist or is not a function: isContextLost]
[WebGL test #0: Property either does not exist or is not a function: isContextLost]
expected: FAIL

View file

@ -1,14 +0,0 @@
[bad-arguments-test.html]
type: testharness
[WebGL test #78: context.getUniform(argument, loc) should be null. Threw exception TypeError: context.getUniform is not a function]
expected: FAIL
[WebGL test #79: context.getUniform(program, argument) should be null. Threw exception TypeError: context.getUniform is not a function]
expected: FAIL
[WebGL test #104: context.getUniform(argument, loc) should be null. Threw exception TypeError: context.getUniform is not a function]
expected: FAIL
[WebGL test #105: context.getUniform(program, argument) should be null. Threw exception TypeError: context.getUniform is not a function]
expected: FAIL

View file

@ -1,5 +0,0 @@
[uniformMatrixBadArgs.html]
type: testharness
[WebGL test #0: testUniformf]
expected: FAIL

View file

@ -1,52 +0,0 @@
[gl-object-get-calls.html]
[WebGL test #57: gl.getUniform(boolProgram, bvalLoc) should be true. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL
[WebGL test #58: gl.getUniform(boolProgram, bval2Loc) should be true,false. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL
[WebGL test #59: gl.getUniform(boolProgram, bval3Loc) should be true,false,true. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL
[WebGL test #60: gl.getUniform(boolProgram, bval4Loc) should be true,false,true,false. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL
[WebGL test #63: gl.getUniform(intProgram, ivalLoc) should be 1. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL
[WebGL test #64: gl.getUniform(intProgram, ival2Loc) should be 2,3. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL
[WebGL test #65: gl.getUniform(intProgram, ival3Loc) should be 4,5,6. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL
[WebGL test #66: gl.getUniform(intProgram, ival4Loc) should be 7,8,9,10. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL
[WebGL test #69: gl.getUniform(floatProgram, fvalLoc) should be 11. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL
[WebGL test #70: gl.getUniform(floatProgram, fval2Loc) should be 12,13. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL
[WebGL test #71: gl.getUniform(floatProgram, fval3Loc) should be 14,15,16. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL
[WebGL test #72: gl.getUniform(floatProgram, fval4Loc) should be 17,18,19,20. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL
[WebGL test #75: gl.getUniform(samplerProgram, s2DValLoc) should be 0. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL
[WebGL test #76: gl.getUniform(samplerProgram, sCubeValLoc) should be 1. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL
[WebGL test #79: gl.getUniform(matProgram, mval2Loc) should be 1,2,3,4. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL
[WebGL test #80: gl.getUniform(matProgram, mval3Loc) should be 5,6,7,8,9,10,11,12,13. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL
[WebGL test #81: gl.getUniform(matProgram, mval4Loc) should be 14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29. Threw exception TypeError: gl.getUniform is not a function]
expected: FAIL

View file

@ -1,5 +0,0 @@
[gl-uniform-arrays.html]
expected: ERROR
[Overall test]
expected: NOTRUN

View file

@ -1,5 +0,0 @@
[uniform-default-values.html]
expected: ERROR
[Overall test]
expected: NOTRUN

View file

@ -1,25 +1,7 @@
[uniform-location.html]
[WebGL test #9: contextA.getUniform(programS, locationSx) should be 333. Threw exception TypeError: contextA.getUniform is not a function]
expected: FAIL
[WebGL test #10: contextA.getUniform(programS, locationArray0) should be 4. Threw exception TypeError: contextA.getUniform is not a function]
expected: FAIL
[WebGL test #11: contextA.getUniform(programS, locationArray1) should be 5. Threw exception TypeError: contextA.getUniform is not a function]
expected: FAIL
[WebGL test #14: contextA.getUniform(programV, locationVec4) should be 1,2,3,4. Threw exception TypeError: contextA.getUniform is not a function]
expected: FAIL
[WebGL test #20: getError expected: INVALID_OPERATION. Was NO_ERROR : after evaluating: contextA.uniform1i(locationSx, 3)]
expected: FAIL
[WebGL test #21: contextA.getUniform(programS, locationSx) threw exception TypeError: contextA.getUniform is not a function]
expected: FAIL
[WebGL test #24: contextA.getUniform(programS, locationSx) should be 3. Threw exception TypeError: contextA.getUniform is not a function]
expected: FAIL
[WebGL test #25: contextA.getUniform(programS, locationArray0) should be 123. Threw exception TypeError: contextA.getUniform is not a function]
[WebGL test #21: getError expected: INVALID_OPERATION. Was NO_ERROR : after evaluating: contextA.getUniform(programS, locationSx)]
expected: FAIL

View file

@ -1,262 +1,259 @@
[methods-2.html]
[WebGL test #0: Property either does not exist or is not a function: getUniform]
[WebGL test #0: Property either does not exist or is not a function: isContextLost]
expected: FAIL
[WebGL test #1: Property either does not exist or is not a function: isContextLost]
[WebGL test #1: Property either does not exist or is not a function: getBufferSubData]
expected: FAIL
[WebGL test #2: Property either does not exist or is not a function: getBufferSubData]
[WebGL test #2: Property either does not exist or is not a function: copyBufferSubData]
expected: FAIL
[WebGL test #3: Property either does not exist or is not a function: copyBufferSubData]
[WebGL test #3: Property either does not exist or is not a function: blitFramebuffer]
expected: FAIL
[WebGL test #4: Property either does not exist or is not a function: blitFramebuffer]
[WebGL test #4: Property either does not exist or is not a function: framebufferTextureLayer]
expected: FAIL
[WebGL test #5: Property either does not exist or is not a function: framebufferTextureLayer]
[WebGL test #5: Property either does not exist or is not a function: getInternalformatParameter]
expected: FAIL
[WebGL test #6: Property either does not exist or is not a function: getInternalformatParameter]
[WebGL test #6: Property either does not exist or is not a function: invalidateFramebuffer]
expected: FAIL
[WebGL test #7: Property either does not exist or is not a function: invalidateFramebuffer]
[WebGL test #7: Property either does not exist or is not a function: invalidateSubFramebuffer]
expected: FAIL
[WebGL test #8: Property either does not exist or is not a function: invalidateSubFramebuffer]
[WebGL test #8: Property either does not exist or is not a function: readBuffer]
expected: FAIL
[WebGL test #9: Property either does not exist or is not a function: readBuffer]
[WebGL test #9: Property either does not exist or is not a function: renderbufferStorageMultisample]
expected: FAIL
[WebGL test #10: Property either does not exist or is not a function: renderbufferStorageMultisample]
[WebGL test #10: Property either does not exist or is not a function: texImage3D]
expected: FAIL
[WebGL test #11: Property either does not exist or is not a function: texImage3D]
[WebGL test #11: Property either does not exist or is not a function: texStorage2D]
expected: FAIL
[WebGL test #12: Property either does not exist or is not a function: texStorage2D]
[WebGL test #12: Property either does not exist or is not a function: texStorage3D]
expected: FAIL
[WebGL test #13: Property either does not exist or is not a function: texStorage3D]
[WebGL test #13: Property either does not exist or is not a function: texSubImage3D]
expected: FAIL
[WebGL test #14: Property either does not exist or is not a function: texSubImage3D]
[WebGL test #14: Property either does not exist or is not a function: copyTexSubImage3D]
expected: FAIL
[WebGL test #15: Property either does not exist or is not a function: copyTexSubImage3D]
[WebGL test #15: Property either does not exist or is not a function: compressedTexImage3D]
expected: FAIL
[WebGL test #16: Property either does not exist or is not a function: compressedTexImage3D]
[WebGL test #16: Property either does not exist or is not a function: compressedTexSubImage3D]
expected: FAIL
[WebGL test #17: Property either does not exist or is not a function: compressedTexSubImage3D]
[WebGL test #17: Property either does not exist or is not a function: getFragDataLocation]
expected: FAIL
[WebGL test #18: Property either does not exist or is not a function: getFragDataLocation]
[WebGL test #18: Property either does not exist or is not a function: uniform1ui]
expected: FAIL
[WebGL test #19: Property either does not exist or is not a function: uniform1ui]
[WebGL test #19: Property either does not exist or is not a function: uniform2ui]
expected: FAIL
[WebGL test #20: Property either does not exist or is not a function: uniform2ui]
[WebGL test #20: Property either does not exist or is not a function: uniform3ui]
expected: FAIL
[WebGL test #21: Property either does not exist or is not a function: uniform3ui]
[WebGL test #21: Property either does not exist or is not a function: uniform4ui]
expected: FAIL
[WebGL test #22: Property either does not exist or is not a function: uniform4ui]
[WebGL test #22: Property either does not exist or is not a function: uniform1uiv]
expected: FAIL
[WebGL test #23: Property either does not exist or is not a function: uniform1uiv]
[WebGL test #23: Property either does not exist or is not a function: uniform2uiv]
expected: FAIL
[WebGL test #24: Property either does not exist or is not a function: uniform2uiv]
[WebGL test #24: Property either does not exist or is not a function: uniform3uiv]
expected: FAIL
[WebGL test #25: Property either does not exist or is not a function: uniform3uiv]
[WebGL test #25: Property either does not exist or is not a function: uniform4uiv]
expected: FAIL
[WebGL test #26: Property either does not exist or is not a function: uniform4uiv]
[WebGL test #26: Property either does not exist or is not a function: uniformMatrix2x3fv]
expected: FAIL
[WebGL test #27: Property either does not exist or is not a function: uniformMatrix2x3fv]
[WebGL test #27: Property either does not exist or is not a function: uniformMatrix3x2fv]
expected: FAIL
[WebGL test #28: Property either does not exist or is not a function: uniformMatrix3x2fv]
[WebGL test #28: Property either does not exist or is not a function: uniformMatrix2x4fv]
expected: FAIL
[WebGL test #29: Property either does not exist or is not a function: uniformMatrix2x4fv]
[WebGL test #29: Property either does not exist or is not a function: uniformMatrix4x2fv]
expected: FAIL
[WebGL test #30: Property either does not exist or is not a function: uniformMatrix4x2fv]
[WebGL test #30: Property either does not exist or is not a function: uniformMatrix3x4fv]
expected: FAIL
[WebGL test #31: Property either does not exist or is not a function: uniformMatrix3x4fv]
[WebGL test #31: Property either does not exist or is not a function: uniformMatrix4x3fv]
expected: FAIL
[WebGL test #32: Property either does not exist or is not a function: uniformMatrix4x3fv]
[WebGL test #32: Property either does not exist or is not a function: vertexAttribI4i]
expected: FAIL
[WebGL test #33: Property either does not exist or is not a function: vertexAttribI4i]
[WebGL test #33: Property either does not exist or is not a function: vertexAttribI4iv]
expected: FAIL
[WebGL test #34: Property either does not exist or is not a function: vertexAttribI4iv]
[WebGL test #34: Property either does not exist or is not a function: vertexAttribI4ui]
expected: FAIL
[WebGL test #35: Property either does not exist or is not a function: vertexAttribI4ui]
[WebGL test #35: Property either does not exist or is not a function: vertexAttribI4uiv]
expected: FAIL
[WebGL test #36: Property either does not exist or is not a function: vertexAttribI4uiv]
[WebGL test #36: Property either does not exist or is not a function: vertexAttribIPointer]
expected: FAIL
[WebGL test #37: Property either does not exist or is not a function: vertexAttribIPointer]
[WebGL test #37: Property either does not exist or is not a function: drawRangeElements]
expected: FAIL
[WebGL test #38: Property either does not exist or is not a function: drawRangeElements]
[WebGL test #38: Property either does not exist or is not a function: drawBuffers]
expected: FAIL
[WebGL test #39: Property either does not exist or is not a function: drawBuffers]
[WebGL test #39: Property either does not exist or is not a function: clearBufferiv]
expected: FAIL
[WebGL test #40: Property either does not exist or is not a function: clearBufferiv]
[WebGL test #40: Property either does not exist or is not a function: clearBufferuiv]
expected: FAIL
[WebGL test #41: Property either does not exist or is not a function: clearBufferuiv]
[WebGL test #41: Property either does not exist or is not a function: clearBufferfv]
expected: FAIL
[WebGL test #42: Property either does not exist or is not a function: clearBufferfv]
[WebGL test #42: Property either does not exist or is not a function: clearBufferfi]
expected: FAIL
[WebGL test #43: Property either does not exist or is not a function: clearBufferfi]
[WebGL test #43: Property either does not exist or is not a function: createQuery]
expected: FAIL
[WebGL test #44: Property either does not exist or is not a function: createQuery]
[WebGL test #44: Property either does not exist or is not a function: deleteQuery]
expected: FAIL
[WebGL test #45: Property either does not exist or is not a function: deleteQuery]
[WebGL test #45: Property either does not exist or is not a function: isQuery]
expected: FAIL
[WebGL test #46: Property either does not exist or is not a function: isQuery]
[WebGL test #46: Property either does not exist or is not a function: beginQuery]
expected: FAIL
[WebGL test #47: Property either does not exist or is not a function: beginQuery]
[WebGL test #47: Property either does not exist or is not a function: endQuery]
expected: FAIL
[WebGL test #48: Property either does not exist or is not a function: endQuery]
[WebGL test #48: Property either does not exist or is not a function: getQuery]
expected: FAIL
[WebGL test #49: Property either does not exist or is not a function: getQuery]
[WebGL test #49: Property either does not exist or is not a function: getQueryParameter]
expected: FAIL
[WebGL test #50: Property either does not exist or is not a function: getQueryParameter]
[WebGL test #50: Property either does not exist or is not a function: createSampler]
expected: FAIL
[WebGL test #51: Property either does not exist or is not a function: createSampler]
[WebGL test #51: Property either does not exist or is not a function: deleteSampler]
expected: FAIL
[WebGL test #52: Property either does not exist or is not a function: deleteSampler]
[WebGL test #52: Property either does not exist or is not a function: isSampler]
expected: FAIL
[WebGL test #53: Property either does not exist or is not a function: isSampler]
[WebGL test #53: Property either does not exist or is not a function: bindSampler]
expected: FAIL
[WebGL test #54: Property either does not exist or is not a function: bindSampler]
[WebGL test #54: Property either does not exist or is not a function: samplerParameteri]
expected: FAIL
[WebGL test #55: Property either does not exist or is not a function: samplerParameteri]
[WebGL test #55: Property either does not exist or is not a function: samplerParameterf]
expected: FAIL
[WebGL test #56: Property either does not exist or is not a function: samplerParameterf]
[WebGL test #56: Property either does not exist or is not a function: getSamplerParameter]
expected: FAIL
[WebGL test #57: Property either does not exist or is not a function: getSamplerParameter]
[WebGL test #57: Property either does not exist or is not a function: fenceSync]
expected: FAIL
[WebGL test #58: Property either does not exist or is not a function: fenceSync]
[WebGL test #58: Property either does not exist or is not a function: isSync]
expected: FAIL
[WebGL test #59: Property either does not exist or is not a function: isSync]
[WebGL test #59: Property either does not exist or is not a function: deleteSync]
expected: FAIL
[WebGL test #60: Property either does not exist or is not a function: deleteSync]
[WebGL test #60: Property either does not exist or is not a function: clientWaitSync]
expected: FAIL
[WebGL test #61: Property either does not exist or is not a function: clientWaitSync]
[WebGL test #61: Property either does not exist or is not a function: waitSync]
expected: FAIL
[WebGL test #62: Property either does not exist or is not a function: waitSync]
[WebGL test #62: Property either does not exist or is not a function: getSyncParameter]
expected: FAIL
[WebGL test #63: Property either does not exist or is not a function: getSyncParameter]
[WebGL test #63: Property either does not exist or is not a function: createTransformFeedback]
expected: FAIL
[WebGL test #64: Property either does not exist or is not a function: createTransformFeedback]
[WebGL test #64: Property either does not exist or is not a function: deleteTransformFeedback]
expected: FAIL
[WebGL test #65: Property either does not exist or is not a function: deleteTransformFeedback]
[WebGL test #65: Property either does not exist or is not a function: isTransformFeedback]
expected: FAIL
[WebGL test #66: Property either does not exist or is not a function: isTransformFeedback]
[WebGL test #66: Property either does not exist or is not a function: bindTransformFeedback]
expected: FAIL
[WebGL test #67: Property either does not exist or is not a function: bindTransformFeedback]
[WebGL test #67: Property either does not exist or is not a function: beginTransformFeedback]
expected: FAIL
[WebGL test #68: Property either does not exist or is not a function: beginTransformFeedback]
[WebGL test #68: Property either does not exist or is not a function: endTransformFeedback]
expected: FAIL
[WebGL test #69: Property either does not exist or is not a function: endTransformFeedback]
[WebGL test #69: Property either does not exist or is not a function: transformFeedbackVaryings]
expected: FAIL
[WebGL test #70: Property either does not exist or is not a function: transformFeedbackVaryings]
[WebGL test #70: Property either does not exist or is not a function: getTransformFeedbackVarying]
expected: FAIL
[WebGL test #71: Property either does not exist or is not a function: getTransformFeedbackVarying]
[WebGL test #71: Property either does not exist or is not a function: pauseTransformFeedback]
expected: FAIL
[WebGL test #72: Property either does not exist or is not a function: pauseTransformFeedback]
[WebGL test #72: Property either does not exist or is not a function: resumeTransformFeedback]
expected: FAIL
[WebGL test #73: Property either does not exist or is not a function: resumeTransformFeedback]
[WebGL test #73: Property either does not exist or is not a function: bindBufferBase]
expected: FAIL
[WebGL test #74: Property either does not exist or is not a function: bindBufferBase]
[WebGL test #74: Property either does not exist or is not a function: bindBufferRange]
expected: FAIL
[WebGL test #75: Property either does not exist or is not a function: bindBufferRange]
[WebGL test #75: Property either does not exist or is not a function: getIndexedParameter]
expected: FAIL
[WebGL test #76: Property either does not exist or is not a function: getIndexedParameter]
[WebGL test #76: Property either does not exist or is not a function: getUniformIndices]
expected: FAIL
[WebGL test #77: Property either does not exist or is not a function: getUniformIndices]
[WebGL test #77: Property either does not exist or is not a function: getActiveUniforms]
expected: FAIL
[WebGL test #78: Property either does not exist or is not a function: getActiveUniforms]
[WebGL test #78: Property either does not exist or is not a function: getUniformBlockIndex]
expected: FAIL
[WebGL test #79: Property either does not exist or is not a function: getUniformBlockIndex]
[WebGL test #79: Property either does not exist or is not a function: getActiveUniformBlockParameter]
expected: FAIL
[WebGL test #80: Property either does not exist or is not a function: getActiveUniformBlockParameter]
[WebGL test #80: Property either does not exist or is not a function: getActiveUniformBlockName]
expected: FAIL
[WebGL test #81: Property either does not exist or is not a function: getActiveUniformBlockName]
[WebGL test #81: Property either does not exist or is not a function: uniformBlockBinding]
expected: FAIL
[WebGL test #82: Property either does not exist or is not a function: uniformBlockBinding]
[WebGL test #82: Property either does not exist or is not a function: createVertexArray]
expected: FAIL
[WebGL test #83: Property either does not exist or is not a function: createVertexArray]
[WebGL test #83: Property either does not exist or is not a function: deleteVertexArray]
expected: FAIL
[WebGL test #84: Property either does not exist or is not a function: deleteVertexArray]
[WebGL test #84: Property either does not exist or is not a function: isVertexArray]
expected: FAIL
[WebGL test #85: Property either does not exist or is not a function: isVertexArray]
expected: FAIL
[WebGL test #86: Property either does not exist or is not a function: bindVertexArray]
[WebGL test #85: Property either does not exist or is not a function: bindVertexArray]
expected: FAIL