es3fFboCompletenessTests.js (22592B)
1 // FboCompletenessTests 2 'use strict'; 3 goog.provide('functional.gles3.es3fFboCompletenessTests'); 4 goog.require('framework.common.tcuTestCase'); 5 goog.require('modules.shared.glsFboCompletenessTests'); 6 goog.require('modules.shared.glsFboUtil'); 7 8 goog.scope(function() { 9 10 var es3fFboCompletenessTests = functional.gles3.es3fFboCompletenessTests; 11 var glsFboUtil = modules.shared.glsFboUtil; 12 var glsFboCompletenessTests = modules.shared.glsFboCompletenessTests; 13 var tcuTestCase = framework.common.tcuTestCase; 14 15 es3fFboCompletenessTests.initGlDependents = function(gl) { 16 if (!(gl = gl || window.gl)) throw new Error('Invalid gl object'); 17 18 /** 19 * @type {Array<number>} 20 */ 21 es3fFboCompletenessTests.s_es3ColorRenderables = [ 22 // GLES3, 4.4.4: "An internal format is color-renderable if it is one of 23 // the formats from table 3.12 noted as color-renderable..." 24 gl.R8, gl.RG8, gl.RGB8, gl.RGB565, gl.RGBA4, gl.RGB5_A1, gl.RGBA8, 25 gl.RGB10_A2, gl.RGB10_A2UI, gl.SRGB8_ALPHA8, 26 gl.R8I, gl.R8UI, gl.R16I, gl.R16UI, gl.R32I, gl.R32UI, 27 gl.RG8I, gl.RG8UI, gl.RG16I, gl.RG16UI, gl.RG32I, gl.RG32UI, 28 gl.RGBA81, gl.RGBA8UI, gl.RGB16I, gl.RGBA16UI, gl.RGBA32I, gl.RGBA32UI 29 ]; 30 31 /** 32 * @type {Array<number>} 33 */ 34 es3fFboCompletenessTests.s_es3UnsizedColorRenderables = [ 35 // "...or if it is unsized format RGBA or RGB." 36 // See Table 3.3 in GLES3. 37 glsFboUtil.formatkey(gl.RGBA, gl.UNSIGNED_BYTE), 38 glsFboUtil.formatkey(gl.RGBA, gl.UNSIGNED_SHORT_4_4_4_4), 39 glsFboUtil.formatkey(gl.RGBA, gl.UNSIGNED_SHORT_5_5_5_1), 40 glsFboUtil.formatkey(gl.RGB, gl.UNSIGNED_BYTE), 41 glsFboUtil.formatkey(gl.RGB, gl.UNSIGNED_SHORT_5_6_5) 42 ]; 43 44 /** 45 * @type {Array<number>} 46 */ 47 es3fFboCompletenessTests.s_es3DepthRenderables = [ 48 // GLES3, 4.4.4: "An internal format is depth-renderable if it is one of 49 // the formats from table 3.13." 50 gl.DEPTH_COMPONENT16, gl.DEPTH_COMPONENT24, gl.DEPTH_COMPONENT32F, 51 gl.DEPTH24_STENCIL8, gl.DEPTH32F_STENCIL8 52 ]; 53 54 /** 55 * @type {Array<number>} 56 */ 57 es3fFboCompletenessTests.s_es3StencilRboRenderables = [ 58 // GLES3, 4.4.4: "An internal format is stencil-renderable if it is 59 // STENCIL_INDEX8..." 60 gl.STENCIL_INDEX8 61 ]; 62 63 /** 64 * @type {Array<number>} 65 */ 66 es3fFboCompletenessTests.s_es3StencilRenderables = [ 67 // "...or one of the formats from table 3.13 whose base internal format is 68 // DEPTH_STENCIL." 69 gl.DEPTH24_STENCIL8, gl.DEPTH32F_STENCIL8 70 ]; 71 72 /** 73 * @type {Array<number>} 74 */ 75 es3fFboCompletenessTests.s_es3TextureFloatFormats = [ 76 gl.RGBA32F, gl.RGBA16F, gl.R11F_G11F_B10F, 77 gl.RG32F, gl.RG16F, gl.R32F, gl.R16F, 78 gl.RGBA16F, gl.RGB16F, gl.RG16F, gl.R16F 79 ]; 80 81 /** 82 * @type {Array<glsFboUtil.formatT>} 83 */ 84 es3fFboCompletenessTests.s_es3Formats = [ 85 [ 86 ( 87 glsFboUtil.FormatFlags.REQUIRED_RENDERABLE | 88 glsFboUtil.FormatFlags.COLOR_RENDERABLE | 89 glsFboUtil.FormatFlags.TEXTURE_VALID 90 ), 91 glsFboUtil.rangeArray(es3fFboCompletenessTests.s_es3UnsizedColorRenderables) 92 ], 93 [ 94 ( 95 glsFboUtil.FormatFlags.REQUIRED_RENDERABLE | 96 glsFboUtil.FormatFlags.COLOR_RENDERABLE | 97 glsFboUtil.FormatFlags.RENDERBUFFER_VALID | 98 glsFboUtil.FormatFlags.TEXTURE_VALID 99 ), 100 glsFboUtil.rangeArray(es3fFboCompletenessTests.s_es3ColorRenderables) 101 ], [ 102 ( 103 glsFboUtil.FormatFlags.REQUIRED_RENDERABLE | 104 glsFboUtil.FormatFlags.DEPTH_RENDERABLE | 105 glsFboUtil.FormatFlags.RENDERBUFFER_VALID | 106 glsFboUtil.FormatFlags.TEXTURE_VALID 107 ), 108 glsFboUtil.rangeArray(es3fFboCompletenessTests.s_es3DepthRenderables) 109 ], [ 110 ( 111 glsFboUtil.FormatFlags.REQUIRED_RENDERABLE | 112 glsFboUtil.FormatFlags.STENCIL_RENDERABLE | 113 glsFboUtil.FormatFlags.RENDERBUFFER_VALID 114 ), 115 glsFboUtil.rangeArray(es3fFboCompletenessTests.s_es3StencilRboRenderables) 116 ], [ 117 ( 118 glsFboUtil.FormatFlags.REQUIRED_RENDERABLE | 119 glsFboUtil.FormatFlags.STENCIL_RENDERABLE | 120 glsFboUtil.FormatFlags.RENDERBUFFER_VALID | 121 glsFboUtil.FormatFlags.TEXTURE_VALID 122 ), 123 glsFboUtil.rangeArray(es3fFboCompletenessTests.s_es3StencilRenderables) 124 ], 125 126 // These are not color-renderable in vanilla ES3, but we need to mark them 127 // as valid for textures, since EXT_color_buffer_(half_)float brings in 128 // color-renderability and only renderbuffer-validity. 129 [ 130 glsFboUtil.FormatFlags.TEXTURE_VALID, 131 glsFboUtil.rangeArray(es3fFboCompletenessTests.s_es3TextureFloatFormats) 132 ] 133 ]; 134 135 // gl.EXT_color_buffer_float 136 es3fFboCompletenessTests.s_extColorBufferFloatFormats = [ 137 gl.RGBA32F, gl.RGBA16F, gl.R11F_G11F_B10F, gl.RG32F, gl.RG16F, gl.R32F, gl.R16F 138 ]; 139 140 // gl.OES_texture_stencil8 141 es3fFboCompletenessTests.s_extOESTextureStencil8 = [ 142 gl.STENCIL_INDEX8 143 ]; 144 145 es3fFboCompletenessTests.s_es3ExtFormats = [{ 146 extensions: 'gl.EXT_color_buffer_float', 147 flags: glsFboUtil.FormatFlags.REQUIRED_RENDERABLE | 148 glsFboUtil.FormatFlags.COLOR_RENDERABLE | 149 glsFboUtil.FormatFlags.RENDERBUFFER_VALID, 150 formats: new glsFboUtil.Range(es3fFboCompletenessTests.s_extColorBufferFloatFormats) 151 }, { 152 extensions: 'gl.OES_texture_stencil8', 153 flags: glsFboUtil.FormatFlags.REQUIRED_RENDERABLE | 154 glsFboUtil.FormatFlags.STENCIL_RENDERABLE | 155 glsFboUtil.FormatFlags.TEXTURE_VALID, 156 formats: new glsFboUtil.Range(es3fFboCompletenessTests.s_extOESTextureStencil8) 157 } 158 ]; 159 160 glsFboCompletenessTests.initGlDependents(gl); 161 }; 162 163 /** 164 * @constructor 165 * @extends {glsFboUtil.Checker} 166 */ 167 es3fFboCompletenessTests.ES3Checker = function() { 168 glsFboUtil.Checker.call(this, gl); 169 /** @type {number} */ this.m_numSamples = -1; // GLsizei 170 /** @type {number} */ this.m_depthStencilImage = 0; // GLuint 171 /** @type {number} */ this.m_depthStencilType = gl.NONE; 172 }; 173 es3fFboCompletenessTests.ES3Checker.prototype = Object.create(glsFboUtil.Checker.prototype); 174 es3fFboCompletenessTests.ES3Checker.prototype.constructor = es3fFboCompletenessTests.ES3Checker; 175 176 es3fFboCompletenessTests.ES3Checker.prototype.check = function(attPoint, att, image) { 177 178 var imgSamples = glsFboUtil.imageNumSamples(image); 179 180 if (this.m_numSamples == -1) { 181 this.m_numSamples = imgSamples; 182 } else { 183 // GLES3: "The value of RENDERBUFFER_SAMPLES is the same for all attached 184 // renderbuffers and, if the attached images are a mix of renderbuffers 185 // and textures, the value of RENDERBUFFER_SAMPLES is zero." 186 // 187 // On creating a renderbuffer: "If _samples_ is zero, then 188 // RENDERBUFFER_SAMPLES is set to zero. Otherwise [...] the resulting 189 // value for RENDERBUFFER_SAMPLES is guaranteed to be greater than or 190 // equal to _samples_ and no more than the next larger sample count 191 // supported by the implementation." 192 193 // Either all attachments are zero-sample renderbuffers and/or 194 // textures, or none of them are. 195 this.addFBOStatus( 196 (this.m_numSamples == 0) == (imgSamples == 0), 197 gl.FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 198 ); 199 200 // If the attachments requested a different number of samples, the 201 // implementation is allowed to report this as incomplete. However, it 202 // is also possible that despite the different requests, the 203 // implementation allocated the same number of samples to both. Hence 204 // reporting the framebuffer as complete is also legal. 205 this.addPotentialFBOStatus( 206 this.m_numSamples == imgSamples, 207 gl.FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 208 ); 209 } 210 211 // "Depth and stencil attachments, if present, are the same image." 212 if (attPoint == gl.DEPTH_ATTACHMENT || attPoint == gl.STENCIL_ATTACHMENT) { 213 if (this.m_depthStencilImage == 0) { 214 this.m_depthStencilImage = att.imageName; 215 this.m_depthStencilType = glsFboUtil.attachmentType(att); 216 217 } else { 218 this.addFBOStatus( 219 this.m_depthStencilImage == att.imageName && this.m_depthStencilType == glsFboUtil.attachmentType(att), 220 gl.FRAMEBUFFER_UNSUPPORTED 221 ); 222 } 223 } 224 225 }; 226 227 /** 228 * @typedef {{textureKind: number, numLayers: number, attachmentLayer: number}} 229 */ 230 es3fFboCompletenessTests.numLayersParamsT; 231 232 /** 233 * @param {number} textureKind 234 * @param {number} numLayers 235 * @param {number} attachmentLayer 236 * @return {es3fFboCompletenessTests.numLayersParamsT} 237 */ 238 es3fFboCompletenessTests.numLayersParams = function(textureKind, numLayers, attachmentLayer) { 239 if (typeof(attachmentLayer) == 'undefined') { 240 textureKind = 0; 241 numLayers = 0; 242 attachmentLayer = 0; 243 } 244 return { 245 textureKind: textureKind, //< gl.TEXTURE_3D or gl.TEXTURE_2D_ARRAY 246 numLayers: numLayers, //< Number of layers in texture 247 attachmentLayer: attachmentLayer //< Layer referenced by attachment 248 }; 249 }; 250 251 /** 252 * es3fFboCompletenessTests.numLayersParams.getName 253 * @param {es3fFboCompletenessTests.numLayersParamsT} params 254 * @return {string} 255 */ 256 es3fFboCompletenessTests.numLayersParams.getName = function(params) { 257 return ( 258 (params.textureKind == gl.TEXTURE_3D ? '3d' : '2darr') + '_' + 259 params.numLayers + '_' + 260 params.attachmentLayer 261 ); 262 }; 263 /** 264 * es3fFboCompletenessTests.numLayersParams.getDescription 265 * @param {es3fFboCompletenessTests.numLayersParamsT} params 266 * @return {string} 267 */ 268 es3fFboCompletenessTests.numLayersParams.getDescription = function(params) { 269 return ( 270 (params.textureKind == gl.TEXTURE_3D ? '3D Texture' : '2D Array Texture') + ', ' + 271 params.numLayers + ' layers, ' + 272 'attached layer ' + params.attachmentLayer + '.' 273 ); 274 }; 275 276 // string, string, glsFboCompleteness::context, params. 277 /** 278 * @constructor 279 * @extends {glsFboCompletenessTests.TestBase} 280 * @param {string} name 281 * @param {string} desc 282 * @param {glsFboCompletenessTests.Context} ctx 283 * @param {es3fFboCompletenessTests.numLayersParamsT} params 284 */ 285 es3fFboCompletenessTests.NumLayersTest = function(name, desc, ctx, params) { 286 glsFboCompletenessTests.TestBase.call(this, name, desc, params); 287 this.m_ctx = ctx; 288 }; 289 290 es3fFboCompletenessTests.NumLayersTest.prototype = Object.create(glsFboCompletenessTests.TestBase.prototype); 291 es3fFboCompletenessTests.NumLayersTest.prototype.constructor = es3fFboCompletenessTests.NumLayersTest; 292 293 es3fFboCompletenessTests.NumLayersTest.prototype.build = function(builder, gl) { 294 295 if (!(gl = gl || window.gl)) throw new Error('Invalid gl object'); 296 297 var target = gl.COLOR_ATTACHMENT0; 298 var texCfg = builder.makeConfig( 299 function(kind) { 300 switch (kind) { 301 case gl.TEXTURE_3D: return glsFboUtil.Texture3D; 302 case gl.TEXTURE_2D_ARRAY: return glsFboUtil.Texture2DArray; 303 default: throw new Error('Impossible case'); 304 } 305 }(this.m_params.textureKind) 306 ); 307 308 texCfg.internalFormat = this.getDefaultFormat(target, gl.TEXTURE, gl); 309 texCfg.width = 64; 310 texCfg.height = 64; 311 texCfg.numLayers = this.m_params.numLayers; 312 var tex = builder.glCreateTexture(texCfg); 313 314 var att = builder.makeConfig(glsFboUtil.TextureLayerAttachment); 315 att.layer = this.m_params.attachmentLayer; 316 att.imageName = tex; 317 318 builder.glAttach(target, att); 319 320 // return tcuTestCase.IterateResult.STOP; 321 }; 322 //es3fFboCompletenessTests.NumLayersTest.prototype.isExecutable = function() { 323 // return false; 324 //}; 325 326 /** 327 * @enum 328 */ 329 es3fFboCompletenessTests.e_samples = { 330 NONE: -2, 331 TEXTURE: -1 332 }; 333 334 /** 335 * @typedef {{numSamples: Array<number>}} 336 */ 337 es3fFboCompletenessTests.numSamplesParamsT; 338 339 /** 340 * @param {number} colour 341 * @param {number} depth 342 * @param {number} stencil 343 * @return {es3fFboCompletenessTests.numSamplesParamsT} 344 */ 345 es3fFboCompletenessTests.numSamplesParams = function(colour, depth, stencil) { 346 var ret = { 347 numSamples: new Array(3) 348 }; 349 if (colour !== undefined) { 350 ret.numSamples[0] = colour; 351 if (depth !== undefined) { 352 ret.numSamples[1] = depth; 353 if (stencil !== undefined) { 354 ret.numSamples[2] = stencil; 355 } 356 } 357 } 358 return ret; 359 }; 360 361 /** 362 * @param {es3fFboCompletenessTests.numSamplesParamsT} params 363 * @return {string} 364 */ 365 es3fFboCompletenessTests.numSamplesParams.getName = function(params) { 366 var out = ''; 367 368 var first = true; 369 for (var i = 0; i < 3; ++i) { 370 if (first) 371 first = false; 372 else 373 out += '_'; 374 375 switch (params.numSamples[i]) { 376 case es3fFboCompletenessTests.e_samples.NONE: out += 'none'; break; 377 case es3fFboCompletenessTests.e_samples.TEXTURE: out += 'tex'; break; 378 default: out += 'rbo'; break; 379 } 380 } 381 return out; 382 }; 383 /** 384 * @param {es3fFboCompletenessTests.numSamplesParamsT} params 385 * @return {string} 386 */ 387 es3fFboCompletenessTests.numSamplesParams.getDescription = function(params) { 388 var out = ''; 389 var names = ['color', 'depth', 'stencil']; 390 var first = true; 391 392 for (var i = 0; i < 3; ++i) { 393 if (first) 394 first = false; 395 else 396 out += ', '; 397 398 if (params.numSamples[i] == es3fFboCompletenessTests.e_samples.TEXTURE) { 399 out += 'texture ' + names[i] + ' attachment'; 400 } else { 401 out += params.numSamples[i] + '-sample renderbuffer ' + names[i] + ' attachment'; 402 } 403 } 404 return out; 405 }; 406 407 /** 408 * @constructor 409 * @extends {glsFboCompletenessTests.TestBase} 410 * @param {string} name 411 * @param {string} desc 412 * @param {glsFboCompletenessTests.Context} ctx 413 * @param {es3fFboCompletenessTests.numSamplesParamsT} params 414 */ 415 es3fFboCompletenessTests.NumSamplesTest = function(name, desc, ctx, params) { 416 glsFboCompletenessTests.TestBase.call(this, name, desc, params); 417 this.m_ctx = ctx; 418 }; 419 es3fFboCompletenessTests.NumSamplesTest.prototype = Object.create(glsFboCompletenessTests.TestBase.prototype); 420 es3fFboCompletenessTests.NumSamplesTest.prototype.constructor = es3fFboCompletenessTests.NumSamplesTest; 421 422 es3fFboCompletenessTests.NumSamplesTest.prototype.build = function(builder, gl) { 423 if (!(gl = gl || window.gl)) throw new Error('Invalid gl object'); 424 425 var s_targets = [ 426 gl.COLOR_ATTACHMENT0, gl.COLOR_ATTACHMENT1, gl.DEPTH_ATTACHMENT 427 ]; 428 // Non-integer formats for each attachment type. 429 // \todo [2013-12-17 lauri] Add fixed/floating/integer metadata for formats so 430 // we can pick one smartly or maybe try several. 431 var s_formats = [ 432 gl.RGBA8, gl.RGB565, gl.DEPTH_COMPONENT24 433 ]; 434 435 var l = s_targets.length; 436 if (this.m_params.numSamples.length != l) 437 throw new Error('Wrong number of params.'); 438 439 for (var i = 0; i < l; ++i) { 440 var target = s_targets[i]; 441 var fmt = new glsFboUtil.ImageFormat(s_formats[i], gl.NONE); 442 443 var ns = this.m_params.numSamples[i]; 444 if (ns == es3fFboCompletenessTests.e_samples.NONE) 445 continue; 446 if (ns == es3fFboCompletenessTests.e_samples.TEXTURE) { 447 this.attachTargetToNew(target, gl.TEXTURE, fmt, 64, 64, builder, gl); 448 } else { 449 var rboCfg = builder.makeConfig(glsFboUtil.Renderbuffer); 450 rboCfg.internalFormat = fmt; 451 rboCfg.width = rboCfg.height = 64; 452 rboCfg.numSamples = ns; 453 454 var rbo = builder.glCreateRbo(rboCfg); 455 // Implementations do not necessarily support sample sizes greater than 1. 456 if (builder.getError() == gl.INVALID_OPERATION) { 457 throw new Error('Unsupported number of samples.'); 458 } 459 var att = builder.makeConfig(glsFboUtil.RenderbufferAttachment); 460 att.imageName = rbo; 461 builder.glAttach(target, att); 462 } 463 } 464 465 return true; 466 }; 467 468 es3fFboCompletenessTests.init = function() { 469 470 //(testCtx, renderCtx, factory) { 471 var fboCtx = new glsFboCompletenessTests.Context(null, gl, function() { 472 return new es3fFboCompletenessTests.ES3Checker(); 473 }); 474 475 fboCtx.addFormats(glsFboUtil.rangeArray(es3fFboCompletenessTests.s_es3Formats)); 476 477 /** @const @type {tcuTestCase.DeqpTest} */ 478 var testGroup = tcuTestCase.runner.testCases; 479 480 testGroup.addChild(fboCtx.createRenderableTests(gl)); 481 testGroup.addChild(fboCtx.createAttachmentTests(gl)); 482 testGroup.addChild(fboCtx.createSizeTests(gl)); 483 484 /** @type {tcuTestCase.DeqpTest} */ 485 var layerTests = tcuTestCase.newTest('layer', 'Tests for layer attachments'); 486 487 /** @static */ 488 var s_layersParams = [ 489 es3fFboCompletenessTests.numLayersParams(gl.TEXTURE_2D_ARRAY, 1, 0), 490 es3fFboCompletenessTests.numLayersParams(gl.TEXTURE_2D_ARRAY, 1, 3), 491 es3fFboCompletenessTests.numLayersParams(gl.TEXTURE_2D_ARRAY, 4, 3), 492 es3fFboCompletenessTests.numLayersParams(gl.TEXTURE_2D_ARRAY, 4, 15), 493 es3fFboCompletenessTests.numLayersParams(gl.TEXTURE_3D, 1, 0), 494 es3fFboCompletenessTests.numLayersParams(gl.TEXTURE_3D, 1, 15), 495 es3fFboCompletenessTests.numLayersParams(gl.TEXTURE_3D, 4, 15), 496 es3fFboCompletenessTests.numLayersParams(gl.TEXTURE_3D, 64, 15) 497 ]; 498 499 for (var i = 0; i < s_layersParams.length; ++i) { 500 var name = 'name'; 501 var desc = 'desc'; 502 layerTests.addChild(new es3fFboCompletenessTests.NumLayersTest( 503 es3fFboCompletenessTests.numLayersParams.getName(s_layersParams[i]), 504 es3fFboCompletenessTests.numLayersParams.getDescription(s_layersParams[i]), 505 fboCtx, s_layersParams[i] 506 )); 507 } 508 testGroup.addChild(layerTests); 509 510 /** @type {tcuTestCase.DeqpTest} */ 511 var sampleTests = tcuTestCase.newTest('sample', 'Tests for multisample attachments'); 512 // some short hand 513 var samples = es3fFboCompletenessTests.e_samples; 514 // sample tests 515 /** @static */ 516 var s_samplesParams = [ 517 es3fFboCompletenessTests.numSamplesParams(0, samples.NONE, samples.NONE), 518 es3fFboCompletenessTests.numSamplesParams(1, samples.NONE, samples.NONE), 519 es3fFboCompletenessTests.numSamplesParams(2, samples.NONE, samples.NONE), 520 es3fFboCompletenessTests.numSamplesParams(0, samples.TEXTURE, samples.NONE), 521 es3fFboCompletenessTests.numSamplesParams(1, samples.TEXTURE, samples.NONE), 522 es3fFboCompletenessTests.numSamplesParams(2, samples.TEXTURE, samples.NONE), 523 es3fFboCompletenessTests.numSamplesParams(2, 1, samples.NONE), 524 es3fFboCompletenessTests.numSamplesParams(2, 2, samples.NONE), 525 es3fFboCompletenessTests.numSamplesParams(0, 0, samples.TEXTURE), 526 es3fFboCompletenessTests.numSamplesParams(1, 2, 0), 527 es3fFboCompletenessTests.numSamplesParams(2, 2, 0), 528 es3fFboCompletenessTests.numSamplesParams(1, 1, 1), 529 es3fFboCompletenessTests.numSamplesParams(1, 2, 4) 530 ]; 531 532 for (var i = 0; i < s_samplesParams.length; ++i) { 533 var name = 'name'; 534 var desc = 'desc'; 535 sampleTests.addChild(new es3fFboCompletenessTests.NumSamplesTest( 536 es3fFboCompletenessTests.numSamplesParams.getName(s_samplesParams[i]), 537 es3fFboCompletenessTests.numSamplesParams.getDescription(s_samplesParams[i]), 538 fboCtx, s_samplesParams[i] 539 )); 540 } 541 testGroup.addChild(sampleTests); 542 543 }; 544 545 es3fFboCompletenessTests.run = function() { 546 var testName = 'completeness'; 547 var testDescription = 'Completeness tests'; 548 var state = tcuTestCase.runner; 549 550 state.testName = testName; 551 state.testCases = tcuTestCase.newTest(testName, testDescription, null); 552 553 //Set up name and description of this test series. 554 setCurrentTestName(testName); 555 description(testDescription); 556 try { 557 es3fFboCompletenessTests.init(); 558 tcuTestCase.runner.runCallback(tcuTestCase.runTestCases); 559 } catch (err) { 560 bufferedLogToConsole(err); 561 tcuTestCase.runner.terminate(); 562 } 563 564 }; 565 566 });