Bug 872701 - Add test that highp floats work iff GL gives a format for them. - r=bjacob
authorJeff Gilbert <jgilbert@mozilla.com>
Thu, 10 Oct 2013 17:59:39 -0700
changeset 164226 c2ee74395dc6d1d90b8d3c771bcbb738464e44bb
parent 164225 c7f0cd7515ad77db3654ce725dc671d47e7d33f5
child 164227 463b7dd0a72ff6c494381094f646be81a0e624b5
push id3066
push userakeybl@mozilla.com
push dateMon, 09 Dec 2013 19:58:46 +0000
treeherdermozilla-beta@a31a0dce83aa [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbjacob
bugs872701
milestone27.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 872701 - Add test that highp floats work iff GL gives a format for them. - r=bjacob
content/canvas/test/webgl/non-conf-tests/mochitest.ini
content/canvas/test/webgl/non-conf-tests/test_highp_fs.html
content/canvas/test/webgl/non-conf-tests/webgl-util.js
--- a/content/canvas/test/webgl/non-conf-tests/mochitest.ini
+++ b/content/canvas/test/webgl/non-conf-tests/mochitest.ini
@@ -1,8 +1,9 @@
 [DEFAULT]
 support-files =
   driver-info.js
   webgl-util.js
 
+[test_highp_fs.html]
 [test_webgl_available.html]
 [test_webgl_conformance.html]
 [test_webgl_request_mismatch.html]
new file mode 100644
--- /dev/null
+++ b/content/canvas/test/webgl/non-conf-tests/test_highp_fs.html
@@ -0,0 +1,62 @@
+<!DOCTYPE HTML>
+<title>WebGL test: `highp` support</title>
+<script src="/MochiKit/MochiKit.js"></script>
+<script src="/tests/SimpleTest/SimpleTest.js"></script>
+<link rel="stylesheet" href="/tests/SimpleTest/test.css">
+<script src="driver-info.js"></script>
+<script src="webgl-util.js"></script>
+<script id="shader-vs" type="x-shader/x-vertex">
+
+void main(void) {
+  gl_Position = vec4(vec3(0.0), 1.0);
+}
+
+</script>
+<script id="shader-fs" type="x-shader/x-fragment">
+
+precision highp float;
+
+void main(void) {
+  gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
+}
+
+</script>
+<body>
+<canvas id="c"></canvas>
+<script>
+
+// Give ourselves a scope to return early from:
+(function() {
+  var gl = WebGLUtil.getWebGL('c');
+  if (!gl) {
+    todo(false, 'WebGL is unavailable.');
+    return;
+  }
+
+  // Catch actual WebGLUtil errors, not GL errors.
+  function errorFunc(str) {
+    ok(false, 'Error: ' + str);
+  }
+  WebGLUtil.setErrorFunc(errorFunc);
+
+  function checkGLError(func, info) {
+    var error = gl.getError();
+    var prefix = info ? ('[' + info + '] ') : ''
+    func(!error, prefix + 'gl.getError should be 0x0, was 0x' + error.toString(16) + '.');
+  }
+
+  var format = gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER, gl.HIGH_FLOAT);
+  var prog = WebGLUtil.createProgramByIds(gl, 'shader-vs', 'shader-fs');
+  checkGLError(ok);
+  
+  if (format) {
+    ok(prog, 'Frag shader with unconditional `precision highp float` should ' +
+             'link if `getShaderPrecisionFormat` gives a format for it.');
+  } else {
+    ok(!prog, 'Frag shader with unconditional `precision highp float` should ' +
+              'NOT link if `getShaderPrecisionFormat` gives NO format for it.');
+  }
+})();
+
+</script>
+
--- a/content/canvas/test/webgl/non-conf-tests/webgl-util.js
+++ b/content/canvas/test/webgl/non-conf-tests/webgl-util.js
@@ -1,26 +1,42 @@
 WebGLUtil = (function() {
   // ---------------------------------------------------------------------------
-  // Error handling
+  // Error handling (for obvious failures, such as invalid element ids)
 
   function defaultErrorFunc(str) {
     console.log('Error: ' + str);
   }
 
   var gErrorFunc = defaultErrorFunc;
   function setErrorFunc(func) {
     gErrorFunc = func;
   }
 
   function error(str) {
     gErrorFunc(str);
   }
 
   // ---------------------------------------------------------------------------
+  // Warning handling (for failures that may be intentional)
+
+  function defaultWarningFunc(str) {
+    console.log('Warning: ' + str);
+  }
+
+  var gWarningFunc = defaultWarningFunc;
+  function setWarningFunc(func) {
+    gWarningFunc = func;
+  }
+
+  function warning(str) {
+    gWarningFunc(str);
+  }
+
+  // ---------------------------------------------------------------------------
   // WebGL helpers
 
   function getWebGL(canvasId, requireConformant) {
     // `requireConformant` will default to falsey if it is not supplied.
 
     var canvas = document.getElementById(canvasId);
 
     var gl = null;
@@ -58,29 +74,29 @@ WebGLUtil = (function() {
   // Returns a valid shader, or null on errors.
   function createShaderById(gl, id) {
     var elem = document.getElementById(id);
     if (!elem) {
       error('Failed to create shader from non-existent id \'' + id + '\'.');
       return null;
     }
 
-    var src = getContentById(id);
+    var src = getContentFromElem(elem);
 
     var shader;
     if (elem.type == "x-shader/x-fragment") {
       shader = gl.createShader(gl.FRAGMENT_SHADER);
-    } else if (shaderScript.type == "x-shader/x-vertex") {
+    } else if (elem.type == "x-shader/x-vertex") {
       shader = gl.createShader(gl.VERTEX_SHADER);
     } else {
       error('Bad MIME type for shader \'' + id + '\': ' + elem.type + '.');
       return null;
     }
 
-    gl.shaderSource(shader, str);
+    gl.shaderSource(shader, src);
     gl.compileShader(shader);
 
     return shader;
   }
 
   function createProgramByIds(gl, vsId, fsId) {
     var vs = createShaderById(gl, vsId);
     var fs = createShaderById(gl, fsId);
@@ -88,27 +104,28 @@ WebGLUtil = (function() {
       return null;
 
     var prog = gl.createProgram();
     gl.attachShader(prog, vs);
     gl.attachShader(prog, fs);
     gl.linkProgram(prog);
 
     if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {
-      var str = "Shader program linking failed:\n";
-      str += "Shader program info log:\n" + gl.getProgramInfoLog(prog) + "\n\n";
-      str += "Vert shader log:\n" + gl.getShaderInfoLog(vs) + "\n\n";
-      str += "Frag shader log:\n" + gl.getShaderInfoLog(fs);
-      error(str);
+      var str = "Shader program linking failed:";
+      str += "\nShader program info log:\n" + gl.getProgramInfoLog(prog);
+      str += "\n\nVert shader log:\n" + gl.getShaderInfoLog(vs);
+      str += "\n\nFrag shader log:\n" + gl.getShaderInfoLog(fs);
+      warning(str);
       return null;
     }
 
     return prog;
   }
 
   return {
     setErrorFunc: setErrorFunc,
+    setWarningFunc: setWarningFunc,
 
     getWebGL: getWebGL,
     createShaderById: createShaderById,
     createProgramByIds: createProgramByIds,
   };
 })();