| /* |
| Copyright (c) 2019 The Khronos Group Inc. |
| Use of this source code is governed by an MIT-style license that can be |
| found in the LICENSE.txt file. |
| */ |
| |
| // This test relies on the surrounding web page defining a variable |
| // "contextVersion" which indicates what version of WebGL it's running |
| // on -- 1 for WebGL 1.0, 2 for WebGL 2.0, etc. |
| |
| "use strict"; |
| description("This test ensures WebGL implementations vertexAttrib can be set and read."); |
| |
| debug(""); |
| debug("Canvas.getContext"); |
| |
| var wtu = WebGLTestUtils; |
| var gl = wtu.create3DContext("canvas", undefined, contextVersion); |
| if (!gl) { |
| testFailed("context does not exist"); |
| } else { |
| testPassed("context exists"); |
| |
| debug(""); |
| debug("Checking gl.vertexAttrib."); |
| |
| var numVertexAttribs = gl.getParameter(gl.MAX_VERTEX_ATTRIBS); |
| for (var ii = 0; ii < numVertexAttribs; ++ii) { |
| gl.vertexAttrib1fv(ii, [1]); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Float32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '0'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '0'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '1'); |
| |
| gl.vertexAttrib1fv(ii, new Float32Array([-1])); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Float32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '-1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '0'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '0'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '1'); |
| |
| gl.vertexAttrib2fv(ii, [1, 2]); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Float32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '2'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '0'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '1'); |
| |
| gl.vertexAttrib2fv(ii, new Float32Array([1, -2])); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Float32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '-2'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '0'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '1'); |
| |
| gl.vertexAttrib3fv(ii, [1, 2, 3]); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Float32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '2'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '3'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '1'); |
| |
| gl.vertexAttrib3fv(ii, new Float32Array([1, -2, 3])); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Float32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '-2'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '3'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '1'); |
| |
| gl.vertexAttrib4fv(ii, [1, 2, 3, 4]); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Float32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '2'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '3'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '4'); |
| |
| gl.vertexAttrib4fv(ii, new Float32Array([1, 2, -3, 4])); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Float32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '2'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '-3'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '4'); |
| |
| gl.vertexAttrib1f(ii, 5); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Float32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '5'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '0'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '0'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '1'); |
| |
| gl.vertexAttrib2f(ii, 6, 7); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Float32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '6'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '7'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '0'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '1'); |
| |
| gl.vertexAttrib3f(ii, 7, 8, 9); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Float32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '7'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '8'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '9'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '1'); |
| |
| gl.vertexAttrib4f(ii, 6, 7, 8, 9); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Float32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '6'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '7'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '8'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '9'); |
| |
| if (contextVersion > 1) { |
| gl.vertexAttribI4i(ii, -1, 0, 1, 2); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Int32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '-1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '0'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '2'); |
| |
| gl.vertexAttribI4ui(ii, 0, 1, 2, 3); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Uint32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '0'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '2'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '3'); |
| |
| gl.vertexAttribI4iv(ii, [-1, 0, 1, 2]); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Int32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '-1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '0'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '2'); |
| |
| gl.vertexAttribI4iv(ii, new Int32Array([1, 0, -1, 2])); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Int32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '0'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '-1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '2'); |
| |
| gl.vertexAttribI4uiv(ii, [0, 1, 2, 3]); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Uint32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '0'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '2'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '3'); |
| |
| gl.vertexAttribI4uiv(ii, new Uint32Array([0, 2, 1, 3])); |
| shouldBeType('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)', 'Uint32Array'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[0]', '0'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[1]', '2'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[2]', '1'); |
| shouldBe('gl.getVertexAttrib(' + ii + ', gl.CURRENT_VERTEX_ATTRIB)[3]', '3'); |
| } |
| } |
| wtu.glErrorShouldBe(gl, gl.NO_ERROR); |
| |
| debug(""); |
| debug("Checking out-of-range vertexAttrib index"); |
| gl.getVertexAttrib(numVertexAttribs, gl.CURRENT_VERTEX_ATTRIB); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib1fv(numVertexAttribs, [1]); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib1fv(numVertexAttribs, new Float32Array([-1])); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib2fv(numVertexAttribs, [1, 2]); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib2fv(numVertexAttribs, new Float32Array([1, -2])); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib3fv(numVertexAttribs, [1, 2, 3]); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib3fv(numVertexAttribs, new Float32Array([1, -2, 3])); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib4fv(numVertexAttribs, [1, 2, 3, 4]); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib4fv(numVertexAttribs, new Float32Array([1, 2, -3, 4])); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib1f(numVertexAttribs, 5); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib2f(numVertexAttribs, 6, 7); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib3f(numVertexAttribs, 7, 8, 9); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib4f(numVertexAttribs, 6, 7, 8, 9); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| if (contextVersion > 1) { |
| gl.vertexAttribI4i(numVertexAttribs, -1, 0, 1, 2); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttribI4ui(numVertexAttribs, 0, 1, 2, 3); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttribI4iv(numVertexAttribs, [-1, 0, 1, 2]); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttribI4iv(numVertexAttribs, new Int32Array([1, 0, -1, 2])); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttribI4uiv(numVertexAttribs, [0, 1, 2, 3]); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttribI4uiv(numVertexAttribs, new Uint32Array([0, 2, 1, 3])); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| } |
| |
| debug(""); |
| debug("Checking invalid array lengths"); |
| numVertexAttribs = numVertexAttribs - 1; |
| gl.vertexAttrib1fv(numVertexAttribs, []); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib1fv(numVertexAttribs, new Float32Array([])); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib2fv(numVertexAttribs, [1]); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib2fv(numVertexAttribs, new Float32Array([1])); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib3fv(numVertexAttribs, [1, 2]); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib3fv(numVertexAttribs, new Float32Array([1, -2])); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib4fv(numVertexAttribs, [1, 2, 3]); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttrib4fv(numVertexAttribs, new Float32Array([1, 2, -3])); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| if (contextVersion > 1) { |
| gl.vertexAttribI4iv(numVertexAttribs, [-1, 0, 1]); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttribI4iv(numVertexAttribs, new Int32Array([1, 0, -1])); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttribI4uiv(numVertexAttribs, [0, 1, 2]); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| |
| gl.vertexAttribI4uiv(numVertexAttribs, new Uint32Array([0, 2, 1])); |
| wtu.glErrorShouldBe(gl, gl.INVALID_VALUE); |
| } |
| } |
| |
| debug(""); |
| var successfullyParsed = true; |