OLD | NEW |
| (Empty) |
1 GLSLConformanceTester = (function(){ | |
2 | |
3 var wtu = WebGLTestUtils; | |
4 var defaultVertexShader = [ | |
5 "attribute vec4 vPosition;", | |
6 "void main()", | |
7 "{", | |
8 " gl_Position = vPosition;", | |
9 "}" | |
10 ].join('\n'); | |
11 | |
12 var defaultFragmentShader = [ | |
13 "precision mediump float;", | |
14 "void main()", | |
15 "{", | |
16 " gl_FragColor = vec4(1.0,0.0,0.0,1.0);", | |
17 "}" | |
18 ].join('\n'); | |
19 | |
20 function log(msg) { | |
21 if (window.console && window.console.log) { | |
22 window.console.log(msg); | |
23 } | |
24 } | |
25 | |
26 var vShaderDB = {}; | |
27 var fShaderDB = {}; | |
28 | |
29 /** | |
30 * vShaderSource: the source code for vertex shader | |
31 * vShaderSuccess: true if vertex shader compiliation should | |
32 * succeed. | |
33 * fShaderSource: the source code for fragment shader | |
34 * fShaderSuccess: true if fragment shader compiliation should | |
35 * succeed. | |
36 * linkSuccess: true of link should succeed | |
37 * passMsg: msg to describe success condition. | |
38 * | |
39 */ | |
40 function runOneTest(gl, info) { | |
41 var passMsg = info.passMsg | |
42 log(passMsg); | |
43 | |
44 if (info.vShaderSource === undefined) { | |
45 if (info.vShaderId) { | |
46 info.vShaderSource = document.getElementById(info.vShaderId).text; | |
47 } else { | |
48 info.vShader = 'defaultVertexShader'; | |
49 info.vShaderSource = defaultVertexShader; | |
50 } | |
51 } | |
52 if (info.fShaderSource === undefined) { | |
53 if (info.fShaderId) { | |
54 info.fShaderSource = document.getElementById(info.fShaderId).text; | |
55 } else { | |
56 info.fShader = 'defaultFragmentShader'; | |
57 info.fShaderSource = defaultFragmentShader; | |
58 } | |
59 } | |
60 | |
61 var vSource = info.vShaderPrep ? info.vShaderPrep(info.vShaderSource) : | |
62 info.vShaderSource; | |
63 | |
64 // Reuse identical shaders so we test shared shader. | |
65 var vShader = vShaderDB[vSource]; | |
66 if (!vShader) { | |
67 vShader = wtu.loadShader(gl, vSource, gl.VERTEX_SHADER); | |
68 if (info.vShaderTest) { | |
69 if (!info.vShaderTest(vShader)) { | |
70 testFailed("[vertex shader test] " + passMsg); | |
71 return; | |
72 } | |
73 } | |
74 if ((vShader != null) != info.vShaderSuccess) { | |
75 testFailed("[unexpected vertex shader compile status] (expected: " + | |
76 info.vShaderSuccess + ") " + passMsg); | |
77 return; | |
78 } | |
79 // Save the shaders so we test shared shader. | |
80 if (vShader) { | |
81 vShaderDB[vSource] = vShader; | |
82 } | |
83 } | |
84 | |
85 var fSource = info.fShaderPrep ? info.fShaderPrep(info.fShaderSource) : | |
86 info.fShaderSource; | |
87 | |
88 // Reuse identical shaders so we test shared shader. | |
89 var fShader = fShaderDB[fSource]; | |
90 if (!fShader) { | |
91 fShader = wtu.loadShader(gl, fSource, gl.FRAGMENT_SHADER); | |
92 if (info.fShaderTest) { | |
93 if (!info.fShaderTest(fShader)) { | |
94 testFailed("[fragment shdaer test] " + passMsg); | |
95 return; | |
96 } | |
97 } | |
98 //debug(fShader == null ? "fail" : "succeed"); | |
99 if ((fShader != null) != info.fShaderSuccess) { | |
100 testFailed("[unexpected fragment shader compile status] (expected: " + | |
101 info.fShaderSuccess + ") " + passMsg); | |
102 return; | |
103 } | |
104 // Safe the shaders so we test shared shader. | |
105 if (fShader) { | |
106 fShaderDB[fSource] = fShader; | |
107 } | |
108 } | |
109 | |
110 if (vShader && fShader) { | |
111 var program = gl.createProgram(); | |
112 gl.attachShader(program, vShader); | |
113 gl.attachShader(program, fShader); | |
114 gl.linkProgram(program); | |
115 var linked = (gl.getProgramParameter(program, gl.LINK_STATUS) != 0); | |
116 if (!linked) { | |
117 var error = gl.getProgramInfoLog(program); | |
118 log("*** Error linking program '"+program+"':"+error); | |
119 } | |
120 if (linked != info.linkSuccess) { | |
121 testFailed("[unexpected link status] " + passMsg); | |
122 return; | |
123 } | |
124 } else { | |
125 if (info.linkSuccess) { | |
126 testFailed("[link failed] " + passMsg); | |
127 return; | |
128 } | |
129 } | |
130 testPassed(passMsg); | |
131 } | |
132 | |
133 function runTests(shaderInfos) { | |
134 var wtu = WebGLTestUtils; | |
135 var canvas = document.createElement('canvas'); | |
136 var gl = wtu.create3DContext(); | |
137 if (!gl) { | |
138 testFailed("context does not exist"); | |
139 finishTest(); | |
140 return; | |
141 } | |
142 | |
143 for (var ii = 0; ii < shaderInfos.length; ++ii) { | |
144 runOneTest(gl, shaderInfos[ii]); | |
145 } | |
146 | |
147 finishTest(); | |
148 }; | |
149 | |
150 function loadExternalShaders(filename, passMsg) { | |
151 var shaderInfos = []; | |
152 var lines = wtu.readFileList(filename); | |
153 for (var ii = 0; ii < lines.length; ++ii) { | |
154 var info = { | |
155 vShaderSource: defaultVertexShader, | |
156 vShaderSuccess: true, | |
157 fShaderSource: defaultFragmentShader, | |
158 fShaderSuccess: true, | |
159 linkSuccess: true, | |
160 }; | |
161 | |
162 var line = lines[ii]; | |
163 var files = line.split(/ +/); | |
164 var passMsg = ""; | |
165 for (var jj = 0; jj < files.length; ++jj) { | |
166 var file = files[jj]; | |
167 var shaderSource = wtu.readFile(file); | |
168 var firstLine = shaderSource.split("\n")[0]; | |
169 var success = undefined; | |
170 if (firstLine.indexOf("fail") >= 0) { | |
171 success = false; | |
172 } else if (firstLine.indexOf("succeed") >= 0) { | |
173 success = true; | |
174 } | |
175 if (success === undefined) { | |
176 testFailed("bad first line in " + file + ":" + firstLine); | |
177 continue; | |
178 } | |
179 if (!wtu.startsWith(firstLine, "// ")) { | |
180 testFailed("bad first line in " + file + ":" + firstLine); | |
181 continue; | |
182 } | |
183 passMsg = passMsg + (passMsg.length ? ", " : "") + firstLine.substr(3); | |
184 if (wtu.endsWith(file, ".vert")) { | |
185 info.vShaderSource = shaderSource; | |
186 info.vShaderSuccess = success; | |
187 } else if (wtu.endsWith(file, ".frag")) { | |
188 info.fShaderSource = shaderSource; | |
189 info.fShaderSuccess = success; | |
190 } | |
191 } | |
192 info.linkSuccess = info.vShaderSuccess && info.fShaderSuccess; | |
193 info.passMsg = passMsg; | |
194 shaderInfos.push(info); | |
195 } | |
196 return shaderInfos; | |
197 } | |
198 | |
199 function getSource(elem) { | |
200 var str = elem.text; | |
201 return str.replace(/^\s*/, '').replace(/\s*$/, ''); | |
202 } | |
203 | |
204 function getPassMessage(source) { | |
205 var lines = source.split('\n'); | |
206 return lines[0].substring(3); | |
207 } | |
208 | |
209 function getSuccess(msg) { | |
210 if (msg.indexOf("fail") >= 0) { | |
211 return false; | |
212 } | |
213 if (msg.indexOf("succeed") >= 0) { | |
214 return true; | |
215 } | |
216 testFailed("bad test description. Must have 'fail' or 'success'"); | |
217 } | |
218 | |
219 function runTest() { | |
220 var vShaderElem = document.getElementById('vertexShader'); | |
221 var vShaderSource = defaultVertexShader; | |
222 var vShaderSuccess = true; | |
223 | |
224 var fShaderElem = document.getElementById('fragmentShader'); | |
225 var fShaderSource = defaultFragmentShader; | |
226 var fShaderSuccess = true; | |
227 | |
228 var passMsg = undefined; | |
229 | |
230 if (vShaderElem) { | |
231 vShaderSource = getSource(vShaderElem); | |
232 passMsg = getPassMessage(vShaderSource); | |
233 vShaderSuccess = getSuccess(passMsg); | |
234 } | |
235 | |
236 if (fShaderElem) { | |
237 fShaderSource = getSource(fShaderElem); | |
238 passMsg = getPassMessage(fShaderSource); | |
239 fShaderSuccess = getSuccess(passMsg); | |
240 } | |
241 | |
242 var linkSuccess = vShaderSuccess && fShaderSuccess; | |
243 | |
244 if (passMsg === undefined) { | |
245 testFailed("no test shader found."); | |
246 finishTest(); | |
247 return; | |
248 } | |
249 | |
250 var info = { | |
251 vShaderSource: vShaderSource, | |
252 vShaderSuccess: vShaderSuccess, | |
253 fShaderSource: fShaderSource, | |
254 fShaderSuccess: fShaderSuccess, | |
255 linkSuccess: linkSuccess, | |
256 passMsg: passMsg | |
257 }; | |
258 description(passMsg); | |
259 runTests([info]); | |
260 } | |
261 | |
262 return { | |
263 runTest: runTest, | |
264 runTests: runTests, | |
265 loadExternalShaders: loadExternalShaders, | |
266 | |
267 none: false, | |
268 }; | |
269 }()); | |
OLD | NEW |