OLD | NEW |
| (Empty) |
1 <!DOCTYPE html> | |
2 <html> | |
3 <head> | |
4 <meta charset="utf-8"> | |
5 <script src="../../../resources/js-test.js"></script> | |
6 <script src="resources/webgl-test.js"></script> | |
7 </head> | |
8 <body> | |
9 <div id="description"></div> | |
10 <div id="console"></div> | |
11 | |
12 <script> | |
13 description("Tests that index validation verifies the correct number of indices"
); | |
14 | |
15 if (window.internals) | |
16 window.internals.settings.setWebGLErrorsToConsoleEnabled(false); | |
17 | |
18 function sizeInBytes(type) { | |
19 switch (type) { | |
20 case gl.BYTE: | |
21 case gl.UNSIGNED_BYTE: | |
22 return 1; | |
23 case gl.SHORT: | |
24 case gl.UNSIGNED_SHORT: | |
25 return 2; | |
26 case gl.INT: | |
27 case gl.UNSIGNED_INT: | |
28 case gl.FLOAT: | |
29 return 4; | |
30 default: | |
31 throw "unknown type"; | |
32 } | |
33 } | |
34 | |
35 var gl = create3DContext(); | |
36 var program = loadStandardProgram(gl); | |
37 | |
38 // 3 vertices => 1 triangle, interleaved data | |
39 var dataComplete = new Float32Array([0, 0, 0, 1, | |
40 0, 0, 1, | |
41 1, 0, 0, 1, | |
42 0, 0, 1, | |
43 1, 1, 1, 1, | |
44 0, 0, 1]); | |
45 var dataIncomplete = new Float32Array([0, 0, 0, 1, | |
46 0, 0, 1, | |
47 1, 0, 0, 1, | |
48 0, 0, 1, | |
49 1, 1, 1, 1]); | |
50 var indices = new Uint16Array([0, 1, 2]); | |
51 | |
52 debug("Testing with valid indices"); | |
53 | |
54 var bufferComplete = gl.createBuffer(); | |
55 gl.bindBuffer(gl.ARRAY_BUFFER, bufferComplete); | |
56 gl.bufferData(gl.ARRAY_BUFFER, dataComplete, gl.STATIC_DRAW); | |
57 var elements = gl.createBuffer(); | |
58 gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elements); | |
59 gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW); | |
60 gl.useProgram(program); | |
61 var vertexLoc = gl.getAttribLocation(program, "a_vertex"); | |
62 var normalLoc = gl.getAttribLocation(program, "a_normal"); | |
63 gl.vertexAttribPointer(vertexLoc, 4, gl.FLOAT, false, 7 * sizeInBytes(gl.FLOAT),
0); | |
64 gl.enableVertexAttribArray(vertexLoc); | |
65 gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 7 * sizeInBytes(gl.FLOAT),
4 * sizeInBytes(gl.FLOAT)); | |
66 gl.enableVertexAttribArray(normalLoc); | |
67 shouldBe('gl.checkFramebufferStatus(gl.FRAMEBUFFER)', 'gl.FRAMEBUFFER_COMPLETE')
; | |
68 glErrorShouldBe(gl, gl.NO_ERROR); | |
69 shouldBeUndefined('gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0)'); | |
70 glErrorShouldBe(gl, gl.NO_ERROR); | |
71 | |
72 debug("Testing with out-of-range indices"); | |
73 | |
74 var bufferIncomplete = gl.createBuffer(); | |
75 gl.bindBuffer(gl.ARRAY_BUFFER, bufferIncomplete); | |
76 gl.bufferData(gl.ARRAY_BUFFER, dataIncomplete, gl.STATIC_DRAW); | |
77 gl.vertexAttribPointer(vertexLoc, 4, gl.FLOAT, false, 7 * sizeInBytes(gl.FLOAT),
0); | |
78 gl.enableVertexAttribArray(vertexLoc); | |
79 gl.disableVertexAttribArray(normalLoc); | |
80 debug("Enable vertices, valid"); | |
81 glErrorShouldBe(gl, gl.NO_ERROR); | |
82 shouldBeUndefined('gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0)'); | |
83 glErrorShouldBe(gl, gl.NO_ERROR); | |
84 debug("Enable normals, out-of-range"); | |
85 gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 7 * sizeInBytes(gl.FLOAT),
4 * sizeInBytes(gl.FLOAT)); | |
86 gl.enableVertexAttribArray(normalLoc); | |
87 glErrorShouldBe(gl, gl.NO_ERROR); | |
88 shouldBeUndefined('gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0)'); | |
89 glErrorShouldBe(gl, gl.INVALID_OPERATION); | |
90 | |
91 debug("Test with enabled attribute that does not belong to current program"); | |
92 | |
93 gl.disableVertexAttribArray(normalLoc); | |
94 var extraLoc = Math.max(vertexLoc, normalLoc) + 1; | |
95 gl.enableVertexAttribArray(extraLoc); | |
96 debug("Enable an extra attribute with null"); | |
97 glErrorShouldBe(gl, gl.NO_ERROR); | |
98 shouldBeUndefined('gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0)'); | |
99 glErrorShouldBe(gl, gl.INVALID_OPERATION); | |
100 debug("Enable an extra attribute with insufficient data buffer"); | |
101 gl.vertexAttribPointer(extraLoc, 3, gl.FLOAT, false, 7 * sizeInBytes(gl.FLOAT),
4 * sizeInBytes(gl.FLOAT)); | |
102 glErrorShouldBe(gl, gl.NO_ERROR); | |
103 shouldBeUndefined('gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0)'); | |
104 debug("Pass large negative index to vertexAttribPointer"); | |
105 gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 7 * sizeInBytes(gl.FLOAT),
-2000000000 * sizeInBytes(gl.FLOAT)); | |
106 glErrorShouldBe(gl, gl.INVALID_VALUE); | |
107 shouldBeUndefined('gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0)'); | |
108 | |
109 successfullyParsed = true; | |
110 </script> | |
111 | |
112 </body> | |
113 </html> | |
OLD | NEW |