4 ** Copyright (c) 2013 The Khronos Group Inc.
6 ** Permission is hereby granted, free of charge, to any person obtaining a
7 ** copy of this software and/or associated documentation files (the
8 ** "Materials"), to deal in the Materials without restriction, including
9 ** without limitation the rights to use, copy, modify, merge, publish,
10 ** distribute, sublicense, and/or sell copies of the Materials, and to
11 ** permit persons to whom the Materials are furnished to do so, subject to
12 ** the following conditions:
14 ** The above copyright notice and this permission notice shall be included
15 ** in all copies or substantial portions of the Materials.
17 ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21 ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22 ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23 ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
31 <meta charset="utf-8">
32 <title>WebGL Frag Depth Conformance Tests</title>
33 <link rel="stylesheet" href="../../resources/js-test-style.css"/>
34 <script src="../../resources/js-test-pre.js"></script>
35 <script src="../../conformance/resources/webgl-test-utils.js"></script>
38 <div id="description"></div>
39 <canvas id="canvas" style="width: 50px; height: 50px;"> </canvas>
40 <div id="console"></div>
41 <!-- Shaders for testing fragment depth writing -->
43 <!-- Shader omitting the required #version -->
44 <script id="fragmentShaderESSL1" type="x-shader/x-fragment">
45 precision mediump float;
47 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
51 <!-- Shader with required #version -->
52 <script id="fragmentShaderESSL3" type="x-shader/x-fragment">#version 300 es
53 precision mediump float;
54 out vec4 my_FragColor;
56 my_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
60 <!-- Shader using the EXT suffix -->
61 <script id="fragmentShaderESSL3EXT" type="x-shader/x-fragment">#version 300 es
62 precision mediump float;
63 out vec4 my_FragColor;
65 my_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
66 gl_FragDepthEXT = 1.0;
69 <!-- Shaders to link with test fragment shaders -->
70 <script id="vertexShaderESSL1" type="x-shader/x-vertex">
71 attribute vec4 vPosition;
73 gl_Position = vPosition;
76 <script id="vertexShaderESSL3" type="x-shader/x-vertex">#version 300 es
79 gl_Position = vPosition;
83 <!-- Shader to test output -->
84 <script id="outputFragmentShader" type="x-shader/x-fragment">#version 300 es
85 precision mediump float;
88 out vec4 my_FragColor;
90 my_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
91 gl_FragDepth = uDepth;
97 description("This test verifies the functionality of setting fragment depth in a shader.");
101 var wtu = WebGLTestUtils;
102 var canvas = document.getElementById("canvas");
103 var gl = wtu.create3DContext(canvas, null, 2);
106 testFailed("WebGL context does not exist");
108 testPassed("WebGL context exists");
115 function runShaderTests() {
117 debug("Testing various shader compiles");
119 // Always expect ESSL1 shaders to fail
120 var fragmentProgramESSL1 = wtu.loadProgramFromScriptExpectError(gl, "vertexShaderESSL1", "fragmentShaderESSL1");
121 if (fragmentProgramESSL1) {
122 testFailed("gl_FragDepth allowed in ESSL1 shader - should be disallowed");
124 testPassed("gl_FragDepth disallowed in ESSL1 shader");
127 // Try to compile a shader using the built-ins that should only succeed if enabled
128 var testFragmentProgram = wtu.loadProgramFromScriptExpectError(gl, "vertexShaderESSL3", "fragmentShaderESSL3");
129 if (testFragmentProgram) {
130 testPassed("gl_FragDepth allowed in ESSL3 shader");
132 testFailed("gl_FragDepth disallowed in ESSL3 shader");
135 var testFragmentProgram = wtu.loadProgramFromScriptExpectError(gl, "vertexShaderESSL3", "fragmentShaderESSL3EXT");
136 if (testFragmentProgram) {
137 testFailed("gl_FragDepthEXT allowed in ESSL3 shader - should only allow gl_FragDepth");
139 testPassed("gl_FragDepthEXT disallowed in ESSL3 shader");
143 function runOutputTests() {
144 debug("Testing rendering results from writing to gl_FragData");
146 canvas.width = 50; canvas.height = 50;
147 gl.viewport(0, 0, canvas.width, canvas.height);
149 // Enable depth testing with a clearDepth of 0.5
150 // This makes it so that fragments are only rendered when
151 // gl_FragDepth is < 0.5
153 gl.enable(gl.DEPTH_TEST);
157 var program = wtu.setupProgram(gl, ["vertexShaderESSL3", "outputFragmentShader"], ['vPosition'], [0]);
158 var quadParameters = wtu.setupUnitQuad(gl, 0, 1);
159 var depthUniform = gl.getUniformLocation(program, "uDepth");
161 // Draw 1: Greater than clear depth
162 gl.uniform1f(depthUniform, 1.0);
163 wtu.clearAndDrawUnitQuad(gl);
164 wtu.checkCanvasRect(gl, 0, 0, canvas.width, canvas.height, [255, 255, 255, 255]);
166 // Draw 2: Less than clear depth
167 gl.uniform1f(depthUniform, 0.0);
168 wtu.clearAndDrawUnitQuad(gl);
169 wtu.checkCanvasRect(gl, 0, 0, canvas.width, canvas.height, [255, 0, 0, 255]);
173 var successfullyParsed = true;
175 <script src="../../resources/js-test-post.js"></script>