1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/content/canvas/test/webgl-mochitest/webgl-util.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,131 @@ 1.4 +WebGLUtil = (function() { 1.5 + // --------------------------------------------------------------------------- 1.6 + // Error handling (for obvious failures, such as invalid element ids) 1.7 + 1.8 + function defaultErrorFunc(str) { 1.9 + console.log('Error: ' + str); 1.10 + } 1.11 + 1.12 + var gErrorFunc = defaultErrorFunc; 1.13 + function setErrorFunc(func) { 1.14 + gErrorFunc = func; 1.15 + } 1.16 + 1.17 + function error(str) { 1.18 + gErrorFunc(str); 1.19 + } 1.20 + 1.21 + // --------------------------------------------------------------------------- 1.22 + // Warning handling (for failures that may be intentional) 1.23 + 1.24 + function defaultWarningFunc(str) { 1.25 + console.log('Warning: ' + str); 1.26 + } 1.27 + 1.28 + var gWarningFunc = defaultWarningFunc; 1.29 + function setWarningFunc(func) { 1.30 + gWarningFunc = func; 1.31 + } 1.32 + 1.33 + function warning(str) { 1.34 + gWarningFunc(str); 1.35 + } 1.36 + 1.37 + // --------------------------------------------------------------------------- 1.38 + // WebGL helpers 1.39 + 1.40 + function getWebGL(canvasId, requireConformant) { 1.41 + // `requireConformant` will default to falsey if it is not supplied. 1.42 + 1.43 + var canvas = document.getElementById(canvasId); 1.44 + 1.45 + var gl = null; 1.46 + try { 1.47 + gl = canvas.getContext('webgl'); 1.48 + } catch(e) {} 1.49 + 1.50 + if (!gl && !requireConformant) { 1.51 + try { 1.52 + gl = canvas.getContext('experimental-webgl'); 1.53 + } catch(e) {} 1.54 + } 1.55 + 1.56 + if (!gl) { 1.57 + error('WebGL context could not be retrieved from \'' + canvasId + '\'.'); 1.58 + return null; 1.59 + } 1.60 + 1.61 + return gl; 1.62 + } 1.63 + 1.64 + function getContentFromElem(elem) { 1.65 + var str = ""; 1.66 + var k = elem.firstChild; 1.67 + while (k) { 1.68 + if (k.nodeType == 3) 1.69 + str += k.textContent; 1.70 + 1.71 + k = k.nextSibling; 1.72 + } 1.73 + 1.74 + return str; 1.75 + } 1.76 + 1.77 + // Returns a valid shader, or null on errors. 1.78 + function createShaderById(gl, id) { 1.79 + var elem = document.getElementById(id); 1.80 + if (!elem) { 1.81 + error('Failed to create shader from non-existent id \'' + id + '\'.'); 1.82 + return null; 1.83 + } 1.84 + 1.85 + var src = getContentFromElem(elem); 1.86 + 1.87 + var shader; 1.88 + if (elem.type == "x-shader/x-fragment") { 1.89 + shader = gl.createShader(gl.FRAGMENT_SHADER); 1.90 + } else if (elem.type == "x-shader/x-vertex") { 1.91 + shader = gl.createShader(gl.VERTEX_SHADER); 1.92 + } else { 1.93 + error('Bad MIME type for shader \'' + id + '\': ' + elem.type + '.'); 1.94 + return null; 1.95 + } 1.96 + 1.97 + gl.shaderSource(shader, src); 1.98 + gl.compileShader(shader); 1.99 + 1.100 + return shader; 1.101 + } 1.102 + 1.103 + function createProgramByIds(gl, vsId, fsId) { 1.104 + var vs = createShaderById(gl, vsId); 1.105 + var fs = createShaderById(gl, fsId); 1.106 + if (!vs || !fs) 1.107 + return null; 1.108 + 1.109 + var prog = gl.createProgram(); 1.110 + gl.attachShader(prog, vs); 1.111 + gl.attachShader(prog, fs); 1.112 + gl.linkProgram(prog); 1.113 + 1.114 + if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) { 1.115 + var str = "Shader program linking failed:"; 1.116 + str += "\nShader program info log:\n" + gl.getProgramInfoLog(prog); 1.117 + str += "\n\nVert shader log:\n" + gl.getShaderInfoLog(vs); 1.118 + str += "\n\nFrag shader log:\n" + gl.getShaderInfoLog(fs); 1.119 + warning(str); 1.120 + return null; 1.121 + } 1.122 + 1.123 + return prog; 1.124 + } 1.125 + 1.126 + return { 1.127 + setErrorFunc: setErrorFunc, 1.128 + setWarningFunc: setWarningFunc, 1.129 + 1.130 + getWebGL: getWebGL, 1.131 + createShaderById: createShaderById, 1.132 + createProgramByIds: createProgramByIds, 1.133 + }; 1.134 +})();