Index: conformance/resources/glsl-conformance-test.js |
=================================================================== |
--- conformance/resources/glsl-conformance-test.js (revision 0) |
+++ conformance/resources/glsl-conformance-test.js (revision 0) |
@@ -0,0 +1,269 @@ |
+GLSLConformanceTester = (function(){ |
+ |
+var wtu = WebGLTestUtils; |
+var defaultVertexShader = [ |
+ "attribute vec4 vPosition;", |
+ "void main()", |
+ "{", |
+ " gl_Position = vPosition;", |
+ "}" |
+].join('\n'); |
+ |
+var defaultFragmentShader = [ |
+ "precision mediump float;", |
+ "void main()", |
+ "{", |
+ " gl_FragColor = vec4(1.0,0.0,0.0,1.0);", |
+ "}" |
+].join('\n'); |
+ |
+function log(msg) { |
+ if (window.console && window.console.log) { |
+ window.console.log(msg); |
+ } |
+} |
+ |
+var vShaderDB = {}; |
+var fShaderDB = {}; |
+ |
+/** |
+ * vShaderSource: the source code for vertex shader |
+ * vShaderSuccess: true if vertex shader compiliation should |
+ * succeed. |
+ * fShaderSource: the source code for fragment shader |
+ * fShaderSuccess: true if fragment shader compiliation should |
+ * succeed. |
+ * linkSuccess: true of link should succeed |
+ * passMsg: msg to describe success condition. |
+ * |
+ */ |
+function runOneTest(gl, info) { |
+ var passMsg = info.passMsg |
+ log(passMsg); |
+ |
+ if (info.vShaderSource === undefined) { |
+ if (info.vShaderId) { |
+ info.vShaderSource = document.getElementById(info.vShaderId).text; |
+ } else { |
+ info.vShader = 'defaultVertexShader'; |
+ info.vShaderSource = defaultVertexShader; |
+ } |
+ } |
+ if (info.fShaderSource === undefined) { |
+ if (info.fShaderId) { |
+ info.fShaderSource = document.getElementById(info.fShaderId).text; |
+ } else { |
+ info.fShader = 'defaultFragmentShader'; |
+ info.fShaderSource = defaultFragmentShader; |
+ } |
+ } |
+ |
+ var vSource = info.vShaderPrep ? info.vShaderPrep(info.vShaderSource) : |
+ info.vShaderSource; |
+ |
+ // Reuse identical shaders so we test shared shader. |
+ var vShader = vShaderDB[vSource]; |
+ if (!vShader) { |
+ vShader = wtu.loadShader(gl, vSource, gl.VERTEX_SHADER); |
+ if (info.vShaderTest) { |
+ if (!info.vShaderTest(vShader)) { |
+ testFailed("[vertex shader test] " + passMsg); |
+ return; |
+ } |
+ } |
+ if ((vShader != null) != info.vShaderSuccess) { |
+ testFailed("[unexpected vertex shader compile status] (expected: " + |
+ info.vShaderSuccess + ") " + passMsg); |
+ return; |
+ } |
+ // Save the shaders so we test shared shader. |
+ if (vShader) { |
+ vShaderDB[vSource] = vShader; |
+ } |
+ } |
+ |
+ var fSource = info.fShaderPrep ? info.fShaderPrep(info.fShaderSource) : |
+ info.fShaderSource; |
+ |
+ // Reuse identical shaders so we test shared shader. |
+ var fShader = fShaderDB[fSource]; |
+ if (!fShader) { |
+ fShader = wtu.loadShader(gl, fSource, gl.FRAGMENT_SHADER); |
+ if (info.fShaderTest) { |
+ if (!info.fShaderTest(fShader)) { |
+ testFailed("[fragment shdaer test] " + passMsg); |
+ return; |
+ } |
+ } |
+ //debug(fShader == null ? "fail" : "succeed"); |
+ if ((fShader != null) != info.fShaderSuccess) { |
+ testFailed("[unexpected fragment shader compile status] (expected: " + |
+ info.fShaderSuccess + ") " + passMsg); |
+ return; |
+ } |
+ // Safe the shaders so we test shared shader. |
+ if (fShader) { |
+ fShaderDB[fSource] = fShader; |
+ } |
+ } |
+ |
+ if (vShader && fShader) { |
+ var program = gl.createProgram(); |
+ gl.attachShader(program, vShader); |
+ gl.attachShader(program, fShader); |
+ gl.linkProgram(program); |
+ var linked = (gl.getProgramParameter(program, gl.LINK_STATUS) != 0); |
+ if (!linked) { |
+ var error = gl.getProgramInfoLog(program); |
+ log("*** Error linking program '"+program+"':"+error); |
+ } |
+ if (linked != info.linkSuccess) { |
+ testFailed("[unexpected link status] " + passMsg); |
+ return; |
+ } |
+ } else { |
+ if (info.linkSuccess) { |
+ testFailed("[link failed] " + passMsg); |
+ return; |
+ } |
+ } |
+ testPassed(passMsg); |
+} |
+ |
+function runTests(shaderInfos) { |
+ var wtu = WebGLTestUtils; |
+ var canvas = document.createElement('canvas'); |
+ var gl = wtu.create3DContext(); |
+ if (!gl) { |
+ testFailed("context does not exist"); |
+ finishTest(); |
+ return; |
+ } |
+ |
+ for (var ii = 0; ii < shaderInfos.length; ++ii) { |
+ runOneTest(gl, shaderInfos[ii]); |
+ } |
+ |
+ finishTest(); |
+}; |
+ |
+function loadExternalShaders(filename, passMsg) { |
+ var shaderInfos = []; |
+ var lines = wtu.readFileList(filename); |
+ for (var ii = 0; ii < lines.length; ++ii) { |
+ var info = { |
+ vShaderSource: defaultVertexShader, |
+ vShaderSuccess: true, |
+ fShaderSource: defaultFragmentShader, |
+ fShaderSuccess: true, |
+ linkSuccess: true, |
+ }; |
+ |
+ var line = lines[ii]; |
+ var files = line.split(/ +/); |
+ var passMsg = ""; |
+ for (var jj = 0; jj < files.length; ++jj) { |
+ var file = files[jj]; |
+ var shaderSource = wtu.readFile(file); |
+ var firstLine = shaderSource.split("\n")[0]; |
+ var success = undefined; |
+ if (firstLine.indexOf("fail") >= 0) { |
+ success = false; |
+ } else if (firstLine.indexOf("succeed") >= 0) { |
+ success = true; |
+ } |
+ if (success === undefined) { |
+ testFailed("bad first line in " + file + ":" + firstLine); |
+ continue; |
+ } |
+ if (!wtu.startsWith(firstLine, "// ")) { |
+ testFailed("bad first line in " + file + ":" + firstLine); |
+ continue; |
+ } |
+ passMsg = passMsg + (passMsg.length ? ", " : "") + firstLine.substr(3); |
+ if (wtu.endsWith(file, ".vert")) { |
+ info.vShaderSource = shaderSource; |
+ info.vShaderSuccess = success; |
+ } else if (wtu.endsWith(file, ".frag")) { |
+ info.fShaderSource = shaderSource; |
+ info.fShaderSuccess = success; |
+ } |
+ } |
+ info.linkSuccess = info.vShaderSuccess && info.fShaderSuccess; |
+ info.passMsg = passMsg; |
+ shaderInfos.push(info); |
+ } |
+ return shaderInfos; |
+} |
+ |
+function getSource(elem) { |
+ var str = elem.text; |
+ return str.replace(/^\s*/, '').replace(/\s*$/, ''); |
+} |
+ |
+function getPassMessage(source) { |
+ var lines = source.split('\n'); |
+ return lines[0].substring(3); |
+} |
+ |
+function getSuccess(msg) { |
+ if (msg.indexOf("fail") >= 0) { |
+ return false; |
+ } |
+ if (msg.indexOf("succeed") >= 0) { |
+ return true; |
+ } |
+ testFailed("bad test description. Must have 'fail' or 'success'"); |
+} |
+ |
+function runTest() { |
+ var vShaderElem = document.getElementById('vertexShader'); |
+ var vShaderSource = defaultVertexShader; |
+ var vShaderSuccess = true; |
+ |
+ var fShaderElem = document.getElementById('fragmentShader'); |
+ var fShaderSource = defaultFragmentShader; |
+ var fShaderSuccess = true; |
+ |
+ var passMsg = undefined; |
+ |
+ if (vShaderElem) { |
+ vShaderSource = getSource(vShaderElem); |
+ passMsg = getPassMessage(vShaderSource); |
+ vShaderSuccess = getSuccess(passMsg); |
+ } |
+ |
+ if (fShaderElem) { |
+ fShaderSource = getSource(fShaderElem); |
+ passMsg = getPassMessage(fShaderSource); |
+ fShaderSuccess = getSuccess(passMsg); |
+ } |
+ |
+ var linkSuccess = vShaderSuccess && fShaderSuccess; |
+ |
+ if (passMsg === undefined) { |
+ testFailed("no test shader found."); |
+ finishTest(); |
+ return; |
+ } |
+ |
+ var info = { |
+ vShaderSource: vShaderSource, |
+ vShaderSuccess: vShaderSuccess, |
+ fShaderSource: fShaderSource, |
+ fShaderSuccess: fShaderSuccess, |
+ linkSuccess: linkSuccess, |
+ passMsg: passMsg |
+ }; |
+ description(passMsg); |
+ runTests([info]); |
+} |
+ |
+return { |
+ runTest: runTest, |
+ runTests: runTests, |
+ loadExternalShaders: loadExternalShaders, |
+ |
+ none: false, |
+}; |
+}()); |
Property changes on: conformance/resources/glsl-conformance-test.js |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |