[Qt] Canvas arcTo() should draw straight line to p1 if p0, p1 and p2 are collinear
[WebKit.git] / LayoutTests / fast / canvas / webgl / gl-uniform-arrays.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2   "http://www.w3.org/TR/html4/loose.dtd">
3 <html>
4 <head>
5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
6 <title>WebGL uniform array Conformance Tests</title>
7 <link rel="stylesheet" href="../../js/resources/js-test-style.css"/>
8 <script src="../../js/resources/js-test-pre.js"></script>
9 <script src="resources/webgl-test.js"></script>
10 </head>
11 <body>
12 <div id="description"></div>
13 <div id="console"></div>
14 <canvas id="example" width="2" height="2"> </canvas>
15 <script id="vshader" type="x-shader/x-vertex">
16     attribute vec4 vPosition;
17     void main()
18     {
19         gl_Position = vPosition;
20     }
21 </script>
22
23 <script id="fshader" type="x-shader/x-fragment">
24     uniform $type color[3];
25     void main()
26     {
27         gl_FragColor = vec4(color[0]$elem, color[1]$elem, color[2]$elem, 1);
28     }
29 </script>
30 <script>
31 function loadShader(ctx, shaderType, shaderSource) {
32   // Create the shader object
33   var shader = ctx.createShader(shaderType);
34   if (shader == null) {
35     debug("*** Error: unable to create shader '"+shader+"'");
36     return null;
37   }
38
39   // Load the shader source
40   ctx.shaderSource(shader, shaderSource);
41
42   // Compile the shader
43   ctx.compileShader(shader);
44
45   // Check the compile status
46   var compiled = ctx.getShaderParameter(shader, ctx.COMPILE_STATUS);
47   if (!compiled) {
48     // Something went wrong during compilation; get the error
49     var error = ctx.getShaderInfoLog(shader);
50     debug("*** Error compiling shader '"+shader+"':"+error);
51     ctx.deleteShader(shader);
52     return null;
53   }
54
55   return shader;
56 }
57
58 function loadProgram(ctx, vertexShaderSrc, fragmentShaderSrc) {
59   var program = ctx.createProgram();
60   var vShader = loadShader(ctx, ctx.VERTEX_SHADER, vertexShaderSrc)
61   var fShader = loadShader(ctx, ctx.FRAGMENT_SHADER, fragmentShaderSrc);
62   ctx.attachShader(program, vShader);
63   ctx.attachShader(program, fShader);
64   ctx.linkProgram(program);
65   var linked = ctx.getProgramParameter(program, ctx.LINK_STATUS);
66   if (!linked) {
67     // something went wrong with the link
68     var error = ctx.getProgramInfoLog (ctx.program);
69     debug("Error in program linking:" + error);
70     ctx.deleteProgram(ctx.program);
71     program = null;
72   }
73 //  ctx.deleteShader(fShader);
74 //  ctx.deleteShader(vShader);
75   return program;
76 }
77
78 description("This test ensures WebGL implementations handle uniform arrays correctly.");
79
80 debug("");
81
82 var gl = create3DContext(document.getElementById("example"));
83
84 var vSrc = document.getElementById("vshader").text;
85 var fTemplate = document.getElementById("fshader").text;
86
87 var typeInfos = [
88   { type: 'float',
89     jsTypeOf: 'number',
90     setter: 'uniform1fv',
91     elem: '',
92     numSrcValues: 3,
93     badSet: function(loc) {
94       gl.uniform2fv(loc, [1, 2]);
95     },
96     srcValueAsString: function(index, srcValues) {
97       return srcValues[index].toString();
98     },
99     returnValueAsString: function(value) {
100       return value === null ? 'null' : value.toString();
101     },
102     checkType: function(value) {
103       return typeof values === 'number';
104     },
105     checkValue: function(typeInfo, index, value) {
106       return typeInfo.srcValues[index] == value;
107     },
108     srcValues: [16, 15, 14]
109   },
110   { type: 'vec2',
111     jsTypeOf: 'Float32Array',
112     setter: 'uniform2fv',
113     elem: '[1]',
114     numSrcValues: 3,
115     badSet: function(loc) {
116       gl.uniform1fv(loc, [2]);
117     },
118     srcValueAsString: function(index, srcValues) {
119       return "[" + srcValues[index * 2 + 0].toString() + ", " +
120                    srcValues[index * 2 + 1].toString() + "]";
121     },
122     returnValueAsString: function(value) {
123       return value === null ? 'null' : ("[" + value[0] + ", " + value[1] + "]");
124     },
125     checkType: function(value) {
126       return typeof values.length === 'number' &&
127              values.length == 2;
128     },
129     checkValue: function(typeInfo, index, value) {
130       return value !== null &&
131              typeInfo.srcValues[index * 2 + 0] == value[0] &&
132              typeInfo.srcValues[index * 2 + 1] == value[1];
133     },
134     srcValues: [16, 15, 14, 13, 12, 11],
135   },
136   { type: 'vec3',
137     jsTypeOf: 'Float32Array',
138     setter: 'uniform3fv',
139     elem: '[2]',
140     numSrcValues: 3,
141     badSet: function(loc) {
142       gl.uniform1fv(loc, [2]);
143     },
144     srcValueAsString: function(index, srcValues) {
145       return "[" + srcValues[index * 3 + 0].toString() + ", " +
146                    srcValues[index * 3 + 1].toString() + ", " +
147                    srcValues[index * 3 + 2].toString() + "]";
148     },
149     returnValueAsString: function(value) {
150       return value === null ? 'null' :
151           ("[" + value[0] + ", " + value[1] + ", " + value[2] + "]");
152     },
153     checkType: function(value) {
154       return typeof values.length === 'number' &&
155              values.length == 3;
156     },
157     checkValue: function(typeInfo, index, value) {
158       return value !== null &&
159              typeInfo.srcValues[index * 3 + 0] == value[0] &&
160              typeInfo.srcValues[index * 3 + 1] == value[1] &&
161              typeInfo.srcValues[index * 3 + 2] == value[2];
162     },
163     srcValues: [16, 15, 14, 13, 12, 11, 10, 11, 9],
164   },
165   { type: 'vec4',
166     jsTypeOf: 'Float32Array',
167     setter: 'uniform4fv',
168     elem: '[3]',
169     numSrcValues: 3,
170     badSet: function(loc) {
171       gl.uniform1fv(loc, [2]);
172     },
173     srcValueAsString: function(index, srcValues) {
174       return "[" + srcValues[index * 4 + 0].toString() + ", " +
175                    srcValues[index * 4 + 1].toString() + ", " +
176                    srcValues[index * 4 + 2].toString() + ", " +
177                    srcValues[index * 4 + 3].toString() + "]";
178     },
179     returnValueAsString: function(value) {
180       return value === null ? 'null' :
181           ("[" + value[0] + ", " + value[1] +
182            ", " + value[2] + ", " + value[3] + "]");
183     },
184     checkType: function(value) {
185       return typeof values.length === 'number' &&
186              values.length == 4;
187     },
188     checkValue: function(typeInfo, index, value) {
189       return value !== null &&
190              typeInfo.srcValues[index * 4 + 0] == value[0] &&
191              typeInfo.srcValues[index * 4 + 1] == value[1] &&
192              typeInfo.srcValues[index * 4 + 2] == value[2] &&
193              typeInfo.srcValues[index * 4 + 3] == value[3];
194     },
195     srcValues: [16, 15, 14, 13, 12, 11, 10, 11, 9, 8, 7, 6, 5],
196   }
197 ];
198
199 for (var tt = 0; tt < typeInfos.length; ++tt) {
200   var typeInfo = typeInfos[tt];
201   debug("");
202   debug("check " + typeInfo.type);
203   var fSrc = fTemplate.replace(/\$type/g, typeInfo.type).
204                        replace(/\$elem/g, typeInfo.elem);
205   //debug("fSrc: " + fSrc);
206   var program = loadProgram(gl, vSrc, fSrc);
207
208   var numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
209   assertMsg(numUniforms == 1, "1 uniform found");
210   var info = gl.getActiveUniform(program, 0);
211   assertMsg(info.name == "color[0]",
212             "uniform name is 'color[0]' not 'color' as per OpenGL ES 2.0.24 section 2.10");
213   var loc = gl.getUniformLocation(program, "color");
214   var srcValues = typeInfo.srcValues;
215
216   // Try setting the value before using the program
217   gl[typeInfo.setter](loc, srcValues);
218   assertMsg(gl.getError() == gl.INVALID_OPERATION,
219             "should fail if there is no current program");
220
221   gl.useProgram(program);
222   gl[typeInfo.setter](loc, srcValues);
223   assertMsg(gl.getError() == gl.NO_ERROR,
224             "can set an array of uniforms with gl." + typeInfo.setter);
225   var values = gl.getUniform(program, loc);
226   assertMsg(gl.getError() == gl.NO_ERROR,
227             "can call gl.getUniform");
228   assertMsg(typeInfo.checkType(values),
229             "gl.getUniform returns the correct type.");
230   for (var ii = 0; ii < typeInfo.numSrcValues; ++ii) {
231     var elemLoc = gl.getUniformLocation(program, "color[" + ii + "]");
232     assertMsg(gl.getError() == gl.NO_ERROR,
233               "can get location of element " + ii +
234               " of array from gl.getUniformLocation");
235     var value = gl.getUniform(program, elemLoc);
236     assertMsg(gl.getError() == gl.NO_ERROR,
237               "can get value of element " + ii + " of array from gl.getUniform");
238     assertMsg(typeInfo.checkValue(typeInfo, ii, value),
239               "value put in (" + typeInfo.srcValueAsString(ii, srcValues) +
240               ") matches value pulled out (" +
241               typeInfo.returnValueAsString(value) + ")");
242   }
243   typeInfo.badSet(loc);
244   assertMsg(gl.getError() == gl.INVALID_OPERATION,
245             "using the wrong size of gl.Uniform fails");
246
247   gl.useProgram(null);
248   assertMsg(gl.getError() == gl.NO_ERROR,
249             "can call gl.useProgram(null)");
250 }
251 debug("");
252 successfullyParsed = true;
253
254 </script>
255 <script src="../../js/resources/js-test-post.js"></script>
256
257 <script>
258 </script>
259
260 </body>
261 </html>