summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-conf/checkout/conformance/extensions/ext-frag-depth.html
blob: ee2a6df0cd707d049429aaf67a088fe7cc4b5fe2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
<!--
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.
-->

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WebGL EXT_frag_depth Conformance Tests</title>
<link rel="stylesheet" href="../../resources/js-test-style.css"/>
<script src="../../js/js-test-pre.js"></script>
<script src="../../js/webgl-test-utils.js"></script>
</head>
<body>
<div id="description"></div>
<canvas id="canvas" style="width: 50px; height: 50px;"> </canvas>
<div id="console"></div>
<!-- Shaders for testing fragment depth writing -->

<!-- Shader omitting the required #extension pragma -->
<script id="missingPragmaFragmentShader" type="x-shader/x-fragment">
precision mediump float;
void main() {
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
    gl_FragDepthEXT = 1.0;
}
</script>

<!-- Shader to test macro definition -->
<script id="macroFragmentShader" type="x-shader/x-fragment">
precision mediump float;
void main() {
#ifdef GL_EXT_frag_depth
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
#else
    // Error expected
    #error no GL_EXT_frag_depth;
#endif
}
</script>

<!-- Shader with required #extension pragma -->
<script id="testFragmentShader" type="x-shader/x-fragment">
#extension GL_EXT_frag_depth : enable
precision mediump float;
void main() {
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
    gl_FragDepthEXT = 1.0;
}
</script>
<!-- Shaders to link with test fragment shaders -->
<script id="goodVertexShader" type="x-shader/x-vertex">
attribute vec4 vPosition;
void main() {
    gl_Position = vPosition;
}
</script>
<!-- Shaders to test output -->
<script id="outputVertexShader" type="x-shader/x-vertex">
attribute vec4 vPosition;
void main() {
    gl_Position = vPosition;
}
</script>
<script id="outputFragmentShader" type="x-shader/x-fragment">
#extension GL_EXT_frag_depth : enable
precision mediump float;
uniform float uDepth;
void main() {
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
    gl_FragDepthEXT = uDepth;
}
</script>

<script>
"use strict";
description("This test verifies the functionality of the EXT_frag_depth extension, if it is available.");

debug("");

var wtu = WebGLTestUtils;
var canvas = document.getElementById("canvas");
var gl = wtu.create3DContext(canvas);
var ext = null;

// Run all tests once.
runAllTests();

// Run all tests against with a new context to test for any cache issues.
debug("");
debug("Testing new context to catch cache errors");
gl = wtu.create3DContext();
ext = null;
runAllTests();

function runAllTests() {
    if (!gl) {
        testFailed("WebGL context does not exist");
    } else {
        testPassed("WebGL context exists");

        runShaderTests(false);

        // Query the extension and store globally so shouldBe can access it
        ext = wtu.getExtensionWithKnownPrefixes(gl, "EXT_frag_depth");
        if (!ext) {
            testPassed("No EXT_frag_depth support -- this is legal");

            runSupportedTest(false);
        } else {
            testPassed("Successfully enabled EXT_frag_depth extension");

            runSupportedTest(true);

            runShaderTests(true);
            runOutputTests();
            runUniqueObjectTest();

            // Run deferred link tests.
            runDeferredLinkTests();
        }
    }

}

function runSupportedTest(extensionEnabled) {
    var supported = gl.getSupportedExtensions();
    if (supported.indexOf("EXT_frag_depth") >= 0) {
        if (extensionEnabled) {
            testPassed("EXT_frag_depth listed as supported and getExtension succeeded");
        } else {
            testFailed("EXT_frag_depth listed as supported but getExtension failed");
        }
    } else {
        if (extensionEnabled) {
            testFailed("EXT_frag_depth not listed as supported but getExtension succeeded");
        } else {
            testPassed("EXT_frag_depth not listed as supported and getExtension failed -- this is legal");
        }
    }
}

function runShaderTests(extensionEnabled) {
    debug("");
    debug("Testing various shader compiles with extension " + (extensionEnabled ? "enabled" : "disabled"));

    // Expect the macro shader to succeed ONLY if enabled
    var macroFragmentProgram = wtu.loadProgramFromScriptExpectError(gl, "goodVertexShader", "macroFragmentShader");
    if (extensionEnabled) {
        if (macroFragmentProgram) {
            // Expected result
            testPassed("GL_EXT_frag_depth defined in shaders when extension is enabled");
        } else {
            testFailed("GL_EXT_frag_depth not defined in shaders when extension is enabled");
        }
    } else {
        if (macroFragmentProgram) {
            testFailed("GL_EXT_frag_depth defined in shaders when extension is disabled");
        } else {
            testPassed("GL_EXT_frag_depth not defined in shaders when extension disabled");
        }
    }

    // Always expect the shader missing the #pragma to fail (whether enabled or not)
    var missingPragmaFragmentProgram = wtu.loadProgramFromScriptExpectError(gl, "goodVertexShader", "missingPragmaFragmentShader");
    if (missingPragmaFragmentProgram) {
        testFailed("Shader built-ins allowed without #extension pragma");
    } else {
        testPassed("Shader built-ins disallowed without #extension pragma");
    }

    // Try to compile a shader using the built-ins that should only succeed if enabled
    var testFragmentProgram = wtu.loadProgramFromScriptExpectError(gl, "goodVertexShader", "testFragmentShader");
    if (extensionEnabled) {
        if (testFragmentProgram) {
            testPassed("Shader built-ins compiled successfully when extension enabled");
        } else {
            testFailed("Shader built-ins failed to compile when extension enabled");
        }
    } else {
        if (testFragmentProgram) {
            testFailed("Shader built-ins compiled successfully when extension disabled");
        } else {
            testPassed("Shader built-ins failed to compile when extension disabled");
        }
    }
}

function runOutputTests() {
    var e = 2; // Amount of variance to allow in result pixels - may need to be tweaked higher

    debug("Testing various draws for valid built-in function behavior");

    canvas.width = 50; canvas.height = 50;
    gl.viewport(0, 0, canvas.width, canvas.height);

    // Enable depth testing with a clearDepth of 0.5
    // This makes it so that fragments are only rendered when
    // gl_fragDepthEXT is < 0.5
    gl.clearDepth(0.5);
    gl.enable(gl.DEPTH_TEST);

    var positionLoc = 0;
    var texcoordLoc = 1;
    var program = wtu.setupProgram(gl, ["outputVertexShader", "outputFragmentShader"], ['vPosition'], [0]);
    var quadParameters = wtu.setupUnitQuad(gl, 0, 1);
    var depthUniform = gl.getUniformLocation(program, "uDepth");

    // Draw 1: Greater than clear depth
    gl.uniform1f(depthUniform, 1.0);
    wtu.clearAndDrawUnitQuad(gl);
    wtu.checkCanvasRect(gl, 0, 0, canvas.width, canvas.height, [255, 255, 255, 255]);

    // Draw 2: Less than clear depth
    gl.uniform1f(depthUniform, 0.0);
    wtu.clearAndDrawUnitQuad(gl);
    wtu.checkCanvasRect(gl, 0, 0, canvas.width, canvas.height, [255, 0, 0, 255]);
}

function runUniqueObjectTest()
{
    debug("Testing that getExtension() returns the same object each time");
    ext = null;
    gl.getExtension("EXT_frag_depth").myProperty = 2;
    webglHarnessCollectGarbage();
    shouldBe('gl.getExtension("EXT_frag_depth").myProperty', '2');
}

function runDeferredLinkTests() {
    debug("");
    debug("Testing deferred shader compilation tests.");

    // Test for compilation failures that are caused by missing extensions
    // do not succeed if extensions are enabled during linking. This would
    // only happen for deferred shader compilations.

    // First test if link succeeds with extension enabled.
    var glEnabled = wtu.create3DContext();
    var extEnabled = glEnabled.getExtension("EXT_frag_depth");
    if (!extEnabled) {
        testFailed("Deferred link test expects the extension to be supported");
    }

    var vertexShader = wtu.loadShaderFromScript(glEnabled, "goodVertexShader");
    var fragmentShader = wtu.loadShaderFromScript(glEnabled, "macroFragmentShader");

    if (!vertexShader || !fragmentShader) {
        testFailed("Could not create good shaders.");
        return;
    }

    var program = wtu.setupProgram(glEnabled, [vertexShader, fragmentShader]);

    if (!program) {
        testFailed("Compilation with extension enabled failed.");
        return;
    }

    // Create new context to test link failure without extension enabled.
    var glDeferred = wtu.create3DContext();

    var vertexShader = wtu.loadShaderFromScript(glDeferred, "goodVertexShader", glDeferred.VERTEX_SHADER, undefined, undefined, true);
    var fragmentShader = wtu.loadShaderFromScript(glDeferred, "macroFragmentShader", glDeferred.FRAGMENT_SHADER, undefined, undefined, true);

    if (vertexShader == null || fragmentShader == null) {
        testFailed("Could not create shaders.");
        return;
    }

    // Shader compilations should have failed due to extensions not enabled.
    glDeferred.getExtension("EXT_frag_depth");
    var program = wtu.setupProgram(glDeferred, [vertexShader, fragmentShader]);
    if (program) {
        testFailed("Compilation with extension disabled then linking with extension enabled should have failed.");
        return;
    }

    testPassed("Compilation with extension disabled then linking with extension enabled.");
}

debug("");
var successfullyParsed = true;
</script>
<script src="../../js/js-test-post.js"></script>

</body>
</html>