summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_001_to_008.html135
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_009_to_012.html83
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_frag_xvary.frag19
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_frag_xvary_ref.frag55
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_frag_xvaryyvary.frag31
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_frag_xvaryyvary_ref.frag71
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_vert_xvary.vert20
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_vert_xvary_ref.vert56
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_vert_xvaryyvary.vert29
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_vert_xvaryyvary_ref.vert68
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_frag_xvary.frag19
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_frag_xvary_ref.frag115
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_frag_xvaryyvary.frag32
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_frag_xvaryyvary_ref.frag133
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_vert_xvary.vert20
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_vert_xvary_ref.vert116
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_vert_xvaryyvary.vert34
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_vert_xvaryyvary_ref.vert133
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_frag_xvary.frag19
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_frag_xvary_ref.frag161
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_frag_xvaryyvary.frag37
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_frag_xvaryyvary_ref.frag186
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_vert_xvary.vert20
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_vert_xvary_ref.vert161
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_vert_xvaryyvary.vert39
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_vert_xvaryyvary_ref.vert185
-rw-r--r--dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/input.run.txt3
27 files changed, 1980 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_001_to_008.html b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_001_to_008.html
new file mode 100644
index 0000000000..05b3e5b461
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_001_to_008.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<!-- this file is auto-generated. DO NOT EDIT. -->
+<!--
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+-->
+<html>
+<head>
+<meta charset="utf-8">
+<title>WebGL GLSL conformance test: atan_001_to_008.html</title>
+<link rel="stylesheet" href="../../../../resources/js-test-style.css" />
+<link rel="stylesheet" href="../../../../resources/ogles-tests.css" />
+<script src="../../../../js/js-test-pre.js"></script>
+<script src="../../../../js/webgl-test-utils.js"></script>
+<script src="../../ogles-utils.js"></script>
+</head>
+<body>
+<canvas id="example" width="500" height="500" style="width: 16px; height: 16px;"></canvas>
+<div id="description"></div>
+<div id="console"></div>
+</body>
+<script>
+"use strict";
+OpenGLESTestRunner.run({
+ "tests": [
+ {
+ "referenceProgram": {
+ "vertexShader": "../default/default.vert",
+ "fragmentShader": "atan_float_frag_xvary_ref.frag"
+ },
+ "model": null,
+ "testProgram": {
+ "vertexShader": "../default/default.vert",
+ "fragmentShader": "atan_float_frag_xvary.frag"
+ },
+ "name": "atan_float_frag_xvary.test.html",
+ "pattern": "compare"
+ },
+ {
+ "referenceProgram": {
+ "vertexShader": "../default/default.vert",
+ "fragmentShader": "atan_vec2_frag_xvary_ref.frag"
+ },
+ "model": null,
+ "testProgram": {
+ "vertexShader": "../default/default.vert",
+ "fragmentShader": "atan_vec2_frag_xvary.frag"
+ },
+ "name": "atan_vec2_frag_xvary.test.html",
+ "pattern": "compare"
+ },
+ {
+ "referenceProgram": {
+ "vertexShader": "../default/default.vert",
+ "fragmentShader": "atan_vec3_frag_xvary_ref.frag"
+ },
+ "model": null,
+ "testProgram": {
+ "vertexShader": "../default/default.vert",
+ "fragmentShader": "atan_vec3_frag_xvary.frag"
+ },
+ "name": "atan_vec3_frag_xvary.test.html",
+ "pattern": "compare"
+ },
+ {
+ "referenceProgram": {
+ "vertexShader": "../default/default.vert",
+ "fragmentShader": "atan_float_frag_xvaryyvary_ref.frag"
+ },
+ "model": null,
+ "testProgram": {
+ "vertexShader": "../default/default.vert",
+ "fragmentShader": "atan_float_frag_xvaryyvary.frag"
+ },
+ "name": "atan_float_frag_xvaryyvary.test.html",
+ "pattern": "compare"
+ },
+ {
+ "referenceProgram": {
+ "vertexShader": "../default/default.vert",
+ "fragmentShader": "atan_vec2_frag_xvaryyvary_ref.frag"
+ },
+ "model": null,
+ "testProgram": {
+ "vertexShader": "../default/default.vert",
+ "fragmentShader": "atan_vec2_frag_xvaryyvary.frag"
+ },
+ "name": "atan_vec2_frag_xvaryyvary.test.html",
+ "pattern": "compare"
+ },
+ {
+ "referenceProgram": {
+ "vertexShader": "../default/default.vert",
+ "fragmentShader": "atan_vec3_frag_xvaryyvary_ref.frag"
+ },
+ "model": null,
+ "testProgram": {
+ "vertexShader": "../default/default.vert",
+ "fragmentShader": "atan_vec3_frag_xvaryyvary.frag"
+ },
+ "name": "atan_vec3_frag_xvaryyvary.test.html",
+ "pattern": "compare"
+ },
+ {
+ "referenceProgram": {
+ "vertexShader": "atan_float_vert_xvary_ref.vert",
+ "fragmentShader": "../default/default.frag"
+ },
+ "model": "grid",
+ "testProgram": {
+ "vertexShader": "atan_float_vert_xvary.vert",
+ "fragmentShader": "../default/default.frag"
+ },
+ "name": "atan_float_vert_xvary.test.html",
+ "pattern": "compare"
+ },
+ {
+ "referenceProgram": {
+ "vertexShader": "atan_vec2_vert_xvary_ref.vert",
+ "fragmentShader": "../default/default.frag"
+ },
+ "model": "grid",
+ "testProgram": {
+ "vertexShader": "atan_vec2_vert_xvary.vert",
+ "fragmentShader": "../default/default.frag"
+ },
+ "name": "atan_vec2_vert_xvary.test.html",
+ "pattern": "compare"
+ }
+ ]
+});
+var successfullyParsed = true;
+</script>
+</html>
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_009_to_012.html b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_009_to_012.html
new file mode 100644
index 0000000000..201c0282cd
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_009_to_012.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<!-- this file is auto-generated. DO NOT EDIT. -->
+<!--
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+-->
+<html>
+<head>
+<meta charset="utf-8">
+<title>WebGL GLSL conformance test: atan_009_to_012.html</title>
+<link rel="stylesheet" href="../../../../resources/js-test-style.css" />
+<link rel="stylesheet" href="../../../../resources/ogles-tests.css" />
+<script src="../../../../js/js-test-pre.js"></script>
+<script src="../../../../js/webgl-test-utils.js"></script>
+<script src="../../ogles-utils.js"></script>
+</head>
+<body>
+<canvas id="example" width="500" height="500" style="width: 16px; height: 16px;"></canvas>
+<div id="description"></div>
+<div id="console"></div>
+</body>
+<script>
+"use strict";
+OpenGLESTestRunner.run({
+ "tests": [
+ {
+ "referenceProgram": {
+ "vertexShader": "atan_vec3_vert_xvary_ref.vert",
+ "fragmentShader": "../default/default.frag"
+ },
+ "model": "grid",
+ "testProgram": {
+ "vertexShader": "atan_vec3_vert_xvary.vert",
+ "fragmentShader": "../default/default.frag"
+ },
+ "name": "atan_vec3_vert_xvary.test.html",
+ "pattern": "compare"
+ },
+ {
+ "referenceProgram": {
+ "vertexShader": "atan_float_vert_xvaryyvary_ref.vert",
+ "fragmentShader": "../default/default.frag"
+ },
+ "model": "grid",
+ "testProgram": {
+ "vertexShader": "atan_float_vert_xvaryyvary.vert",
+ "fragmentShader": "../default/default.frag"
+ },
+ "name": "atan_float_vert_xvaryyvary.test.html",
+ "pattern": "compare"
+ },
+ {
+ "referenceProgram": {
+ "vertexShader": "atan_vec2_vert_xvaryyvary_ref.vert",
+ "fragmentShader": "../default/default.frag"
+ },
+ "model": "grid",
+ "testProgram": {
+ "vertexShader": "atan_vec2_vert_xvaryyvary.vert",
+ "fragmentShader": "../default/default.frag"
+ },
+ "name": "atan_vec2_vert_xvaryyvary.test.html",
+ "pattern": "compare"
+ },
+ {
+ "referenceProgram": {
+ "vertexShader": "atan_vec3_vert_xvaryyvary_ref.vert",
+ "fragmentShader": "../default/default.frag"
+ },
+ "model": "grid",
+ "testProgram": {
+ "vertexShader": "atan_vec3_vert_xvaryyvary.vert",
+ "fragmentShader": "../default/default.frag"
+ },
+ "name": "atan_vec3_vert_xvaryyvary.test.html",
+ "pattern": "compare"
+ }
+ ]
+});
+var successfullyParsed = true;
+</script>
+</html>
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_frag_xvary.frag b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_frag_xvary.frag
new file mode 100644
index 0000000000..75b48dd621
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_frag_xvary.frag
@@ -0,0 +1,19 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+#ifdef GL_ES
+precision mediump float;
+#endif
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ float c = 4.0 * 2.0 * (color.r - 0.5);
+ gl_FragColor = vec4(atan(c) / M_PI + 0.5, 0.0, 0.0, 1.0);
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_frag_xvary_ref.frag b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_frag_xvary_ref.frag
new file mode 100644
index 0000000000..83546d9d72
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_frag_xvary_ref.frag
@@ -0,0 +1,55 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+#ifdef GL_ES
+precision mediump float;
+#endif
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ float c = 4.0 * 2.0 * (color.r - 0.5);
+ float atan_c = 0.0;
+ float scale = 1.0;
+ float sign = 1.0;
+ vec4 result;
+
+ if(c < 0.0)
+ {
+ sign = -1.0;
+ c *= -1.0;
+ }
+
+ if(c <= 1.0)
+ {
+ // Taylors series expansion for atan
+ for(int i = 1; i < 12; i += 2)
+ {
+ atan_c += scale * pow(c, float(i)) / float(i);
+ scale *= -1.0;
+ }
+
+ result = vec4(sign * atan_c / M_PI + 0.5, 0.0, 0.0, 1.0);
+ }
+ else
+ {
+ c = 1.0 / c;
+
+ // Taylors series expansion for atan
+ for(int i = 1; i < 12; i += 2)
+ {
+ atan_c += scale * pow(c, float(i)) / float(i);
+ scale *= -1.0;
+ }
+
+ result = vec4(sign * (M_PI / 2.0 - atan_c) / M_PI + 0.5, 0.0, 0.0, 1.0);
+ }
+
+ gl_FragColor = result;
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_frag_xvaryyvary.frag b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_frag_xvaryyvary.frag
new file mode 100644
index 0000000000..20333090b1
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_frag_xvaryyvary.frag
@@ -0,0 +1,31 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+#ifdef GL_ES
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+precision highp float;
+#else
+precision mediump float;
+#endif
+#endif
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ float x = 2.0 * (color.g - 0.5);
+ float y = 2.0 * (color.b - 0.5);
+ const float epsilon = 1.0e-4;
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
+
+ // Avoid evaluating atan(0, x) for x < epsilon because it's implementation-dependent
+ if(x > epsilon || abs(y) > epsilon)
+ {
+ gl_FragColor = vec4(atan(y, x) / (2.0 * M_PI) + 0.5, 0.0, 0.0, 1.0);
+ }
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_frag_xvaryyvary_ref.frag b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_frag_xvaryyvary_ref.frag
new file mode 100644
index 0000000000..5c341a2a52
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_frag_xvaryyvary_ref.frag
@@ -0,0 +1,71 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+#ifdef GL_ES
+#ifdef GL_FRAGMENT_PRECISION_HIGH
+precision highp float;
+#else
+precision mediump float;
+#endif
+#endif
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ float x = 2.0 * (color.g - 0.5);
+ float y = 2.0 * (color.b - 0.5);
+ float atan_c = 0.0;
+ float scale = 1.0;
+ float sign = 1.0;
+ vec4 result = vec4(0.0, 0.0, 0.0, 1.0);
+ const float epsilon = 1.0e-4;
+
+ // Avoid evaluating atan(0, x) for x < epsilon because it's implementation-dependent
+ if(x > epsilon || abs(y) > epsilon)
+ {
+ if(x < 0.0 ^^ y < 0.0)
+ {
+ sign = -1.0;
+ }
+
+ if(abs(y) <= abs(x))
+ {
+ float c = abs(y / x);
+
+ // Taylors series expansion for atan
+ for(int i = 1; i < 12; i += 2)
+ {
+ atan_c += scale * pow(c, float(i)) / float(i);
+ scale *= -1.0;
+ }
+
+ result = vec4(sign * atan_c / (2.0 * M_PI) + 0.5, 0.0, 0.0, 1.0);
+ }
+ else
+ {
+ float c = abs(x / y);
+
+ // Taylors series expansion for atan
+ for(int i = 1; i < 12; i += 2)
+ {
+ atan_c += scale * pow(c, float(i)) / float(i);
+ scale *= -1.0;
+ }
+
+ result = vec4(sign * (M_PI / 2.0 - atan_c) / (2.0 * M_PI) + 0.5, 0.0, 0.0, 1.0);
+ }
+
+ if(x < 0.0)
+ if(y < 0.0) result.r -= 0.5;
+ else if(y > 0.0) result.r += 0.5;
+ }
+
+ gl_FragColor = result;
+}
+
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_vert_xvary.vert b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_vert_xvary.vert
new file mode 100644
index 0000000000..45d4753a12
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_vert_xvary.vert
@@ -0,0 +1,20 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+attribute vec4 gtf_Vertex;
+attribute vec4 gtf_Color;
+uniform mat4 gtf_ModelViewProjectionMatrix;
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ float c = 4.0 * 2.0 * (gtf_Color.r - 0.5);
+ color = vec4(atan(c) / M_PI + 0.5, 0.0, 0.0, 1.0);
+ gl_Position = gtf_ModelViewProjectionMatrix * gtf_Vertex;
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_vert_xvary_ref.vert b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_vert_xvary_ref.vert
new file mode 100644
index 0000000000..98838d98c8
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_vert_xvary_ref.vert
@@ -0,0 +1,56 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+attribute vec4 gtf_Vertex;
+attribute vec4 gtf_Color;
+uniform mat4 gtf_ModelViewProjectionMatrix;
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ float c = 4.0 * 2.0 * (gtf_Color.r - 0.5);
+ float atan_c = 0.0;
+ float scale = 1.0;
+ float sign = 1.0;
+ vec4 result;
+
+ if(c < 0.0)
+ {
+ sign = -1.0;
+ c *= -1.0;
+ }
+
+ if(c <= 1.0)
+ {
+ // Taylors series expansion for atan
+ for(int i = 1; i < 12; i += 2)
+ {
+ atan_c += scale * pow(c, float(i)) / float(i);
+ scale *= -1.0;
+ }
+
+ result = vec4(sign * atan_c / M_PI + 0.5, 0.0, 0.0, 1.0);
+ }
+ else
+ {
+ c = 1.0 / c;
+
+ // Taylors series expansion for atan
+ for(int i = 1; i < 12; i += 2)
+ {
+ atan_c += scale * pow(c, float(i)) / float(i);
+ scale *= -1.0;
+ }
+
+ result = vec4(sign * (M_PI / 2.0 - atan_c) / M_PI + 0.5, 0.0, 0.0, 1.0);
+ }
+
+ color = result;
+ gl_Position = gtf_ModelViewProjectionMatrix * gtf_Vertex;
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_vert_xvaryyvary.vert b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_vert_xvaryyvary.vert
new file mode 100644
index 0000000000..6da6ba13b6
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_vert_xvaryyvary.vert
@@ -0,0 +1,29 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+attribute vec4 gtf_Vertex;
+attribute vec4 gtf_Color;
+uniform mat4 gtf_ModelViewProjectionMatrix;
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ float x = 2.0 * (gtf_Color.g - 0.5);
+ float y = 2.0 * (gtf_Color.b - 0.5);
+ const float epsilon = 1.0e-4;
+ color = vec4(0.0, 0.0, 0.0, 1.0);
+
+ // Avoid evaluating atan(0, x) for x < epsilon because it's implementation-dependent
+ if(x > epsilon || abs(y) > epsilon)
+ {
+ color = vec4(atan(y, x) / (2.0 * M_PI) + 0.5, 0.0, 0.0, 1.0);
+ }
+
+ gl_Position = gtf_ModelViewProjectionMatrix * gtf_Vertex;
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_vert_xvaryyvary_ref.vert b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_vert_xvaryyvary_ref.vert
new file mode 100644
index 0000000000..b6c2d5f4ea
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_float_vert_xvaryyvary_ref.vert
@@ -0,0 +1,68 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+attribute vec4 gtf_Vertex;
+attribute vec4 gtf_Color;
+uniform mat4 gtf_ModelViewProjectionMatrix;
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ float x = 2.0 * (gtf_Color.g - 0.5);
+ float y = 2.0 * (gtf_Color.b - 0.5);
+ float atan_c = 0.0;
+ float scale = 1.0;
+ float sign = 1.0;
+ vec4 result = vec4(0.0, 0.0, 0.0, 1.0);
+ const float epsilon = 1.0e-4;
+
+ // Avoid evaluating atan(0, x) for x < epsilon because it's implementation-dependent
+ if(x > epsilon || abs(y) > epsilon)
+ {
+ if(x < 0.0 ^^ y < 0.0)
+ {
+ sign = -1.0;
+ }
+
+ if(abs(y) <= abs(x))
+ {
+ float c = abs(y / x);
+
+ // Taylors series expansion for atan
+ for(int i = 1; i < 12; i += 2)
+ {
+ atan_c += scale * pow(c, float(i)) / float(i);
+ scale *= -1.0;
+ }
+
+ result = vec4(sign * atan_c / (2.0 * M_PI) + 0.5, 0.0, 0.0, 1.0);
+ }
+ else
+ {
+ float c = abs(x / y);
+
+ // Taylors series expansion for atan
+ for(int i = 1; i < 12; i += 2)
+ {
+ atan_c += scale * pow(c, float(i)) / float(i);
+ scale *= -1.0;
+ }
+
+ result = vec4(sign * (M_PI / 2.0 - atan_c) / (2.0 * M_PI) + 0.5, 0.0, 0.0, 1.0);
+ }
+
+ if(x < 0.0)
+ if(y < 0.0) result.r -= 0.5;
+ else if(y > 0.0) result.r += 0.5;
+ }
+
+ color = result;
+ gl_Position = gtf_ModelViewProjectionMatrix * gtf_Vertex;
+}
+
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_frag_xvary.frag b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_frag_xvary.frag
new file mode 100644
index 0000000000..46d927e57c
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_frag_xvary.frag
@@ -0,0 +1,19 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+#ifdef GL_ES
+precision mediump float;
+#endif
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ vec2 c = 4.0 * 2.0 * (color.rg - 0.5);
+ gl_FragColor = vec4(atan(c) / M_PI + 0.5, 0.0, 1.0);
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_frag_xvary_ref.frag b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_frag_xvary_ref.frag
new file mode 100644
index 0000000000..9358f869ef
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_frag_xvary_ref.frag
@@ -0,0 +1,115 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+#ifdef GL_ES
+precision mediump float;
+#endif
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ vec2 c = 4.0 * 2.0 * (color.rg - 0.5);
+ vec2 atan_c = vec2(0.0);
+ vec2 scale = vec2(1.0);
+ vec2 sign = vec2(1.0);
+ vec4 result = vec4(0.0, 0.0, 0.0, 1.0);
+
+ if(c[0] < 0.0)
+ {
+ sign[0] = -1.0;
+ c[0] *= -1.0;
+ }
+
+ if(c[0] <= 1.0)
+ {
+ // Taylors series expansion for atan
+ atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
+ scale[0] *= -1.0;
+
+ result[0] = sign[0] * atan_c[0] / M_PI + 0.5;
+ }
+ else
+ {
+ c[0] = 1.0 / c[0];
+
+ // Taylors series expansion for atan
+ atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
+ scale[0] *= -1.0;
+
+ result[0] = sign[0] * (M_PI / 2.0 - atan_c[0]) / M_PI + 0.5;
+ }
+
+
+ if(c[1] < 0.0)
+ {
+ sign[1] = -1.0;
+ c[1] *= -1.0;
+ }
+
+ if(c[1] <= 1.0)
+ {
+ // Taylors series expansion for atan
+ atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
+ scale[1] *= -1.0;
+
+ result[1] = sign[1] * atan_c[1] / M_PI + 0.5;
+ }
+ else
+ {
+ c[1] = 1.0 / c[1];
+
+ // Taylors series expansion for atan
+ atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
+ scale[1] *= -1.0;
+
+ result[1] = sign[1] * (M_PI / 2.0 - atan_c[1]) / M_PI + 0.5;
+ }
+
+ gl_FragColor = result;
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_frag_xvaryyvary.frag b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_frag_xvaryyvary.frag
new file mode 100644
index 0000000000..8bffcb3dad
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_frag_xvaryyvary.frag
@@ -0,0 +1,32 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+#ifdef GL_ES
+precision mediump float;
+#endif
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ vec2 x = 2.0 * (color.gg - 0.5);
+ vec2 y = 2.0 * (color.bb - 0.5);
+ const float epsilon = 1.0e-4;
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
+
+ // Avoid evaluating atan(0, x) for x < epsilon because it's implementation-dependent
+ if(x[0] > epsilon || abs(y[0]) > epsilon)
+ {
+ gl_FragColor[0] = atan(y[0], x[0]) / (2.0 * M_PI) + 0.5;
+ }
+
+ if(x[1] > epsilon || abs(y[1]) > epsilon)
+ {
+ gl_FragColor[1] = atan(y[1], x[1]) / (2.0 * M_PI) + 0.5;
+ }
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_frag_xvaryyvary_ref.frag b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_frag_xvaryyvary_ref.frag
new file mode 100644
index 0000000000..bfd7117d48
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_frag_xvaryyvary_ref.frag
@@ -0,0 +1,133 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+#ifdef GL_ES
+precision mediump float;
+#endif
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ vec2 x = 2.0 * (color.gg - 0.5);
+ vec2 y = 2.0 * (color.bb - 0.5);
+ vec2 c;
+ vec2 atan_c = vec2(0.0);
+ vec2 scale = vec2(1.0);
+ vec2 sign = vec2(1.0);
+ vec4 result = vec4(0.0, 0.0, 0.0, 1.0);
+ const float epsilon = 1.0e-4;
+
+ // Avoid evaluating atan(0, x) for x < epsilon because it's implementation-dependent
+ if(x[0] > epsilon || abs(y[0]) > epsilon)
+ {
+ if(x[0] < 0.0 ^^ y[0] < 0.0)
+ {
+ sign[0] = -1.0;
+ }
+
+ if(abs(y[0]) <= abs(x[0]))
+ {
+ c[0] = abs(y[0] / x[0]);
+ // Taylors series expansion for atan
+ atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
+ scale[0] *= -1.0;
+
+ result[0] = sign[0] * atan_c[0] / (2.0 * M_PI) + 0.5;
+ }
+ else
+ {
+ c[0] = abs(x[0] / y[0]);
+
+ // Taylors series expansion for atan
+ atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
+ scale[0] *= -1.0;
+
+ result[0] = sign[0] * (M_PI / 2.0 - atan_c[0]) / (2.0 * M_PI) + 0.5;
+ }
+
+ if(x[0] < 0.0)
+ if(y[0] < 0.0) result[0] -= 0.5;
+ else if(y[0] > 0.0) result[0] += 0.5;
+ }
+
+ if(x[1] > epsilon || abs(y[1]) > epsilon)
+ {
+
+ if(x[1] < 0.0 ^^ y[1] < 0.0)
+ {
+ sign[1] = -1.0;
+ }
+
+ if(abs(y[1]) <= abs(x[1]))
+ {
+ c[1] = abs(y[1] / x[1]);
+ // Taylors series expansion for atan
+ atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
+ scale[1] *= -1.0;
+
+ result[1] = sign[1] * atan_c[1] / (2.0 * M_PI) + 0.5;
+ }
+ else
+ {
+ c[1] = abs(x[1] / y[1]);
+
+ // Taylors series expansion for atan
+ atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
+ scale[1] *= -1.0;
+
+ result[1] = sign[1] * (M_PI / 2.0 - atan_c[1]) / (2.0 * M_PI) + 0.5;
+ }
+
+ if(x[1] < 0.0)
+ if(y[1] < 0.0) result[1] -= 0.5;
+ else if(y[1] > 0.0) result[1] += 0.5;
+ }
+
+ gl_FragColor = result;
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_vert_xvary.vert b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_vert_xvary.vert
new file mode 100644
index 0000000000..5432f7244f
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_vert_xvary.vert
@@ -0,0 +1,20 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+attribute vec4 gtf_Vertex;
+attribute vec4 gtf_Color;
+uniform mat4 gtf_ModelViewProjectionMatrix;
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ vec2 c = 4.0 * 2.0 * (gtf_Color.rg - 0.5);
+ color = vec4(atan(c) / M_PI + 0.5, 0.0, 1.0);
+ gl_Position = gtf_ModelViewProjectionMatrix * gtf_Vertex;
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_vert_xvary_ref.vert b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_vert_xvary_ref.vert
new file mode 100644
index 0000000000..1ef2d5e83d
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_vert_xvary_ref.vert
@@ -0,0 +1,116 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+attribute vec4 gtf_Vertex;
+attribute vec4 gtf_Color;
+uniform mat4 gtf_ModelViewProjectionMatrix;
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ vec2 c = 4.0 * 2.0 * (gtf_Color.rg - 0.5);
+ vec2 atan_c = vec2(0.0);
+ vec2 scale = vec2(1.0);
+ vec2 sign = vec2(1.0);
+ vec4 result = vec4(0.0, 0.0, 0.0, 1.0);
+
+ if(c[0] < 0.0)
+ {
+ sign[0] = -1.0;
+ c[0] *= -1.0;
+ }
+
+ if(c[0] <= 1.0)
+ {
+ // Taylors series expansion for atan
+ atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
+ scale[0] *= -1.0;
+
+ result[0] = sign[0] * atan_c[0] / M_PI + 0.5;
+ }
+ else
+ {
+ c[0] = 1.0 / c[0];
+
+ // Taylors series expansion for atan
+ atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
+ scale[0] *= -1.0;
+
+ result[0] = sign[0] * (M_PI / 2.0 - atan_c[0]) / M_PI + 0.5;
+ }
+
+
+ if(c[1] < 0.0)
+ {
+ sign[1] = -1.0;
+ c[1] *= -1.0;
+ }
+
+ if(c[1] <= 1.0)
+ {
+ // Taylors series expansion for atan
+ atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
+ scale[1] *= -1.0;
+
+ result[1] = sign[1] * atan_c[1] / M_PI + 0.5;
+ }
+ else
+ {
+ c[1] = 1.0 / c[1];
+
+ // Taylors series expansion for atan
+ atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
+ scale[1] *= -1.0;
+
+ result[1] = sign[1] * (M_PI / 2.0 - atan_c[1]) / M_PI + 0.5;
+ }
+
+ color = result;
+ gl_Position = gtf_ModelViewProjectionMatrix * gtf_Vertex;
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_vert_xvaryyvary.vert b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_vert_xvaryyvary.vert
new file mode 100644
index 0000000000..bfa6448968
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_vert_xvaryyvary.vert
@@ -0,0 +1,34 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+attribute vec4 gtf_Vertex;
+attribute vec4 gtf_Color;
+uniform mat4 gtf_ModelViewProjectionMatrix;
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ vec2 x = 2.0 * (gtf_Color.gg - 0.5);
+ vec2 y = 2.0 * (gtf_Color.bb - 0.5);
+ const float epsilon = 1.0e-4;
+ color = vec4(0.0, 0.0, 0.0, 1.0);
+
+ // Avoid evaluating atan(0, x) for x < epsilon because it's implementation-dependent
+ if(x[0] > epsilon || abs(y[0]) > epsilon)
+ {
+ color[0] = atan(y[0], x[0]) / (2.0 * M_PI) + 0.5;
+ }
+
+ if(x[1] > epsilon || abs(y[1]) > epsilon)
+ {
+ color[1] = atan(y[1], x[1]) / (2.0 * M_PI) + 0.5;
+ }
+
+ gl_Position = gtf_ModelViewProjectionMatrix * gtf_Vertex;
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_vert_xvaryyvary_ref.vert b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_vert_xvaryyvary_ref.vert
new file mode 100644
index 0000000000..eee41526ff
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec2_vert_xvaryyvary_ref.vert
@@ -0,0 +1,133 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+attribute vec4 gtf_Vertex;
+attribute vec4 gtf_Color;
+uniform mat4 gtf_ModelViewProjectionMatrix;
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ vec2 x = 2.0 * (gtf_Color.gg - 0.5);
+ vec2 y = 2.0 * (gtf_Color.bb - 0.5);
+ vec2 c;
+ vec2 atan_c = vec2(0.0);
+ vec2 scale = vec2(1.0);
+ vec2 sign = vec2(1.0);
+ vec4 result = vec4(0.0, 0.0, 0.0, 1.0);
+ const float epsilon = 1.0e-4;
+
+ // Avoid evaluating atan(0, x) for x < epsilon because it's implementation-dependent
+ if(x[0] > epsilon || abs(y[0]) > epsilon)
+ {
+ if(x[0] < 0.0 ^^ y[0] < 0.0)
+ {
+ sign[0] = -1.0;
+ }
+
+ if(abs(y[0]) <= abs(x[0]))
+ {
+ c[0] = abs(y[0] / x[0]);
+ // Taylors series expansion for atan
+ atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
+ scale[0] *= -1.0;
+
+ result[0] = sign[0] * atan_c[0] / (2.0 * M_PI) + 0.5;
+ }
+ else
+ {
+ c[0] = abs(x[0] / y[0]);
+
+ // Taylors series expansion for atan
+ atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
+ scale[0] *= -1.0;
+
+ result[0] = sign[0] * (M_PI / 2.0 - atan_c[0]) / (2.0 * M_PI) + 0.5;
+ }
+
+ if(x[0] < 0.0)
+ if(y[0] < 0.0) result[0] -= 0.5;
+ else if(y[0] > 0.0) result[0] += 0.5;
+ }
+
+ if(x[1] > epsilon || abs(y[1]) > epsilon)
+ {
+ if(x[1] < 0.0 ^^ y[1] < 0.0)
+ {
+ sign[1] = -1.0;
+ }
+
+ if(abs(y[1]) <= abs(x[1]))
+ {
+ c[1] = abs(y[1] / x[1]);
+ // Taylors series expansion for atan
+ atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
+ scale[1] *= -1.0;
+
+ result[1] = sign[1] * atan_c[1] / (2.0 * M_PI) + 0.5;
+ }
+ else
+ {
+ c[1] = abs(x[1] / y[1]);
+
+ // Taylors series expansion for atan
+ atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
+ scale[1] *= -1.0;
+
+ result[1] = sign[1] * (M_PI / 2.0 - atan_c[1]) / (2.0 * M_PI) + 0.5;
+ }
+
+ if(x[1] < 0.0)
+ if(y[1] < 0.0) result[1] -= 0.5;
+ else if(y[1] > 0.0) result[1] += 0.5;
+ }
+
+ color = result;
+ gl_Position = gtf_ModelViewProjectionMatrix * gtf_Vertex;
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_frag_xvary.frag b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_frag_xvary.frag
new file mode 100644
index 0000000000..f4101e3e59
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_frag_xvary.frag
@@ -0,0 +1,19 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+#ifdef GL_ES
+precision mediump float;
+#endif
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ vec3 c = 4.0 * 2.0 * (color.rgb - 0.5);
+ gl_FragColor = vec4(atan(c) / M_PI + 0.5, 1.0);
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_frag_xvary_ref.frag b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_frag_xvary_ref.frag
new file mode 100644
index 0000000000..d5cfd01fa1
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_frag_xvary_ref.frag
@@ -0,0 +1,161 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+#ifdef GL_ES
+precision mediump float;
+#endif
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ vec3 c = 4.0 * 2.0 * (color.rgb - 0.5);
+ vec3 atan_c = vec3(0.0);
+ vec3 scale = vec3(1.0);
+ vec3 sign = vec3(1.0);
+ vec4 result = vec4(0.0, 0.0, 0.0, 1.0);
+
+
+ if(c[0] < 0.0)
+ {
+ sign[0] = -1.0;
+ c[0] *= -1.0;
+ }
+
+ if(c[0] <= 1.0)
+ {
+ // Taylors series expansion for atan
+ atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
+ scale[0] *= -1.0;
+
+ result[0] = sign[0] * atan_c[0] / M_PI + 0.5;
+ }
+ else
+ {
+ c[0] = 1.0 / c[0];
+
+ // Taylors series expansion for atan
+ atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
+ scale[0] *= -1.0;
+
+ result[0] = sign[0] * (M_PI / 2.0 - atan_c[0]) / M_PI + 0.5;
+ }
+
+ if(c[1] < 0.0)
+ {
+ sign[1] = -1.0;
+ c[1] *= -1.0;
+ }
+
+ if(c[1] <= 1.0)
+ {
+ // Taylors series expansion for atan
+ atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
+ scale[1] *= -1.0;
+
+ result[1] = sign[1] * atan_c[1] / M_PI + 0.5;
+ }
+ else
+ {
+ c[1] = 1.0 / c[1];
+
+ // Taylors series expansion for atan
+ atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
+ scale[1] *= -1.0;
+
+ result[1] = sign[1] * (M_PI / 2.0 - atan_c[1]) / M_PI + 0.5;
+ }
+
+
+ if(c[2] < 0.0)
+ {
+ sign[2] = -1.0;
+ c[2] *= -1.0;
+ }
+
+ if(c[2] <= 1.0)
+ {
+ // Taylors series expansion for atan
+ atan_c[2] += scale[2] * pow(c[2], float(1)) / float(1);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(3)) / float(3);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(5)) / float(5);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(7)) / float(7);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(9)) / float(9);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(11)) / float(11);
+ scale[2] *= -1.0;
+
+ result[2] = sign[2] * atan_c[2] / M_PI + 0.5;
+ }
+ else
+ {
+ c[2] = 1.0 / c[2];
+
+ // Taylors series expansion for atan
+ atan_c[2] += scale[2] * pow(c[2], float(1)) / float(1);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(3)) / float(3);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(5)) / float(5);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(7)) / float(7);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(9)) / float(9);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(11)) / float(11);
+ scale[2] *= -1.0;
+
+ result[2] = sign[2] * (M_PI / 2.0 - atan_c[2]) / M_PI + 0.5;
+ }
+
+ gl_FragColor = result;
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_frag_xvaryyvary.frag b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_frag_xvaryyvary.frag
new file mode 100644
index 0000000000..0db560e1df
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_frag_xvaryyvary.frag
@@ -0,0 +1,37 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+#ifdef GL_ES
+precision mediump float;
+#endif
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ vec3 x = 2.0 * (color.ggg - 0.5);
+ vec3 y = 2.0 * (color.bbb - 0.5);
+ const float epsilon = 1.0e-4;
+ gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
+
+ // Avoid evaluating atan(0, x) for x < epsilon because it's implementation-dependent
+ if(x[0] > epsilon || abs(y[0]) > epsilon)
+ {
+ gl_FragColor[0] = atan(y[0], x[0]) / (2.0 * M_PI) + 0.5;
+ }
+
+ if(x[1] > epsilon || abs(y[1]) > epsilon)
+ {
+ gl_FragColor[1] = atan(y[1], x[1]) / (2.0 * M_PI) + 0.5;
+ }
+
+ if(x[2] > epsilon || abs(y[2]) > epsilon)
+ {
+ gl_FragColor[2] = atan(y[2], x[2]) / (2.0 * M_PI) + 0.5;
+ }
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_frag_xvaryyvary_ref.frag b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_frag_xvaryyvary_ref.frag
new file mode 100644
index 0000000000..c6b55f4a0c
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_frag_xvaryyvary_ref.frag
@@ -0,0 +1,186 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+#ifdef GL_ES
+precision mediump float;
+#endif
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ vec3 x = 2.0 * (color.ggg - 0.5);
+ vec3 y = 2.0 * (color.bbb - 0.5);
+ vec3 c;
+ vec3 atan_c = vec3(0.0);
+ vec3 scale = vec3(1.0);
+ vec3 sign = vec3(1.0);
+ vec4 result = vec4(0.0, 0.0, 0.0, 1.0);
+ const float epsilon = 1.0e-4;
+
+ // Avoid evaluating atan(0, x) for x < epsilon because it's implementation-dependent
+ if(x[0] > epsilon || abs(y[0]) > epsilon)
+ {
+ if(x[0] < 0.0 ^^ y[0] < 0.0)
+ {
+ sign[0] = -1.0;
+ }
+
+ if(abs(y[0]) <= abs(x[0]))
+ {
+ c[0] = abs(y[0] / x[0]);
+ // Taylors series expansion for atan
+ atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
+ scale[0] *= -1.0;
+
+ result[0] = sign[0] * atan_c[0] / (2.0 * M_PI) + 0.5;
+ }
+ else
+ {
+ c[0] = abs(x[0] / y[0]);
+
+ // Taylors series expansion for atan
+ atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
+ scale[0] *= -1.0;
+
+ result[0] = sign[0] * (M_PI / 2.0 - atan_c[0]) / (2.0 * M_PI) + 0.5;
+ }
+
+ if(x[0] < 0.0)
+ if(y[0] < 0.0) result[0] -= 0.5;
+ else if(y[0] > 0.0) result[0] += 0.5;
+ }
+
+ if(x[1] > epsilon || abs(y[1]) > epsilon)
+ {
+
+ if(x[1] < 0.0 ^^ y[1] < 0.0)
+ {
+ sign[1] = -1.0;
+ }
+
+ if(abs(y[1]) <= abs(x[1]))
+ {
+ c[1] = abs(y[1] / x[1]);
+ // Taylors series expansion for atan
+ atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
+ scale[1] *= -1.0;
+
+ result[1] = sign[1] * atan_c[1] / (2.0 * M_PI) + 0.5;
+ }
+ else
+ {
+ c[1] = abs(x[1] / y[1]);
+
+ // Taylors series expansion for atan
+ atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
+ scale[1] *= -1.0;
+
+ result[1] = sign[1] * (M_PI / 2.0 - atan_c[1]) / (2.0 * M_PI) + 0.5;
+ }
+
+ if(x[1] < 0.0)
+ if(y[1] < 0.0) result[1] -= 0.5;
+ else if(y[1] > 0.0) result[1] += 0.5;
+ }
+
+ if(x[2] > epsilon || abs(y[2]) > epsilon)
+ {
+
+ if(x[2] < 0.0 ^^ y[2] < 0.0)
+ {
+ sign[2] = -1.0;
+ }
+
+ if(abs(y[2]) <= abs(x[2]))
+ {
+ c[2] = abs(y[2] / x[2]);
+ // Taylors series expansion for atan
+ atan_c[2] += scale[2] * pow(c[2], float(1)) / float(1);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(3)) / float(3);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(5)) / float(5);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(7)) / float(7);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(9)) / float(9);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(11)) / float(11);
+ scale[2] *= -1.0;
+
+ result[2] = sign[2] * atan_c[2] / (2.0 * M_PI) + 0.5;
+ }
+ else
+ {
+ c[2] = abs(x[2] / y[2]);
+
+ // Taylors series expansion for atan
+ atan_c[2] += scale[2] * pow(c[2], float(1)) / float(1);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(3)) / float(3);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(5)) / float(5);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(7)) / float(7);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(9)) / float(9);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(11)) / float(11);
+ scale[2] *= -1.0;
+
+ result[2] = sign[2] * (M_PI / 2.0 - atan_c[2]) / (2.0 * M_PI) + 0.5;
+ }
+
+ if(x[2] < 0.0)
+ if(y[2] < 0.0) result[2] -= 0.5;
+ else if(y[2] > 0.0) result[2] += 0.5;
+ }
+
+ gl_FragColor = result;
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_vert_xvary.vert b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_vert_xvary.vert
new file mode 100644
index 0000000000..cf11d094d6
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_vert_xvary.vert
@@ -0,0 +1,20 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+attribute vec4 gtf_Vertex;
+attribute vec4 gtf_Color;
+uniform mat4 gtf_ModelViewProjectionMatrix;
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ vec3 c = 4.0 * 2.0 * (gtf_Color.rgb - 0.5);
+ color = vec4(atan(c) / M_PI + 0.5, 1.0);
+ gl_Position = gtf_ModelViewProjectionMatrix * gtf_Vertex;
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_vert_xvary_ref.vert b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_vert_xvary_ref.vert
new file mode 100644
index 0000000000..4b811a1036
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_vert_xvary_ref.vert
@@ -0,0 +1,161 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+attribute vec4 gtf_Vertex;
+attribute vec4 gtf_Color;
+uniform mat4 gtf_ModelViewProjectionMatrix;
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ vec3 c = 4.0 * 2.0 * (gtf_Color.rgb - 0.5);
+ vec3 atan_c = vec3(0.0);
+ vec3 scale = vec3(1.0);
+ vec3 sign = vec3(1.0);
+ vec4 result = vec4(0.0, 0.0, 0.0, 1.0);
+
+ if(c[0] < 0.0)
+ {
+ sign[0] = -1.0;
+ c[0] *= -1.0;
+ }
+
+ if(c[0] <= 1.0)
+ {
+ // Taylors series expansion for atan
+ atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
+ scale[0] *= -1.0;
+
+ result[0] = sign[0] * atan_c[0] / M_PI + 0.5;
+ }
+ else
+ {
+ c[0] = 1.0 / c[0];
+
+ // Taylors series expansion for atan
+ atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
+ scale[0] *= -1.0;
+
+ result[0] = sign[0] * (M_PI / 2.0 - atan_c[0]) / M_PI + 0.5;
+ }
+
+
+ if(c[1] < 0.0)
+ {
+ sign[1] = -1.0;
+ c[1] *= -1.0;
+ }
+
+ if(c[1] <= 1.0)
+ {
+ // Taylors series expansion for atan
+ atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
+ scale[1] *= -1.0;
+
+ result[1] = sign[1] * atan_c[1] / M_PI + 0.5;
+ }
+ else
+ {
+ c[1] = 1.0 / c[1];
+
+ // Taylors series expansion for atan
+ atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
+ scale[1] *= -1.0;
+
+ result[1] = sign[1] * (M_PI / 2.0 - atan_c[1]) / M_PI + 0.5;
+ }
+
+ if(c[2] < 0.0)
+ {
+ sign[2] = -1.0;
+ c[2] *= -1.0;
+ }
+
+ if(c[2] <= 1.0)
+ {
+ // Taylors series expansion for atan
+ atan_c[2] += scale[2] * pow(c[2], float(1)) / float(1);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(3)) / float(3);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(5)) / float(5);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(7)) / float(7);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(9)) / float(9);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(11)) / float(11);
+ scale[2] *= -1.0;
+
+ result[2] = sign[2] * atan_c[2] / M_PI + 0.5;
+ }
+ else
+ {
+ c[2] = 1.0 / c[2];
+
+ // Taylors series expansion for atan
+ atan_c[2] += scale[2] * pow(c[2], float(1)) / float(1);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(3)) / float(3);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(5)) / float(5);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(7)) / float(7);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(9)) / float(9);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(11)) / float(11);
+ scale[2] *= -1.0;
+
+ result[2] = sign[2] * (M_PI / 2.0 - atan_c[2]) / M_PI + 0.5;
+ }
+
+ color = result;
+ gl_Position = gtf_ModelViewProjectionMatrix * gtf_Vertex;
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_vert_xvaryyvary.vert b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_vert_xvaryyvary.vert
new file mode 100644
index 0000000000..60d2cca63b
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_vert_xvaryyvary.vert
@@ -0,0 +1,39 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+attribute vec4 gtf_Vertex;
+attribute vec4 gtf_Color;
+uniform mat4 gtf_ModelViewProjectionMatrix;
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ vec3 x = 2.0 * (gtf_Color.ggg - 0.5);
+ vec3 y = 2.0 * (gtf_Color.bbb - 0.5);
+ const float epsilon = 1.0e-4;
+ color = vec4(0.0, 0.0, 0.0, 1.0);
+
+ // Avoid evaluating atan(0, x) for x < epsilon because it's implementation-dependent
+ if(x[0] > epsilon || abs(y[0]) > epsilon)
+ {
+ color[0] = atan(y[0], x[0]) / (2.0 * M_PI) + 0.5;
+ }
+
+ if(x[1] > epsilon || abs(y[1]) > epsilon)
+ {
+ color[1] = atan(y[1], x[1]) / (2.0 * M_PI) + 0.5;
+ }
+
+ if(x[2] > epsilon || abs(y[2]) > epsilon)
+ {
+ color[2] = atan(y[2], x[2]) / (2.0 * M_PI) + 0.5;
+ }
+
+ gl_Position = gtf_ModelViewProjectionMatrix * gtf_Vertex;
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_vert_xvaryyvary_ref.vert b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_vert_xvaryyvary_ref.vert
new file mode 100644
index 0000000000..9a46dec1ad
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/atan_vec3_vert_xvaryyvary_ref.vert
@@ -0,0 +1,185 @@
+
+/*
+Copyright (c) 2019 The Khronos Group Inc.
+Use of this source code is governed by an MIT-style license that can be
+found in the LICENSE.txt file.
+*/
+
+
+attribute vec4 gtf_Vertex;
+attribute vec4 gtf_Color;
+uniform mat4 gtf_ModelViewProjectionMatrix;
+varying vec4 color;
+
+void main (void)
+{
+ const float M_PI = 3.14159265358979323846;
+ vec3 x = 2.0 * (gtf_Color.ggg - 0.5);
+ vec3 y = 2.0 * (gtf_Color.bbb - 0.5);
+ vec3 c;
+ vec3 atan_c = vec3(0.0);
+ vec3 scale = vec3(1.0);
+ vec3 sign = vec3(1.0);
+ vec4 result = vec4(0.0, 0.0, 0.0, 1.0);
+ const float epsilon = 1.0e-4;
+
+ // Avoid evaluating atan(0, x) for x < epsilon because it's implementation-dependent
+ if(x[0] > epsilon || abs(y[0]) > epsilon)
+ {
+ if(x[0] < 0.0 ^^ y[0] < 0.0)
+ {
+ sign[0] = -1.0;
+ }
+
+ if(abs(y[0]) <= abs(x[0]))
+ {
+ c[0] = abs(y[0] / x[0]);
+ // Taylors series expansion for atan
+ atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
+ scale[0] *= -1.0;
+
+ result[0] = sign[0] * atan_c[0] / (2.0 * M_PI) + 0.5;
+ }
+ else
+ {
+ c[0] = abs(x[0] / y[0]);
+
+ // Taylors series expansion for atan
+ atan_c[0] += scale[0] * pow(c[0], float(1)) / float(1);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(3)) / float(3);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(5)) / float(5);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(7)) / float(7);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(9)) / float(9);
+ scale[0] *= -1.0;
+ atan_c[0] += scale[0] * pow(c[0], float(11)) / float(11);
+ scale[0] *= -1.0;
+
+ result[0] = sign[0] * (M_PI / 2.0 - atan_c[0]) / (2.0 * M_PI) + 0.5;
+ }
+
+ if(x[0] < 0.0)
+ if(y[0] < 0.0) result[0] -= 0.5;
+ else if(y[0] > 0.0) result[0] += 0.5;
+ }
+
+ if(x[1] > epsilon || abs(y[1]) > epsilon)
+ {
+ if(x[1] < 0.0 ^^ y[1] < 0.0)
+ {
+ sign[1] = -1.0;
+ }
+
+ if(abs(y[1]) <= abs(x[1]))
+ {
+ c[1] = abs(y[1] / x[1]);
+ // Taylors series expansion for atan
+ atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
+ scale[1] *= -1.0;
+
+ result[1] = sign[1] * atan_c[1] / (2.0 * M_PI) + 0.5;
+ }
+ else
+ {
+ c[1] = abs(x[1] / y[1]);
+
+ // Taylors series expansion for atan
+ atan_c[1] += scale[1] * pow(c[1], float(1)) / float(1);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(3)) / float(3);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(5)) / float(5);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(7)) / float(7);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(9)) / float(9);
+ scale[1] *= -1.0;
+ atan_c[1] += scale[1] * pow(c[1], float(11)) / float(11);
+ scale[1] *= -1.0;
+
+ result[1] = sign[1] * (M_PI / 2.0 - atan_c[1]) / (2.0 * M_PI) + 0.5;
+ }
+
+ if(x[1] < 0.0)
+ if(y[1] < 0.0) result[1] -= 0.5;
+ else if(y[1] > 0.0) result[1] += 0.5;
+ }
+
+ if(x[2] > epsilon || abs(y[2]) > epsilon)
+ {
+ if(x[2] < 0.0 ^^ y[2] < 0.0)
+ {
+ sign[2] = -1.0;
+ }
+
+ if(abs(y[2]) <= abs(x[2]))
+ {
+ c[2] = abs(y[2] / x[2]);
+ // Taylors series expansion for atan
+ atan_c[2] += scale[2] * pow(c[2], float(1)) / float(1);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(3)) / float(3);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(5)) / float(5);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(7)) / float(7);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(9)) / float(9);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(11)) / float(11);
+ scale[2] *= -1.0;
+
+ result[2] = sign[2] * atan_c[2] / (2.0 * M_PI) + 0.5;
+ }
+ else
+ {
+ c[2] = abs(x[2] / y[2]);
+
+ // Taylors series expansion for atan
+ atan_c[2] += scale[2] * pow(c[2], float(1)) / float(1);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(3)) / float(3);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(5)) / float(5);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(7)) / float(7);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(9)) / float(9);
+ scale[2] *= -1.0;
+ atan_c[2] += scale[2] * pow(c[2], float(11)) / float(11);
+ scale[2] *= -1.0;
+
+ result[2] = sign[2] * (M_PI / 2.0 - atan_c[2]) / (2.0 * M_PI) + 0.5;
+ }
+
+ if(x[2] < 0.0)
+ if(y[2] < 0.0) result[2] -= 0.5;
+ else if(y[2] > 0.0) result[2] += 0.5;
+ }
+
+ color = result;
+ gl_Position = gtf_ModelViewProjectionMatrix * gtf_Vertex;
+}
diff --git a/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/input.run.txt b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/input.run.txt
new file mode 100644
index 0000000000..1c305f2111
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/conformance/ogles/GL/atan/input.run.txt
@@ -0,0 +1,3 @@
+# this file is auto-generated. DO NOT EDIT.
+atan_001_to_008.html
+atan_009_to_012.html