OLD | NEW |
| (Empty) |
1 <!DOCTYPE html> | |
2 <html><head> | |
3 <meta charset="utf-8"> | |
4 <!-- | |
5 Tests for the OpenGL ES 2.0 HTML Canvas context | |
6 | |
7 Copyright (C) 2011 Ilmari Heikkinen <ilmari.heikkinen@gmail.com> | |
8 | |
9 Permission is hereby granted, free of charge, to any person | |
10 obtaining a copy of this software and associated documentation | |
11 files (the "Software"), to deal in the Software without | |
12 restriction, including without limitation the rights to use, | |
13 copy, modify, merge, publish, distribute, sublicense, and/or sell | |
14 copies of the Software, and to permit persons to whom the | |
15 Software is furnished to do so, subject to the following | |
16 conditions: | |
17 | |
18 The above copyright notice and this permission notice shall be | |
19 included in all copies or substantial portions of the Software. | |
20 | |
21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
22 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | |
23 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
24 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | |
25 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
26 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
27 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | |
28 OTHER DEALINGS IN THE SOFTWARE. | |
29 | |
30 --> | |
31 <link rel="stylesheet" type="text/css" href="../unit.css" /> | |
32 <script type="application/x-javascript" src="../unit.js"></script> | |
33 <script type="application/x-javascript" src="../util.js"></script> | |
34 <script type="application/x-javascript"> | |
35 | |
36 var verts = [0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0]; | |
37 var normals = [0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0]; | |
38 var texcoords = [0.0,0.0, 1.0,0.0, 0.0,1.0]; | |
39 | |
40 var vertsA = new Float32Array(verts); | |
41 var normalsA = new Float32Array(normals); | |
42 var texcoordsA = new Float32Array(texcoords); | |
43 | |
44 Tests.startUnit = function () { | |
45 var canvas = document.getElementById('gl'); | |
46 var gl = wrapGLContext(canvas.getContext(GL_CONTEXT_ID)); | |
47 var prog = new Shader(gl, 'vert', 'frag'); | |
48 prog.use(); | |
49 var v = prog.attrib('Vertex'); | |
50 var n = prog.attrib('Normal'); | |
51 var t = prog.attrib('Tex'); | |
52 return [gl,prog,v,n,t]; | |
53 } | |
54 | |
55 Tests.setup = function(gl, prog, v,n,t) { | |
56 return [gl, prog, v,n,t]; | |
57 } | |
58 Tests.teardown = function(gl, prog, v,n,t) { | |
59 gl.disableVertexAttribArray(v); | |
60 gl.disableVertexAttribArray(n); | |
61 gl.disableVertexAttribArray(t); | |
62 } | |
63 | |
64 Tests.endUnit = function(gl, prog, v,n,t) { | |
65 prog.destroy(); | |
66 } | |
67 | |
68 Tests.testDrawArraysEmpty = function(gl, prog, v,n,t) { | |
69 var b = gl.createBuffer(); | |
70 gl.bindBuffer(gl.ARRAY_BUFFER, b); | |
71 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([]), gl.STATIC_DRAW); | |
72 assertOk(function(){gl.vertexAttribPointer(v, 3, gl.FLOAT, false, 0, 0);}) | |
73 gl.enableVertexAttribArray(v); | |
74 assertGLError(gl, gl.INVALID_OPERATION, "zero size array", | |
75 function(){gl.drawArrays(gl.TRIANGLES, 0, 1);}); | |
76 gl.deleteBuffer(b); | |
77 } | |
78 | |
79 Tests.testDrawArraysOutOfBounds = function(gl, prog, v,n,t) { | |
80 var b = gl.createBuffer(); | |
81 gl.bindBuffer(gl.ARRAY_BUFFER, b); | |
82 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([]), gl.STATIC_DRAW); | |
83 assertOk(function(){gl.vertexAttribPointer(v, 3, gl.FLOAT, false, 0, 0);}); | |
84 gl.enableVertexAttribArray(v); | |
85 assertGLError(gl, gl.INVALID_OPERATION, "zero size array", | |
86 function(){gl.drawArrays(gl.TRIANGLES, 0, 1);}); | |
87 assertGLError(gl, gl.INVALID_OPERATION, "zero size array 10000", | |
88 function(){gl.drawArrays(gl.TRIANGLES, 0, 10000);}); | |
89 assertGLError(gl, gl.INVALID_OPERATION, "zero size array 10000000000000", | |
90 function(){gl.drawArrays(gl.TRIANGLES, 0, 10000000000000);}); | |
91 assertGLError(gl, gl.INVALID_OPERATION, "zero size array fraction", | |
92 function(){gl.drawArrays(gl.TRIANGLES, 0, 1.6);}); | |
93 assertGLError(gl, gl.INVALID_VALUE, "negative offset", | |
94 function(){gl.drawArrays(gl.TRIANGLES, 0, -1);}); | |
95 assertGLError(gl, gl.INVALID_OPERATION, "count out of range", | |
96 function(){gl.drawArrays(gl.TRIANGLES, 0, 1);}); | |
97 assertGLError(gl, gl.INVALID_VALUE, "negative count", | |
98 function(){gl.drawArrays(gl.TRIANGLES, 0, -1);}); | |
99 assertGLError(gl, gl.INVALID_VALUE, "positive count, negative offset", | |
100 function(){gl.drawArrays(gl.TRIANGLES, -1, 1);}); | |
101 assertGLError(gl, gl.INVALID_VALUE, "negative count, positive offset", | |
102 function(){gl.drawArrays(gl.TRIANGLES, 1, -1);}); | |
103 gl.deleteBuffer(b); | |
104 } | |
105 | |
106 | |
107 Tests.testDrawArraysWithDataOutOfBounds = function(gl, prog, v,n,t) { | |
108 var b = gl.createBuffer(); | |
109 gl.bindBuffer(gl.ARRAY_BUFFER, b); | |
110 gl.bufferData(gl.ARRAY_BUFFER, vertsA, gl.STATIC_DRAW); | |
111 gl.vertexAttribPointer(v, 3, gl.FLOAT, false, 0, 0); | |
112 gl.enableVertexAttribArray(v); | |
113 assertGLError(gl, gl.INVALID_OPERATION, "3 element array", | |
114 function(){gl.drawArrays(gl.TRIANGLES, 3, 2);}); | |
115 assertGLError(gl, gl.INVALID_OPERATION, "3 element array 10000", | |
116 function(){gl.drawArrays(gl.TRIANGLES, 0, 10000);}); | |
117 assertGLError(gl, gl.INVALID_OPERATION, "3 element array 10000000000000", | |
118 function(){gl.drawArrays(gl.TRIANGLES, 0, 10000000000000);}); | |
119 assertGLError(gl, gl.INVALID_OPERATION, "fractional count", | |
120 function(){gl.drawArrays(gl.TRIANGLES, 3, 1.6);}); | |
121 assertGLError(gl, gl.INVALID_VALUE, "negative offset", | |
122 function(){gl.drawArrays(gl.TRIANGLES, 0, -1);}); | |
123 assertGLError(gl, gl.INVALID_OPERATION, "count out of range", | |
124 function(){gl.drawArrays(gl.TRIANGLES, 0, 4);}); | |
125 assertGLError(gl, gl.INVALID_VALUE, "negative count", | |
126 function(){gl.drawArrays(gl.TRIANGLES, 0, -1);}); | |
127 assertGLError(gl, gl.INVALID_VALUE, "positive count, negative offset", | |
128 function(){gl.drawArrays(gl.TRIANGLES, -1, 2);}); | |
129 assertGLError(gl, gl.INVALID_VALUE, "negative count, positive offset", | |
130 function(){gl.drawArrays(gl.TRIANGLES, 1, -1);}); | |
131 gl.deleteBuffer(b); | |
132 } | |
133 | |
134 Tests.testDrawArraysMultiOutOfBounds = function(gl, prog, v,n,t) { | |
135 var bs = []; | |
136 bs.push(gl.createBuffer()); | |
137 gl.bindBuffer(gl.ARRAY_BUFFER, bs[bs.length-1]); | |
138 gl.bufferData(gl.ARRAY_BUFFER, vertsA, gl.STATIC_DRAW); | |
139 gl.vertexAttribPointer(v, 3, gl.FLOAT, false, 0, 0); | |
140 bs.push(gl.createBuffer()); | |
141 gl.bindBuffer(gl.ARRAY_BUFFER, bs[bs.length-1]); | |
142 gl.bufferData(gl.ARRAY_BUFFER, normalsA, gl.STATIC_DRAW); | |
143 gl.vertexAttribPointer(n, 3, gl.FLOAT, false, 0, 0); | |
144 bs.push(gl.createBuffer()); | |
145 gl.bindBuffer(gl.ARRAY_BUFFER, bs[bs.length-1]); | |
146 gl.bufferData(gl.ARRAY_BUFFER, texcoordsA, gl.STATIC_DRAW); | |
147 gl.vertexAttribPointer(t, 2, gl.FLOAT, false, 0, 0); | |
148 gl.enableVertexAttribArray(v); | |
149 gl.enableVertexAttribArray(n); | |
150 gl.enableVertexAttribArray(t); | |
151 assertGLError(gl, gl.INVALID_OPERATION, "multi array 1", | |
152 function(){gl.drawArrays(gl.TRIANGLES, 3, 2);}); | |
153 bs.push(gl.createBuffer()); | |
154 gl.bindBuffer(gl.ARRAY_BUFFER, bs[bs.length-1]); | |
155 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(verts.concat(verts)), gl.STATI
C_DRAW); | |
156 bs.push(gl.createBuffer()); | |
157 gl.bindBuffer(gl.ARRAY_BUFFER, bs[bs.length-1]); | |
158 gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(texcoords.concat(texcoords)),
gl.STATIC_DRAW); | |
159 gl.vertexAttribPointer(v, 3, gl.FLOAT, false, 0, 0); | |
160 gl.bindBuffer(gl.ARRAY_BUFFER, bs[1]); | |
161 gl.vertexAttribPointer(n, 3, gl.FLOAT, false, 0, 0); | |
162 gl.bindBuffer(gl.ARRAY_BUFFER, bs[2]); | |
163 gl.vertexAttribPointer(t, 2, gl.FLOAT, false, 0, 0); | |
164 gl.enableVertexAttribArray(v); | |
165 gl.enableVertexAttribArray(n); | |
166 gl.enableVertexAttribArray(t); | |
167 assertGLError(gl, gl.INVALID_OPERATION, "multi array 2", | |
168 function(){gl.drawArrays(gl.TRIANGLES, 3, 2);}); | |
169 assertGLError(gl, gl.INVALID_OPERATION, "multi array 3", | |
170 function(){gl.drawArrays(gl.TRIANGLES, 4, 2);}); | |
171 gl.bindBuffer(gl.ARRAY_BUFFER, bs[0]); | |
172 gl.vertexAttribPointer(v, 3, gl.FLOAT, false, 0, 0); | |
173 gl.bindBuffer(gl.ARRAY_BUFFER, bs[3]); | |
174 gl.vertexAttribPointer(n, 3, gl.FLOAT, false, 0, 0); | |
175 gl.bindBuffer(gl.ARRAY_BUFFER, bs[2]); | |
176 gl.vertexAttribPointer(t, 2, gl.FLOAT, false, 0, 0); | |
177 gl.enableVertexAttribArray(v); | |
178 gl.enableVertexAttribArray(n); | |
179 gl.enableVertexAttribArray(t); | |
180 assertGLError(gl, gl.INVALID_OPERATION, "multi array 4", | |
181 function(){gl.drawArrays(gl.TRIANGLES, 3, 2);}); | |
182 assertGLError(gl, gl.INVALID_OPERATION, "multi array 5", | |
183 function(){gl.drawArrays(gl.TRIANGLES, 4, 2);}); | |
184 gl.bindBuffer(gl.ARRAY_BUFFER, bs[0]); | |
185 gl.vertexAttribPointer(v, 3, gl.FLOAT, false, 0, 0); | |
186 gl.bindBuffer(gl.ARRAY_BUFFER, bs[1]); | |
187 gl.vertexAttribPointer(n, 3, gl.FLOAT, false, 0, 0); | |
188 gl.bindBuffer(gl.ARRAY_BUFFER, bs[4]); | |
189 gl.vertexAttribPointer(t, 2, gl.FLOAT, false, 0, 0); | |
190 gl.enableVertexAttribArray(v); | |
191 gl.enableVertexAttribArray(n); | |
192 gl.enableVertexAttribArray(t); | |
193 assertGLError(gl, gl.INVALID_OPERATION, "multi array 6", | |
194 function(){gl.drawArrays(gl.TRIANGLES, 3, 2);}); | |
195 assertGLError(gl, gl.INVALID_OPERATION, "multi array 7", | |
196 function(){gl.drawArrays(gl.TRIANGLES, 3, 2);}); | |
197 gl.bindBuffer(gl.ARRAY_BUFFER, bs[3]); | |
198 gl.vertexAttribPointer(v, 3, gl.FLOAT, false, 0, 0); | |
199 gl.bindBuffer(gl.ARRAY_BUFFER, bs[3]); | |
200 gl.vertexAttribPointer(n, 3, gl.FLOAT, false, 0, 0); | |
201 gl.bindBuffer(gl.ARRAY_BUFFER, bs[2]); | |
202 gl.vertexAttribPointer(t, 2, gl.FLOAT, false, 0, 0); | |
203 gl.enableVertexAttribArray(v); | |
204 gl.enableVertexAttribArray(n); | |
205 gl.enableVertexAttribArray(t); | |
206 assertGLError(gl, gl.INVALID_OPERATION, "multi array 8", | |
207 function(){gl.drawArrays(gl.TRIANGLES, 4, 1);}); | |
208 assertGLError(gl, gl.INVALID_VALUE, "negative count", | |
209 function(){gl.drawArrays(gl.TRIANGLES, -1, 2);}); | |
210 assertGLError(gl, gl.INVALID_OPERATION, "zero count???", | |
211 function(){gl.drawArrays(gl.TRIANGLES, 0, 4);}); | |
212 assertGLError(gl, gl.INVALID_OPERATION, "multi array 9", | |
213 function(){gl.drawArrays(gl.TRIANGLES, 1, 4);}); | |
214 bs.forEach(function(b){ gl.deleteBuffer(b) }); | |
215 } | |
216 | |
217 | |
218 Tests.testDrawArraysVBOOutOfBounds = function(gl, prog, v,n,t) { | |
219 var vbo = new VBO(gl, {size:3, data:Quad.vertices}); | |
220 vbo.use(v); | |
221 assertGLError(gl, gl.INVALID_OPERATION, "1", | |
222 function(){gl.drawArrays(gl.TRIANGLES, 6, 1);}); | |
223 assertGLError(gl, gl.INVALID_VALUE, "negative count", | |
224 function(){gl.drawArrays(gl.TRIANGLES, 2, -1);}); | |
225 assertGLError(gl, gl.INVALID_OPERATION, "3", | |
226 function(){gl.drawArrays(gl.TRIANGLES, 0, 7);}); | |
227 assertGLError(gl, gl.INVALID_OPERATION, "4", | |
228 function(){gl.drawArrays(gl.TRIANGLES, 1, 6);}); | |
229 vbo.destroy(); | |
230 } | |
231 | |
232 Tests.testDrawArraysVBOMultiOutOfBounds = function(gl, prog, v,n,t) { | |
233 // creates VBOs for the quad arrays, binds them with | |
234 // vertexAttribPointer and calls drawArrays | |
235 var vbo = new VBO(gl, | |
236 {size:3, data:Quad.vertices}, | |
237 {size:3, data:Quad.normals}, | |
238 {size:2, data:Quad.texcoords}); | |
239 vbo.use(v, n, t); | |
240 assertGLError(gl, gl.INVALID_OPERATION, "1", | |
241 function(){gl.drawArrays(gl.TRIANGLES, 6, 1);}); | |
242 assertGLError(gl, gl.INVALID_VALUE, "negative count", | |
243 function(){gl.drawArrays(gl.TRIANGLES, 2, -1);}); | |
244 assertGLError(gl, gl.INVALID_OPERATION, "2", | |
245 function(){gl.drawArrays(gl.TRIANGLES, 0, 7);}); | |
246 assertGLError(gl, gl.INVALID_OPERATION, "3", | |
247 function(){gl.drawArrays(gl.TRIANGLES, 1, 6);}); | |
248 vbo.destroy(); | |
249 } | |
250 | |
251 Tests.testDrawArraysOOBShaderJuggle = function(gl, prog, v,n,t) { | |
252 var vbo = new VBO(gl, | |
253 {size:3, data:[0,0,0]}, | |
254 {size:3, data:[0,0,0,0,0,0]}); | |
255 vbo.init(); | |
256 gl.bindBuffer(gl.ARRAY_BUFFER, vbo.vbos[0]); | |
257 gl.vertexAttribPointer(v, 3, gl.FLOAT, false, 0, 0); | |
258 gl.enableVertexAttribArray(v); | |
259 assertGLError(gl, gl.INVALID_OPERATION, "offset too big", | |
260 function(){gl.drawArrays(gl.TRIANGLES, 0, 2);}); | |
261 var sh2 = new Shader(gl, 'vert', 'frag'); | |
262 sh2.use(); | |
263 gl.bindBuffer(gl.ARRAY_BUFFER, vbo.vbos[1]); | |
264 gl.vertexAttribPointer(sh2.attrib('Vertex'), 3, gl.FLOAT, false, 0, 0); | |
265 gl.enableVertexAttribArray(sh2.attrib('Vertex')); | |
266 assertOk(function(){gl.drawArrays(gl.TRIANGLES, 0, 2);}); | |
267 assertGLError(gl, gl.INVALID_OPERATION, "offset too big 2", | |
268 function(){gl.drawArrays(gl.TRIANGLES, 0, 3);}); | |
269 prog.use(); | |
270 gl.vertexAttribPointer(prog.attrib('Vertex'), 3, gl.FLOAT, false, 0, 0); | |
271 gl.enableVertexAttribArray(prog.attrib('Vertex')); | |
272 assertOk(function(){gl.drawArrays(gl.TRIANGLES, 0, 2);}); | |
273 assertGLError(gl, gl.INVALID_OPERATION, "offset too big 3", | |
274 function(){gl.drawArrays(gl.TRIANGLES, 0, 3);}); | |
275 sh2.destroy(); | |
276 } | |
277 | |
278 </script> | |
279 <script id="vert" type="x-shader/x-vertex"> | |
280 attribute vec3 Vertex; | |
281 attribute vec3 Normal; | |
282 attribute vec2 Tex; | |
283 | |
284 varying vec4 texCoord0; | |
285 void main() | |
286 { | |
287 gl_Position = vec4(Vertex * Normal, 1.0); | |
288 texCoord0 = vec4(Tex,0.0,0.0) + gl_Position; | |
289 } | |
290 </script> | |
291 <script id="frag" type="x-shader/x-fragment"> | |
292 precision mediump float; | |
293 | |
294 varying vec4 texCoord0; | |
295 void main() | |
296 { | |
297 gl_FragColor = texCoord0; | |
298 } | |
299 </script> | |
300 | |
301 | |
302 <style>canvas{ position:absolute; }</style> | |
303 </head><body> | |
304 <canvas id="gl" width="1" height="1"></canvas> | |
305 </body></html> | |
OLD | NEW |