tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 });