1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program OpenGL ES Utilities
3 * ------------------------------------------------
5 * Copyright 2014 The Android Open Source Project
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 goog.provide('functional.gles3.es3fFragDepthTests');
23 goog.require('framework.common.tcuImageCompare');
24 goog.require('framework.common.tcuRGBA');
25 goog.require('framework.common.tcuSurface');
26 goog.require('framework.common.tcuTestCase');
27 goog.require('framework.delibs.debase.deMath');
28 goog.require('framework.delibs.debase.deRandom');
29 goog.require('framework.delibs.debase.deString');
30 goog.require('framework.opengl.gluShaderProgram');
31 goog.require('framework.opengl.gluDrawUtil');
32 goog.require('modules.shared.glsShaderRenderCase');
34 goog.scope(function() {
35 var es3fFragDepthTests = functional.gles3.es3fFragDepthTests;
36 var deMath = framework.delibs.debase.deMath;
37 var deRandom = framework.delibs.debase.deRandom;
38 var deString = framework.delibs.debase.deString;
39 var glsShaderRenderCase = modules.shared.glsShaderRenderCase;
40 var gluShaderProgram = framework.opengl.gluShaderProgram;
41 var gluDrawUtil = framework.opengl.gluDrawUtil;
42 var tcuImageCompare = framework.common.tcuImageCompare;
43 var tcuRGBA = framework.common.tcuRGBA;
44 var tcuSurface = framework.common.tcuSurface;
45 var tcuTestCase = framework.common.tcuTestCase;
46 /** @typedef {function(Array<number>):number} */ es3fFragDepthTests.EvalFragDepthFunc;
48 /** @const {string} */ es3fFragDepthTests.s_vertexShaderSrc = '' +
50 'in highp vec4 a_position;\n' +
51 'in highp vec2 a_coord;\n' +
52 'out highp vec2 v_coord;\n' +
53 'void main (void)\n' +
55 ' gl_Position = a_position;\n' +
56 ' v_coord = a_coord;\n' +
59 /** @const {string} */ es3fFragDepthTests.s_defaultFragmentShaderSrc = '' +
61 'uniform highp vec4 u_color;\n' +
62 'layout(location = 0) out mediump vec4 o_color;\n' +
63 'void main (void)\n' +
65 ' o_color = u_color;\n' +
69 * @param {number} func
74 es3fFragDepthTests.compare = function(func, a, b) {
76 case gl.NEVER: return false;
77 case gl.ALWAYS: return true;
78 case gl.LESS: return a < b;
79 case gl.LEQUAL: return a <= b;
80 case gl.EQUAL: return a === b;
81 case gl.NOTEQUAL: return a !== b;
82 case gl.GEQUAL: return a >= b;
83 case gl.GREATER: return a > b;
85 bufferedLogToConsole('Compare function not supported.');
91 * @extends {tcuTestCase.DeqpTest}
92 * @param {string} name
93 * @param {string} desc
94 * @param {string} fragSrc
95 * @param {?es3fFragDepthTests.EvalFragDepthFunc} evalFunc
96 * @param {number} compareFunc
98 es3fFragDepthTests.FragDepthCompareCase = function(name, desc, fragSrc, evalFunc, compareFunc) {
99 tcuTestCase.DeqpTest.call(this, name, desc);
100 /** @type {string} */ this.m_fragSrc = fragSrc;
101 /** @type {?es3fFragDepthTests.EvalFragDepthFunc} */ this.m_evalFunc = evalFunc;
102 /** @type {number} */ this.m_compareFunc = compareFunc;
105 es3fFragDepthTests.FragDepthCompareCase.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
106 es3fFragDepthTests.FragDepthCompareCase.prototype.constructor = es3fFragDepthTests.FragDepthCompareCase;
109 * @return {tcuTestCase.IterateResult}
111 es3fFragDepthTests.FragDepthCompareCase.prototype.iterate = function() {
112 /** @type {deRandom.Random} */ var rnd = new deRandom.Random(deString.deStringHash(this.name));
113 /** @type {number} */ var viewportW = Math.min(128, gl.drawingBufferWidth);
114 /** @type {number} */ var viewportH = Math.min(128, gl.drawingBufferHeight);
115 /** @type {number} */ var viewportX = rnd.getInt(0, gl.drawingBufferWidth - viewportW);
116 /** @type {number} */ var viewportY = rnd.getInt(0, gl.drawingBufferHeight - viewportH);
117 /** @type {tcuSurface.Surface} */ var renderedFrame = new tcuSurface.Surface(viewportW, viewportH);
118 /** @type {tcuSurface.Surface} */ var referenceFrame = new tcuSurface.Surface(viewportW, viewportH);
119 /** @type {number} */ var constDepth = 0.1;
120 var depthBits = /** @type {number} */ (gl.getParameter(gl.DEPTH_BITS));
122 /** @type {number} */ var xf;
123 /** @type {number} */ var d;
124 /** @type {boolean} */ var dpass;
127 throw new Error('Depth buffer is required');
130 gl.viewport(viewportX, viewportY, viewportW, viewportH);
131 gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
132 gl.enable(gl.DEPTH_TEST);
134 /** @type {Array<number>} */ var quadIndices = [0, 1, 2, 2, 1, 3];
136 // Fill viewport with 2 quads - one with constant depth and another with d = [-1..1]
137 /** @type {gluShaderProgram.ShaderProgram} */
138 var basicQuadProgram = new gluShaderProgram.ShaderProgram(gl, gluShaderProgram.makeVtxFragSources(es3fFragDepthTests.s_vertexShaderSrc, es3fFragDepthTests.s_defaultFragmentShaderSrc));
140 if (!basicQuadProgram.isOk()) {
141 bufferedLogToConsole(basicQuadProgram.getProgramInfo().infoLog);
142 throw new Error('Compile failed');
145 /** @type {Array<number>} */ var constDepthCoord = [
146 -1.0, -1.0, constDepth, 1.0,
147 -1.0, 1.0, constDepth, 1.0,
148 0.0, -1.0, constDepth, 1.0,
149 0.0, 1.0, constDepth, 1.0
152 /** @type {Array<number>} */ var varyingDepthCoord = [
159 gl.useProgram(basicQuadProgram.getProgram());
160 gl.uniform4f(gl.getUniformLocation(basicQuadProgram.getProgram(), 'u_color'), 0.0, 0.0, 1.0, 1.0);
161 gl.depthFunc(gl.ALWAYS);
163 /** @type {gluDrawUtil.VertexArrayBinding} */ var posBinding = gluDrawUtil.newFloatVertexArrayBinding('a_position', 4, 4, 0, constDepthCoord);
164 gluDrawUtil.draw(gl, basicQuadProgram.getProgram(), [posBinding], gluDrawUtil.triangles(quadIndices));
166 posBinding = gluDrawUtil.newFloatVertexArrayBinding('a_position', 4, 4, 0, varyingDepthCoord);
167 gluDrawUtil.draw(gl, basicQuadProgram.getProgram(), [posBinding], gluDrawUtil.triangles(quadIndices));
169 // Render with depth test.
170 /** @type {gluShaderProgram.ShaderProgram} */
171 var program = new gluShaderProgram.ShaderProgram(gl, gluShaderProgram.makeVtxFragSources(es3fFragDepthTests.s_vertexShaderSrc, this.m_fragSrc));
172 bufferedLogToConsole(program.getProgramInfo().infoLog);
175 throw new Error('Compile failed');
177 /** @type {Array<number>} */ var coord = [
184 /** @type {Array<number>} */ var position = [
185 -1.0, -1.0, 1.0, 1.0,
191 gl.useProgram(program.getProgram());
192 gl.depthFunc(this.m_compareFunc);
193 gl.uniform4f(gl.getUniformLocation(program.getProgram(), 'u_color'), 0.0, 1.0, 0.0, 1.0);
195 // Setup default helper uniforms.
196 glsShaderRenderCase.setupDefaultUniforms(program.getProgram());
198 /** @type {Array<gluDrawUtil.VertexArrayBinding>} */ var vertexArrays = [
199 gluDrawUtil.newFloatVertexArrayBinding('a_position', 4, 4, 0, position),
200 gluDrawUtil.newFloatVertexArrayBinding('a_coord', 2, 4, 0, coord)
203 gluDrawUtil.draw(gl, program.getProgram(), vertexArrays, gluDrawUtil.triangles(quadIndices));
205 renderedFrame.readViewport(gl, [viewportX, viewportY, viewportW, viewportH]);
208 for (var y = 0; y < referenceFrame.getHeight(); y++) {
209 /** @type {number} */ var yf = (y + 0.5) / referenceFrame.getHeight();
210 /** @type {number} */ var half = deMath.clamp(Math.floor(referenceFrame.getWidth() * 0.5 + 0.5), 0, referenceFrame.getWidth());
212 // Fill left half - comparison to constant 0.5
213 for (var x = 0; x < half; x++) {
214 xf = (x + 0.5) / referenceFrame.getWidth();
215 d = this.m_evalFunc([xf, yf]);
216 dpass = es3fFragDepthTests.compare(this.m_compareFunc, d, constDepth * 0.5 + 0.5);
218 referenceFrame.setPixel(x, y, dpass ? tcuRGBA.RGBA.green.toIVec() : tcuRGBA.RGBA.blue.toIVec());
221 // Fill right half - comparison to interpolated depth
222 for (var x = half; x < referenceFrame.getWidth(); x++) {
223 xf = (x + 0.5) / referenceFrame.getWidth();
224 /** @type {number} */ var xh = (x - half + 0.5) / (referenceFrame.getWidth() - half);
225 /** @type {number} */ var rd = 1.0 - (xh + yf) * 0.5;
226 d = this.m_evalFunc([xf, yf]);
227 dpass = es3fFragDepthTests.compare(this.m_compareFunc, d, rd);
229 referenceFrame.setPixel(x, y, dpass ? tcuRGBA.RGBA.green.toIVec() : tcuRGBA.RGBA.blue.toIVec());
233 /** @type {boolean} */ var isOk = tcuImageCompare.fuzzyCompare('Result', 'Image comparison result', referenceFrame.getAccess(), renderedFrame.getAccess(), 0.05);
236 testFailedOptions('Fail', false);
238 testPassedOptions('Pass', true);
240 return tcuTestCase.IterateResult.STOP;
245 * @extends {tcuTestCase.DeqpTest}
246 * @param {string} name
247 * @param {string} desc
248 * @param {string} fragSrc
249 * @param {es3fFragDepthTests.EvalFragDepthFunc} evalFunc
251 es3fFragDepthTests.FragDepthWriteCase = function(name, desc, fragSrc, evalFunc) {
252 tcuTestCase.DeqpTest.call(this, name, desc);
253 /** @type {string} */ this.m_fragSrc = fragSrc;
254 /** @type {es3fFragDepthTests.EvalFragDepthFunc} */ this.m_evalFunc = evalFunc;
257 es3fFragDepthTests.FragDepthWriteCase.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
258 es3fFragDepthTests.FragDepthWriteCase.prototype.constructor = es3fFragDepthTests.FragDepthWriteCase;
261 * @return {tcuTestCase.IterateResult}
263 es3fFragDepthTests.FragDepthWriteCase.prototype.iterate = function() {
264 /** @type {deRandom.Random} */ var rnd = new deRandom.Random(deString.deStringHash(this.name));
265 /** @type {number} */ var viewportW = Math.min(128, gl.drawingBufferWidth);
266 /** @type {number} */ var viewportH = Math.min(128, gl.drawingBufferHeight);
267 /** @type {number} */ var viewportX = rnd.getInt(0, gl.drawingBufferWidth - viewportW);
268 /** @type {number} */ var viewportY = rnd.getInt(0, gl.drawingBufferHeight - viewportH);
269 /** @type {tcuSurface.Surface} */ var renderedFrame = new tcuSurface.Surface(viewportW, viewportH);
270 /** @type {tcuSurface.Surface} */ var referenceFrame = new tcuSurface.Surface(viewportW, viewportH);
271 /** @type {number} */ var numDepthSteps = 16;
272 /** @type {number} */ var depthStep = 1.0 / (numDepthSteps - 1);
273 var depthBits = /** @type {number} */ (gl.getParameter(gl.DEPTH_BITS));
276 throw new Error('Depth buffer is required');
279 gl.viewport(viewportX, viewportY, viewportW, viewportH);
280 gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
281 gl.enable(gl.DEPTH_TEST);
282 gl.depthFunc(gl.LESS);
284 /** @type {Array<number>} */ var quadIndices = [0, 1, 2, 2, 1, 3];
286 // Render with given shader.
287 /** @type {gluShaderProgram.ShaderProgram} */
288 var program = new gluShaderProgram.ShaderProgram(gl, gluShaderProgram.makeVtxFragSources(es3fFragDepthTests.s_vertexShaderSrc, this.m_fragSrc));
289 bufferedLogToConsole(program.getProgramInfo().infoLog);
292 throw new Error('Compile failed');
294 /** @type {Array<number>} */ var coord = [
301 /** @type {Array<number>} */ var position = [
302 -1.0, -1.0, +1.0, 1.0,
308 gl.useProgram(program.getProgram());
309 gl.uniform4f(gl.getUniformLocation(program.getProgram(), 'u_color'), 0.0, 1.0, 0.0, 1.0);
311 // Setup default helper uniforms.
312 glsShaderRenderCase.setupDefaultUniforms(program.getProgram());
314 /** @type {Array<gluDrawUtil.VertexArrayBinding>} */ var vertexArrays = [
315 gluDrawUtil.newFloatVertexArrayBinding('a_position', 4, 4, 0, position),
316 gluDrawUtil.newFloatVertexArrayBinding('a_coord', 2, 4, 0, coord)
318 gluDrawUtil.draw(gl, program.getProgram(), vertexArrays, gluDrawUtil.triangles(quadIndices));
320 // Visualize by rendering full-screen quads with increasing depth and color.
321 program = new gluShaderProgram.ShaderProgram(gl, gluShaderProgram.makeVtxFragSources(es3fFragDepthTests.s_vertexShaderSrc, es3fFragDepthTests.s_defaultFragmentShaderSrc));
323 if (!program.isOk()) {
324 bufferedLogToConsole(program.getProgramInfo().infoLog);
325 throw new Error('Compile failed');
328 /** @type {WebGLUniformLocation} */ var colorLoc = gl.getUniformLocation(program.getProgram(), 'u_color');
330 gl.useProgram(program.getProgram());
333 for (var stepNdx = 0; stepNdx < numDepthSteps; stepNdx++) {
334 /** @type {number} */ var f = stepNdx * depthStep;
335 /** @type {number} */ var depth = f * 2.0 - 1.0;
336 /** @type {Array<number>} */ var color = [f, f, f, 1.0];
339 -1.0, -1.0, depth, 1.0,
340 -1.0, 1.0, depth, 1.0,
341 1.0, -1.0, depth, 1.0,
345 /** @type {gluDrawUtil.VertexArrayBinding} */
346 var posBinding = gluDrawUtil.newFloatVertexArrayBinding('a_position', 4, 4, 0, position);
348 gl.uniform4fv(colorLoc, color);
349 gluDrawUtil.draw(gl, program.getProgram(), [posBinding], gluDrawUtil.triangles(quadIndices));
352 renderedFrame.readViewport(gl, [viewportX, viewportY, viewportW, viewportH]);
355 for (var y = 0; y < referenceFrame.getHeight(); y++)
356 for (var x = 0; x < referenceFrame.getWidth(); x++) {
357 /** @type {number} */ var xf = (x + 0.5) / referenceFrame.getWidth();
358 /** @type {number} */ var yf = (y + 0.5) / referenceFrame.getHeight();
359 /** @type {number} */ var d = this.m_evalFunc([xf, yf]);
360 /** @type {number} */ var step = Math.floor(d / depthStep);
361 /** @type {number} */ var col = deMath.clamp(Math.floor(step * depthStep * 255.0), 0, 255);
363 referenceFrame.setPixel(x, y, [col, col, col, 0xff]);
366 /** @type {boolean} */ var isOk = tcuImageCompare.fuzzyCompare('Result', 'Image comparison result', referenceFrame.getAccess(), renderedFrame.getAccess(), 0.05);
369 testFailedOptions('Fail', false);
371 testPassedOptions('Pass', true);
373 return tcuTestCase.IterateResult.STOP;
379 * @extends {tcuTestCase.DeqpTest}
381 es3fFragDepthTests.FragDepthTests = function() {
382 tcuTestCase.DeqpTest.call(this, 'fragdepth', 'gl_FragDepth tests');
385 es3fFragDepthTests.FragDepthTests.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
386 es3fFragDepthTests.FragDepthTests.prototype.constructor = es3fFragDepthTests.FragDepthTests;
389 * @param {Array<number>} coord
392 es3fFragDepthTests.evalConstDepth = function(coord) {
397 * @param {Array<number>} coord
400 es3fFragDepthTests.evalDynamicDepth = function(coord) {
401 return (coord[0] + coord[1]) * 0.5;
405 * @param {Array<number>} coord
408 es3fFragDepthTests.evalNoWrite = function(coord) {
409 return 1.0 - (coord[0] + coord[1]) * 0.5;
413 * @param {Array<number>} coord
416 es3fFragDepthTests.evalDynamicConditionalDepth = function(coord) {
417 /** @type {number} */ var d = (coord[0] + coord[1]) * 0.5;
424 es3fFragDepthTests.FragDepthTests.prototype.init = function() {
428 * @param {string} name
429 * @param {string} desc
430 * @param {es3fFragDepthTests.EvalFragDepthFunc} evalFunc
431 * @param {string} fragSrc
433 var Case = function(name, desc, evalFunc, fragSrc) {
434 /** @type {string} */ this.name = name;
435 /** @type {string} */ this.desc = desc;
436 /** @type {es3fFragDepthTests.EvalFragDepthFunc} */ this.evalFunc = evalFunc;
437 /** @type {string} */ this.fragSrc = fragSrc;
440 /** @type {Array<Case>} */ var cases = [
441 new Case('no_write', 'No gl_FragDepth write', es3fFragDepthTests.evalNoWrite,
442 '#version 300 es\n' +
443 'uniform highp vec4 u_color;\n' +
444 'layout(location = 0) out mediump vec4 o_color;\n' +
445 'void main (void)\n' +
447 ' o_color = u_color;\n' +
450 new Case('const', 'Const depth write', es3fFragDepthTests.evalConstDepth,
451 '#version 300 es\n' +
452 'uniform highp vec4 u_color;\n' +
453 'layout(location = 0) out mediump vec4 o_color;\n' +
454 'void main (void)\n' +
456 ' o_color = u_color;\n' +
457 ' gl_FragDepth = 0.5;\n' +
460 new Case('uniform', 'Uniform depth write', es3fFragDepthTests.evalConstDepth,
461 '#version 300 es\n' +
462 'uniform highp vec4 u_color;\n' +
463 'uniform highp float uf_half;\n' +
464 'layout(location = 0) out mediump vec4 o_color;\n' +
465 'void main (void)\n' +
467 ' o_color = u_color;\n' +
468 ' gl_FragDepth = uf_half;\n' +
471 new Case('dynamic', 'Dynamic depth write', es3fFragDepthTests.evalDynamicDepth,
472 '#version 300 es\n' +
473 'uniform highp vec4 u_color;\n' +
474 'in highp vec2 v_coord;\n' +
475 'layout(location = 0) out mediump vec4 o_color;\n' +
476 'void main (void)\n' +
478 ' o_color = u_color;\n' +
479 ' gl_FragDepth = (v_coord.x+v_coord.y)*0.5;\n' +
482 new Case('fragcoord_z', 'gl_FragDepth write from gl_FragCoord.z', es3fFragDepthTests.evalNoWrite,
483 '#version 300 es\n' +
484 'uniform highp vec4 u_color;\n' +
485 'layout(location = 0) out mediump vec4 o_color;\n' +
486 'void main (void)\n' +
488 ' o_color = u_color;\n' +
489 ' gl_FragDepth = gl_FragCoord.z;\n' +
492 new Case('uniform_conditional_write', 'Uniform conditional write', es3fFragDepthTests.evalDynamicDepth,
493 '#version 300 es\n' +
494 'uniform highp vec4 u_color;\n' +
495 'uniform bool ub_true;\n' +
496 'in highp vec2 v_coord;\n' +
497 'layout(location = 0) out mediump vec4 o_color;\n' +
498 'void main (void)\n' +
500 ' o_color = u_color;\n' +
502 ' gl_FragDepth = (v_coord.x+v_coord.y)*0.5;\n' +
505 new Case('dynamic_conditional_write', 'Uniform conditional write', es3fFragDepthTests.evalDynamicConditionalDepth,
506 '#version 300 es\n' +
507 'uniform highp vec4 u_color;\n' +
508 'uniform bool ub_true;\n' +
509 'in highp vec2 v_coord;\n' +
510 'layout(location = 0) out mediump vec4 o_color;\n' +
511 'void main (void)\n' +
513 ' o_color = u_color;\n' +
514 ' mediump float d = (v_coord.x+v_coord.y)*0.5f;\n' +
515 ' if (v_coord.y < 0.5)\n' +
516 ' gl_FragDepth = d;\n' +
518 ' gl_FragDepth = 1.0 - d;\n' +
521 new Case('uniform_loop_write', 'Uniform loop write', es3fFragDepthTests.evalConstDepth,
522 '#version 300 es\n' +
523 'uniform highp vec4 u_color;\n' +
524 'uniform int ui_two;\n' +
525 'uniform highp float uf_fourth;\n' +
526 'in highp vec2 v_coord;\n' +
527 'layout(location = 0) out mediump vec4 o_color;\n' +
528 'void main (void)\n' +
530 ' o_color = u_color;\n' +
531 ' gl_FragDepth = 0.0;\n' +
532 ' for (int i = 0; i < ui_two; i++)\n' +
533 ' gl_FragDepth += uf_fourth;\n' +
536 new Case('write_in_function', 'Uniform loop write', es3fFragDepthTests.evalDynamicDepth,
537 '#version 300 es\n' +
538 'uniform highp vec4 u_color;\n' +
539 'uniform highp float uf_half;\n' +
540 'in highp vec2 v_coord;\n' +
541 'layout(location = 0) out mediump vec4 o_color;\n' +
542 'void myfunc (highp vec2 coord)\n' +
544 ' gl_FragDepth = (coord.x+coord.y)*0.5;\n' +
546 'void main (void)\n' +
548 ' o_color = u_color;\n' +
549 ' myfunc(v_coord);\n' +
554 var testGroup = tcuTestCase.runner.testCases;
557 /** @type {tcuTestCase.DeqpTest} */ var writeGroup = tcuTestCase.newTest('write', 'gl_FragDepth write tests');
558 testGroup.addChild(writeGroup);
559 for (var ndx = 0; ndx < cases.length; ndx++)
560 writeGroup.addChild(new es3fFragDepthTests.FragDepthWriteCase(cases[ndx].name, cases[ndx].desc, cases[ndx].fragSrc, cases[ndx].evalFunc));
563 /** @type {tcuTestCase.DeqpTest} */ var compareGroup = tcuTestCase.newTest('compare', 'gl_FragDepth used with depth comparison');
564 testGroup.addChild(compareGroup);
565 for (var ndx = 0; ndx < cases.length; ndx++)
566 compareGroup.addChild(new es3fFragDepthTests.FragDepthCompareCase(cases[ndx].name, cases[ndx].desc, cases[ndx].fragSrc, cases[ndx].evalFunc, gl.LESS));
571 * @param {WebGL2RenderingContext} context
573 es3fFragDepthTests.run = function(context) {
575 //Set up Test Root parameters
576 var state = tcuTestCase.runner;
577 state.setRoot(new es3fFragDepthTests.FragDepthTests());
579 //Set up name and description of this test series.
580 setCurrentTestName(state.testCases.fullName());
581 description(state.testCases.getDescription());
585 tcuTestCase.runTestCases();
588 testFailedOptions('Failed to es3fFragDepthTests.run tests', false);
589 tcuTestCase.runner.terminate();