tor-browser

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

es3fFboStateQueryTests.js (33310B)


      1 /*-------------------------------------------------------------------------
      2 * drawElements Quality Program OpenGL ES Utilities
      3 * ------------------------------------------------
      4 *
      5 * Copyright 2014 The Android Open Source Project
      6 *
      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
     10 *
     11 *      http://www.apache.org/licenses/LICENSE-2.0
     12 *
     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.
     18 *
     19 */
     20 
     21 'use strict';
     22 goog.provide('functional.gles3.es3fFboStateQueryTests');
     23 goog.require('framework.common.tcuTestCase');
     24 goog.require('functional.gles3.es3fApiCase');
     25 goog.require('modules.shared.glsStateQuery');
     26 
     27 goog.scope(function() {
     28 var es3fFboStateQueryTests = functional.gles3.es3fFboStateQueryTests;
     29 var tcuTestCase = framework.common.tcuTestCase;
     30 var glsStateQuery = modules.shared.glsStateQuery;
     31 var es3fApiCase = functional.gles3.es3fApiCase;
     32 
     33 var setParentClass = function(child, parent) {
     34    child.prototype = Object.create(parent.prototype);
     35    child.prototype.constructor = child;
     36 };
     37 
     38 // WebGL bit depths
     39 es3fFboStateQueryTests.colorBits = [8, 8, 8, 8];
     40 es3fFboStateQueryTests.depthBits = 0;
     41 es3fFboStateQueryTests.stencilBits = 0;
     42 
     43 /**
     44 * @constructor
     45 * @extends {es3fApiCase.ApiCase}
     46 * @param {string} name
     47 * @param {string} description
     48 * @param {number} framebufferTarget
     49 */
     50 es3fFboStateQueryTests.DefaultFramebufferCase = function(name, description, framebufferTarget) {
     51    es3fApiCase.ApiCase.call(this, name, description, gl);
     52    this.m_framebufferTarget = framebufferTarget;
     53 };
     54 
     55 setParentClass(es3fFboStateQueryTests.DefaultFramebufferCase, es3fApiCase.ApiCase);
     56 
     57 es3fFboStateQueryTests.DefaultFramebufferCase.prototype.test = function() {
     58    var hasColorBuffer = es3fFboStateQueryTests.colorBits[0] > 0 ||
     59                            es3fFboStateQueryTests.colorBits[1] > 0 ||
     60                            es3fFboStateQueryTests.colorBits[2] > 0 ||
     61                            es3fFboStateQueryTests.colorBits[3] > 0;
     62    var attachments = [
     63        gl.BACK,
     64        gl.DEPTH,
     65        gl.STENCIL
     66    ];
     67    var attachmentExists = [
     68        hasColorBuffer,
     69        es3fFboStateQueryTests.depthBits > 0,
     70        es3fFboStateQueryTests.stencilBits > 0
     71    ];
     72 
     73    for (var ndx = 0; ndx < attachments.length; ++ndx) {
     74        var objType = gl.getFramebufferAttachmentParameter(this.m_framebufferTarget, attachments[ndx], gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE);
     75        if (attachmentExists[ndx]) {
     76            this.check(objType === gl.FRAMEBUFFER_DEFAULT);
     77        } else {
     78            // \note [jarkko] FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE "identifes the type of object which contains the attached image". However, it
     79            // is unclear if an object of type FRAMEBUFFER_DEFAULT can contain a null image (or a 0-bits-per-pixel image). Accept both
     80            // FRAMEBUFFER_DEFAULT and NONE as valid results in these cases.
     81            this.check(objType === gl.FRAMEBUFFER_DEFAULT || objType === gl.NONE);
     82        }
     83    }
     84 };
     85 
     86 /**
     87 * @constructor
     88 * @extends {es3fApiCase.ApiCase}
     89 * @param {string} name
     90 * @param {string} description
     91 */
     92 es3fFboStateQueryTests.AttachmentObjectCase = function(name, description) {
     93    es3fApiCase.ApiCase.call(this, name, description, gl);
     94 };
     95 
     96 setParentClass(es3fFboStateQueryTests.AttachmentObjectCase, es3fApiCase.ApiCase);
     97 
     98 es3fFboStateQueryTests.AttachmentObjectCase.prototype.test = function() {
     99    var framebufferID = gl.createFramebuffer();
    100    gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
    101 
    102    // initial
    103    this.check(glsStateQuery.verifyAttachment(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, gl.NONE));
    104    this.check(glsStateQuery.verifyAttachment(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, null));
    105 
    106    // texture
    107    var textureID = gl.createTexture();
    108    gl.bindTexture(gl.TEXTURE_2D, textureID);
    109    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, 128, 128, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    110 
    111    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureID, 0);
    112 
    113    this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, gl.TEXTURE));
    114    this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, textureID));
    115 
    116    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
    117 
    118    // rb
    119    var renderbufferID = gl.createRenderbuffer();
    120    gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
    121    gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGB8, 128, 128);
    122 
    123    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbufferID);
    124 
    125    this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, gl.RENDERBUFFER));
    126    this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, renderbufferID));
    127 
    128    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
    129    gl.deleteRenderbuffer(renderbufferID);
    130 
    131    gl.deleteFramebuffer(framebufferID);
    132 };
    133 
    134 /**
    135 * @constructor
    136 * @extends {es3fApiCase.ApiCase}
    137 * @param {string} name
    138 * @param {string} description
    139 */
    140 es3fFboStateQueryTests.AttachmentTextureLevelCase = function(name, description) {
    141    es3fApiCase.ApiCase.call(this, name, description, gl);
    142 };
    143 
    144 setParentClass(es3fFboStateQueryTests.AttachmentTextureLevelCase, es3fApiCase.ApiCase);
    145 
    146 es3fFboStateQueryTests.AttachmentTextureLevelCase.prototype.test = function() {
    147    var framebufferID = gl.createFramebuffer();
    148    gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
    149    for (var mipmapLevel = 0; mipmapLevel < 7; ++mipmapLevel) {
    150        var textureID = gl.createTexture();
    151        gl.bindTexture(gl.TEXTURE_2D, textureID);
    152        gl.texStorage2D(gl.TEXTURE_2D, 7, gl.RGB8, 128, 128);
    153 
    154        gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureID, mipmapLevel);
    155 
    156        this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, mipmapLevel));
    157 
    158        gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
    159        gl.deleteTexture(textureID);
    160    }
    161    gl.deleteFramebuffer(framebufferID);
    162 };
    163 
    164 /**
    165 * @constructor
    166 * @extends {es3fApiCase.ApiCase}
    167 * @param {string} name
    168 * @param {string} description
    169 */
    170 es3fFboStateQueryTests.AttachmentTextureCubeMapFaceCase = function(name, description) {
    171    es3fApiCase.ApiCase.call(this, name, description, gl);
    172 };
    173 
    174 setParentClass(es3fFboStateQueryTests.AttachmentTextureCubeMapFaceCase, es3fApiCase.ApiCase);
    175 
    176 es3fFboStateQueryTests.AttachmentTextureCubeMapFaceCase.prototype.test = function() {
    177    var framebufferID = gl.createFramebuffer();
    178    gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
    179    var textureID = gl.createTexture();
    180    gl.bindTexture(gl.TEXTURE_CUBE_MAP, textureID);
    181 
    182    gl.texStorage2D(gl.TEXTURE_CUBE_MAP, 1, gl.RGB8, 128, 128);
    183 
    184    var faces = [
    185        gl.TEXTURE_CUBE_MAP_POSITIVE_X, gl.TEXTURE_CUBE_MAP_NEGATIVE_X,
    186        gl.TEXTURE_CUBE_MAP_POSITIVE_Y, gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,
    187        gl.TEXTURE_CUBE_MAP_POSITIVE_Z, gl.TEXTURE_CUBE_MAP_NEGATIVE_Z
    188    ];
    189 
    190    for (var ndx = 0; ndx < faces.length; ++ndx) {
    191        gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, faces[ndx], textureID, 0);
    192        this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, faces[ndx]));
    193    }
    194 
    195    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
    196    gl.deleteTexture(textureID);
    197    gl.deleteFramebuffer(framebufferID);
    198 };
    199 
    200 /**
    201 * @constructor
    202 * @extends {es3fApiCase.ApiCase}
    203 * @param {string} name
    204 * @param {string} description
    205 */
    206 es3fFboStateQueryTests.AttachmentTextureLayerCase = function(name, description) {
    207    es3fApiCase.ApiCase.call(this, name, description, gl);
    208 };
    209 
    210 setParentClass(es3fFboStateQueryTests.AttachmentTextureLayerCase, es3fApiCase.ApiCase);
    211 
    212 es3fFboStateQueryTests.AttachmentTextureLayerCase.prototype.test = function() {
    213    var framebufferID = gl.createFramebuffer();
    214    gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
    215    // tex3d
    216    var textureID = gl.createTexture();
    217    gl.bindTexture(gl.TEXTURE_3D, textureID);
    218    gl.texStorage3D(gl.TEXTURE_3D, 1, gl.RGBA8, 16, 16, 16);
    219 
    220    for (var layer = 0; layer < 16; ++layer) {
    221        gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureID, 0, layer);
    222        this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, layer));
    223    }
    224 
    225    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
    226    gl.deleteTexture(textureID);
    227    // tex2d array
    228    textureID = gl.createTexture();
    229    gl.bindTexture(gl.TEXTURE_2D_ARRAY, textureID);
    230    gl.texStorage3D(gl.TEXTURE_2D_ARRAY, 1, gl.RGBA8, 16, 16, 16);
    231 
    232    for (var layer = 0; layer < 16; ++layer) {
    233        gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureID, 0, layer);
    234        this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, layer));
    235    }
    236 
    237    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
    238    gl.deleteTexture(textureID);
    239    gl.deleteFramebuffer(framebufferID);
    240 };
    241 
    242 /**
    243 * @constructor
    244 * @extends {es3fApiCase.ApiCase}
    245 * @param {string} name
    246 * @param {string} description
    247 */
    248 es3fFboStateQueryTests.AttachmentTextureColorCodingCase = function(name, description) {
    249    es3fApiCase.ApiCase.call(this, name, description, gl);
    250 };
    251 
    252 setParentClass(es3fFboStateQueryTests.AttachmentTextureColorCodingCase, es3fApiCase.ApiCase);
    253 
    254 es3fFboStateQueryTests.AttachmentTextureColorCodingCase.prototype.test = function() {
    255    var framebufferID = gl.createFramebuffer();
    256    gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
    257    // rgb8 color
    258    var renderbufferID = gl.createRenderbuffer();
    259    gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
    260    gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGB8, 128, 128);
    261 
    262    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbufferID);
    263 
    264    this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, gl.LINEAR));
    265 
    266    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
    267    gl.deleteRenderbuffer(renderbufferID);
    268 
    269    // srgb8_alpha8 color
    270    renderbufferID = gl.createRenderbuffer();
    271    gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
    272    gl.renderbufferStorage(gl.RENDERBUFFER, gl.SRGB8_ALPHA8, 128, 128);
    273 
    274    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbufferID);
    275 
    276    this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, gl.SRGB));
    277 
    278    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
    279    gl.deleteRenderbuffer(renderbufferID);
    280 
    281    // depth
    282    renderbufferID = gl.createRenderbuffer();
    283    gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
    284    gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, 128, 128);
    285 
    286    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, renderbufferID);
    287 
    288    this.check(glsStateQuery.verifyAttachment(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, gl.LINEAR));
    289 
    290    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
    291    gl.deleteRenderbuffer(renderbufferID);
    292    gl.deleteFramebuffer(framebufferID);
    293 };
    294 
    295 /**
    296 * @constructor
    297 * @extends {es3fApiCase.ApiCase}
    298 * @param {string} name
    299 * @param {string} description
    300 */
    301 es3fFboStateQueryTests.AttachmentTextureComponentTypeCase = function(name, description) {
    302    es3fApiCase.ApiCase.call(this, name, description, gl);
    303 };
    304 
    305 setParentClass(es3fFboStateQueryTests.AttachmentTextureComponentTypeCase, es3fApiCase.ApiCase);
    306 
    307 es3fFboStateQueryTests.AttachmentTextureComponentTypeCase.prototype.test = function() {
    308    var framebufferID = gl.createFramebuffer();
    309    gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
    310    // color-renderable required texture formats
    311    var requiredColorformats = [
    312        [gl.R8, gl.UNSIGNED_NORMALIZED],
    313        [gl.RG8, gl.UNSIGNED_NORMALIZED],
    314        [gl.RGB8, gl.UNSIGNED_NORMALIZED],
    315        [gl.RGB565, gl.UNSIGNED_NORMALIZED],
    316        [gl.RGBA4, gl.UNSIGNED_NORMALIZED],
    317        [gl.RGB5_A1, gl.UNSIGNED_NORMALIZED],
    318        [gl.RGBA8, gl.UNSIGNED_NORMALIZED],
    319        [gl.RGB10_A2, gl.UNSIGNED_NORMALIZED],
    320        [gl.RGB10_A2UI, gl.UNSIGNED_INT],
    321        [gl.SRGB8_ALPHA8, gl.UNSIGNED_NORMALIZED],
    322        [gl.R8I, gl.INT],
    323        [gl.R8UI, gl.UNSIGNED_INT],
    324        [gl.R16I, gl.INT],
    325        [gl.R16UI, gl.UNSIGNED_INT],
    326        [gl.R32I, gl.INT],
    327        [gl.R32UI, gl.UNSIGNED_INT],
    328        [gl.RG8I, gl.INT],
    329        [gl.RG8UI, gl.UNSIGNED_INT],
    330        [gl.RG16I, gl.INT],
    331        [gl.RG16UI, gl.UNSIGNED_INT],
    332        [gl.RG32I, gl.INT],
    333        [gl.RG32UI, gl.UNSIGNED_INT],
    334        [gl.RGBA8I, gl.INT],
    335        [gl.RGBA8UI, gl.UNSIGNED_INT],
    336        [gl.RGBA16I, gl.INT],
    337        [gl.RGBA16UI, gl.UNSIGNED_INT],
    338        [gl.RGBA32I, gl.INT],
    339        [gl.RGBA32UI, gl.UNSIGNED_INT]
    340    ];
    341 
    342    for (var ndx = 0; ndx < requiredColorformats.length; ++ndx) {
    343        var colorFormat = requiredColorformats[ndx][0];
    344        var componentType = requiredColorformats[ndx][1];
    345 
    346        var textureID = gl.createTexture();
    347        gl.bindTexture(gl.TEXTURE_2D, textureID);
    348        gl.texStorage2D(gl.TEXTURE_2D, 1, colorFormat, 128, 128);
    349 
    350        gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureID, 0);
    351 
    352        this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE, componentType));
    353 
    354        gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
    355        gl.deleteTexture(textureID);
    356    }
    357    gl.deleteFramebuffer(framebufferID);
    358 };
    359 
    360 /**
    361 * @constructor
    362 * @extends {es3fApiCase.ApiCase}
    363 * @param {string} name
    364 * @param {string} description
    365 */
    366 es3fFboStateQueryTests.AttachmentSizeInitialCase = function(name, description) {
    367    es3fApiCase.ApiCase.call(this, name, description, gl);
    368 };
    369 
    370 setParentClass(es3fFboStateQueryTests.AttachmentSizeInitialCase, es3fApiCase.ApiCase);
    371 
    372 es3fFboStateQueryTests.AttachmentSizeInitialCase.prototype.attachmentExists = function(attachment) {
    373    var objType = gl.getFramebufferAttachmentParameter(gl.FRAMEBUFFER, attachment, gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE);
    374    return objType !== gl.NONE;
    375 };
    376 
    377 /**
    378 * @this {es3fApiCase.ApiCase}
    379 */
    380 var checkAttachmentComponentSizeAtLeast = function(target, attachment, r, g, b, a, d, s) {
    381    var referenceSizes = [r, g, b, a, d, s];
    382    var paramNames = [
    383        gl.FRAMEBUFFER_ATTACHMENT_RED_SIZE, gl.FRAMEBUFFER_ATTACHMENT_GREEN_SIZE,
    384        gl.FRAMEBUFFER_ATTACHMENT_BLUE_SIZE, gl.FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE,
    385        gl.FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE, gl.FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE
    386    ];
    387 
    388    for (var ndx = 0; ndx < referenceSizes.length; ++ndx) {
    389        if (referenceSizes[ndx] == -1)
    390            continue;
    391 
    392        var value = /** @type {number} */ (gl.getFramebufferAttachmentParameter(target, attachment, paramNames[ndx]));
    393 
    394        this.check(value >= referenceSizes[ndx], 'Expected greater or equal to ' + referenceSizes[ndx] + ' got ' + value);
    395    }
    396 };
    397 
    398 /**
    399 * @this {es3fApiCase.ApiCase}
    400 */
    401 var checkAttachmentComponentSizeExactly = function(target, attachment, r, g, b, a, d, s) {
    402    var referenceSizes = [r, g, b, a, d, s];
    403    var paramNames = [
    404        gl.FRAMEBUFFER_ATTACHMENT_RED_SIZE, gl.FRAMEBUFFER_ATTACHMENT_GREEN_SIZE,
    405        gl.FRAMEBUFFER_ATTACHMENT_BLUE_SIZE, gl.FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE,
    406        gl.FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE, gl.FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE
    407    ];
    408 
    409    for (var ndx = 0; ndx < referenceSizes.length; ++ndx) {
    410        if (referenceSizes[ndx] == -1)
    411            continue;
    412 
    413        var value = gl.getFramebufferAttachmentParameter(target, attachment, paramNames[ndx]);
    414 
    415        this.check(value == referenceSizes[ndx], 'Expected equal to ' + referenceSizes[ndx] + ' got ' + value);
    416    }
    417 };
    418 
    419 es3fFboStateQueryTests.AttachmentSizeInitialCase.prototype.test = function() {
    420    // check default
    421    if (this.attachmentExists(gl.BACK)) {
    422        checkAttachmentComponentSizeAtLeast.bind(this,
    423            gl.FRAMEBUFFER,
    424            gl.BACK,
    425            es3fFboStateQueryTests.colorBits[0],
    426            es3fFboStateQueryTests.colorBits[1],
    427            es3fFboStateQueryTests.colorBits[2],
    428            es3fFboStateQueryTests.colorBits[3],
    429            -1,
    430            -1);
    431    }
    432 
    433    if (this.attachmentExists(gl.DEPTH)) {
    434        checkAttachmentComponentSizeAtLeast.bind(this,
    435            gl.FRAMEBUFFER,
    436            gl.DEPTH,
    437            -1,
    438            -1,
    439            -1,
    440            -1,
    441            es3fFboStateQueryTests.depthBits,
    442            -1);
    443    }
    444 
    445    if (this.attachmentExists(gl.STENCIL)) {
    446        checkAttachmentComponentSizeAtLeast.bind(this,
    447            gl.FRAMEBUFFER,
    448            gl.STENCIL,
    449            -1,
    450            -1,
    451            -1,
    452            -1,
    453            -1,
    454            es3fFboStateQueryTests.stencilBits);
    455    }
    456 };
    457 
    458 /**
    459 * @constructor
    460 * @extends {es3fApiCase.ApiCase}
    461 * @param {string} name
    462 * @param {string} description
    463 */
    464 es3fFboStateQueryTests.AttachmentSizeCase = function(name, description) {
    465    es3fApiCase.ApiCase.call(this, name, description, gl);
    466 };
    467 
    468 setParentClass(es3fFboStateQueryTests.AttachmentSizeCase, es3fApiCase.ApiCase);
    469 
    470 es3fFboStateQueryTests.AttachmentSizeCase.prototype.test = function() {
    471    var framebufferID = gl.createFramebuffer();
    472    gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
    473    // check some color targets
    474 
    475    var colorAttachments = [
    476        //format, red, green, blue, alpha
    477        [gl.RGBA8, 8, 8, 8, 8],
    478        [gl.RGB565, 5, 6, 5, 0],
    479        [gl.RGBA4, 4, 4, 4, 4],
    480        [gl.RGB5_A1, 5, 5, 5, 1],
    481        [gl.RGBA8I, 8, 8, 8, 8],
    482        [gl.RG32UI, 32, 32, 0, 0]
    483    ];
    484    for (var ndx = 0; ndx < colorAttachments.length; ++ndx)
    485        this.testColorAttachment(colorAttachments[ndx][0], gl.COLOR_ATTACHMENT0, colorAttachments[ndx][1], colorAttachments[ndx][2], colorAttachments[ndx][3], colorAttachments[ndx][4]);
    486 
    487    // check some depth targets
    488 
    489    var depthAttachments = [
    490        // format, attachment, depth, stencil
    491        [gl.DEPTH_COMPONENT16, gl.DEPTH_ATTACHMENT, 16, 0],
    492        [gl.DEPTH_COMPONENT24, gl.DEPTH_ATTACHMENT, 24, 0],
    493        [gl.DEPTH_COMPONENT32F, gl.DEPTH_ATTACHMENT, 32, 0],
    494        [gl.DEPTH24_STENCIL8, gl.DEPTH_STENCIL_ATTACHMENT, 24, 8],
    495        [gl.DEPTH32F_STENCIL8, gl.DEPTH_STENCIL_ATTACHMENT, 32, 8]
    496    ];
    497    for (var ndx = 0; ndx < depthAttachments.length; ++ndx)
    498        this.testDepthAttachment(depthAttachments[ndx][0], depthAttachments[ndx][1], depthAttachments[ndx][2], depthAttachments[ndx][3]);
    499    gl.deleteFramebuffer(framebufferID);
    500 };
    501 
    502 /**
    503 * @constructor
    504 * @extends {es3fFboStateQueryTests.AttachmentSizeCase}
    505 * @param {string} name
    506 * @param {string} description
    507 */
    508 es3fFboStateQueryTests.AttachmentSizeRboCase = function(name, description) {
    509    es3fFboStateQueryTests.AttachmentSizeCase.call(this, name, description);
    510 };
    511 
    512 setParentClass(es3fFboStateQueryTests.AttachmentSizeRboCase, es3fFboStateQueryTests.AttachmentSizeCase);
    513 
    514 es3fFboStateQueryTests.AttachmentSizeRboCase.prototype.testColorAttachment = function(internalFormat, attachment, r, g, b, a) {
    515    var renderbufferID = gl.createRenderbuffer();
    516    gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
    517    gl.renderbufferStorage(gl.RENDERBUFFER, internalFormat, 128, 128);
    518 
    519    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, renderbufferID);
    520 
    521    checkAttachmentComponentSizeAtLeast.bind(this, gl.FRAMEBUFFER, attachment, r, g, b, a, -1, -1);
    522    checkAttachmentComponentSizeExactly.bind(this, gl.FRAMEBUFFER, attachment, -1, -1, -1, -1, 0, 0);
    523 
    524    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, null);
    525    gl.deleteRenderbuffer(renderbufferID);
    526 };
    527 
    528 es3fFboStateQueryTests.AttachmentSizeRboCase.prototype.testDepthAttachment = function(internalFormat, attachment, depth, stencil) {
    529    var renderbufferID = gl.createRenderbuffer();
    530    gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
    531    gl.renderbufferStorage(gl.RENDERBUFFER, internalFormat, 128, 128);
    532 
    533    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, renderbufferID);
    534 
    535    checkAttachmentComponentSizeAtLeast.bind(this, gl.FRAMEBUFFER, attachment, -1, -1, -1, -1, depth, stencil);
    536    checkAttachmentComponentSizeExactly.bind(this, gl.FRAMEBUFFER, attachment, 0, 0, 0, 0, -1, -1);
    537 
    538    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, null);
    539    gl.deleteRenderbuffer(renderbufferID);
    540 };
    541 
    542 /**
    543 * @constructor
    544 * @extends {es3fFboStateQueryTests.AttachmentSizeCase}
    545 * @param {string} name
    546 * @param {string} description
    547 */
    548 es3fFboStateQueryTests.AttachmentSizeTextureCase = function(name, description) {
    549    es3fFboStateQueryTests.AttachmentSizeCase.call(this, name, description);
    550 };
    551 
    552 setParentClass(es3fFboStateQueryTests.AttachmentSizeTextureCase, es3fFboStateQueryTests.AttachmentSizeCase);
    553 
    554 es3fFboStateQueryTests.AttachmentSizeTextureCase.prototype.testColorAttachment = function(internalFormat, attachment, r, g, b, a) {
    555    var textureID = gl.createTexture();
    556    gl.bindTexture(gl.TEXTURE_2D, textureID);
    557    gl.texStorage2D(gl.TEXTURE_2D, 1, internalFormat, 128, 128);
    558 
    559    gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureID, 0);
    560 
    561    checkAttachmentComponentSizeAtLeast.bind(this, gl.FRAMEBUFFER, attachment, r, g, b, a, -1, -1);
    562    checkAttachmentComponentSizeExactly.bind(this, gl.FRAMEBUFFER, attachment, -1, -1, -1, -1, 0, 0);
    563 
    564    gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, null, 0);
    565    gl.deleteTexture(textureID);
    566 };
    567 
    568 es3fFboStateQueryTests.AttachmentSizeTextureCase.prototype.testDepthAttachment = function(internalFormat, attachment, depth, stencil) {
    569    // don't test stencil formats with textures
    570    if (attachment == gl.DEPTH_STENCIL_ATTACHMENT)
    571        return;
    572 
    573    var textureID = gl.createTexture();
    574    gl.bindTexture(gl.TEXTURE_2D, textureID);
    575    gl.texStorage2D(gl.TEXTURE_2D, 1, internalFormat, 128, 128);
    576 
    577    gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureID, 0);
    578 
    579    checkAttachmentComponentSizeAtLeast.bind(this, gl.FRAMEBUFFER, attachment, -1, -1, -1, -1, depth, stencil);
    580    checkAttachmentComponentSizeExactly.bind(this, gl.FRAMEBUFFER, attachment, 0, 0, 0, 0, -1, -1);
    581 
    582    gl.framebufferTexture2D(gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, null, 0);
    583    gl.deleteTexture(textureID);
    584 };
    585 
    586 /**
    587 * @constructor
    588 * @extends {es3fApiCase.ApiCase}
    589 * @param {string} name
    590 * @param {string} description
    591 */
    592 es3fFboStateQueryTests.UnspecifiedAttachmentTextureColorCodingCase = function(name, description) {
    593    es3fApiCase.ApiCase.call(this, name, description, gl);
    594 };
    595 
    596 setParentClass(es3fFboStateQueryTests.UnspecifiedAttachmentTextureColorCodingCase, es3fApiCase.ApiCase);
    597 
    598 es3fFboStateQueryTests.UnspecifiedAttachmentTextureColorCodingCase.prototype.test = function() {
    599    var framebufferID = gl.createFramebuffer();
    600    gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
    601    // color
    602    var renderbufferID = gl.createRenderbuffer();
    603    gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
    604 
    605    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbufferID);
    606 
    607    this.check(glsStateQuery.verifyColorAttachment(gl.FRAMEBUFFER, gl.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, gl.LINEAR));
    608 
    609    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
    610    gl.deleteRenderbuffer(renderbufferID);
    611 
    612    // depth
    613    renderbufferID = gl.createRenderbuffer();
    614    gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
    615 
    616    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, renderbufferID);
    617 
    618    this.check(glsStateQuery.verifyAttachment(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, gl.LINEAR));
    619 
    620    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
    621    gl.deleteRenderbuffer(renderbufferID);
    622    gl.deleteFramebuffer(framebufferID);
    623 };
    624 
    625 /**
    626 * @constructor
    627 * @extends {es3fApiCase.ApiCase}
    628 * @param {string} name
    629 * @param {string} description
    630 */
    631 es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase = function(name, description) {
    632    es3fApiCase.ApiCase.call(this, name, description, gl);
    633 };
    634 
    635 setParentClass(es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase, es3fApiCase.ApiCase);
    636 
    637 es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase.prototype.test = function() {
    638    var framebufferID = gl.createFramebuffer();
    639    gl.bindFramebuffer(gl.FRAMEBUFFER, framebufferID);
    640    // check color target
    641    this.testColorAttachment();
    642 
    643    // check depth target
    644    this.testDepthAttachment();
    645    gl.deleteFramebuffer(framebufferID);
    646 };
    647 
    648 /**
    649 * @constructor
    650 * @extends {es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase}
    651 * @param {string} name
    652 * @param {string} description
    653 */
    654 es3fFboStateQueryTests.UnspecifiedAttachmentSizeRboCase = function(name, description) {
    655    es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase.call(this, name, description);
    656 };
    657 
    658 setParentClass(es3fFboStateQueryTests.UnspecifiedAttachmentSizeRboCase, es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase);
    659 
    660 es3fFboStateQueryTests.UnspecifiedAttachmentSizeRboCase.prototype.testColorAttachment = function() {
    661    var renderbufferID = gl.createRenderbuffer();
    662    gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
    663 
    664    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbufferID);
    665 
    666    checkAttachmentComponentSizeExactly.bind(this, gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, 0, 0, 0, 0, 0, 0);
    667 
    668    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
    669    gl.deleteRenderbuffer(renderbufferID);
    670 };
    671 
    672 es3fFboStateQueryTests.UnspecifiedAttachmentSizeRboCase.prototype.testDepthAttachment = function() {
    673    var renderbufferID = gl.createRenderbuffer();
    674    gl.bindRenderbuffer(gl.RENDERBUFFER, renderbufferID);
    675 
    676    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, renderbufferID);
    677 
    678    checkAttachmentComponentSizeExactly.bind(this, gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, 0, 0, 0, 0, 0, 0);
    679 
    680    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, null);
    681    gl.deleteRenderbuffer(renderbufferID);
    682 };
    683 
    684 /**
    685 * @constructor
    686 * @extends {es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase}
    687 * @param {string} name
    688 * @param {string} description
    689 */
    690 es3fFboStateQueryTests.UnspecifiedAttachmentSizeTextureCase = function(name, description) {
    691    es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase.call(this, name, description);
    692 };
    693 
    694 setParentClass(es3fFboStateQueryTests.UnspecifiedAttachmentSizeTextureCase, es3fFboStateQueryTests.UnspecifiedAttachmentSizeCase);
    695 
    696 es3fFboStateQueryTests.UnspecifiedAttachmentSizeTextureCase.prototype.testColorAttachment = function() {
    697    var textureID = gl.createTexture();
    698    gl.bindTexture(gl.TEXTURE_2D, textureID);
    699 
    700    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureID, 0);
    701 
    702    checkAttachmentComponentSizeExactly.bind(this, gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, 0, 0, 0, 0, 0, 0);
    703 
    704    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
    705    gl.deleteTexture(textureID);
    706 };
    707 
    708 es3fFboStateQueryTests.UnspecifiedAttachmentSizeTextureCase.prototype.testDepthAttachment = function() {
    709    var textureID = gl.createTexture();
    710    gl.bindTexture(gl.TEXTURE_2D, textureID);
    711 
    712    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, textureID, 0);
    713 
    714    checkAttachmentComponentSizeExactly.bind(this, gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, 0, 0, 0, 0, 0, 0);
    715 
    716    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, null, 0);
    717    gl.deleteTexture(textureID);
    718 };
    719 
    720 /**
    721 * @constructor
    722 * @extends {es3fApiCase.ApiCase}
    723 * @param {string} name
    724 * @param {string} description
    725 */
    726 es3fFboStateQueryTests.UnspecifiedAttachmentTextureComponentTypeCase = function(name, description) {
    727    es3fApiCase.ApiCase.call(this, name, description, gl);
    728 };
    729 
    730 setParentClass(es3fFboStateQueryTests.UnspecifiedAttachmentTextureComponentTypeCase, es3fApiCase.ApiCase);
    731 
    732 es3fFboStateQueryTests.UnspecifiedAttachmentTextureComponentTypeCase.prototype.test = function() {
    733 };
    734 
    735 /**
    736 * @constructor
    737 * @extends {tcuTestCase.DeqpTest}
    738 */
    739 es3fFboStateQueryTests.FboStateQueryTests = function() {
    740    tcuTestCase.DeqpTest.call(this, 'fbo', 'Fbo State Query tests');
    741 };
    742 
    743 es3fFboStateQueryTests.FboStateQueryTests.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
    744 es3fFboStateQueryTests.FboStateQueryTests.prototype.constructor = es3fFboStateQueryTests.FboStateQueryTests;
    745 
    746 es3fFboStateQueryTests.FboStateQueryTests.prototype.init = function() {
    747    var red = /** @type {number} */ (gl.getParameter(gl.RED_BITS));
    748    var green = /** @type {number} */ (gl.getParameter(gl.GREEN_BITS));
    749    var blue = /** @type {number} */ (gl.getParameter(gl.BLUE_BITS));
    750    var alpha = /** @type {number} */ (gl.getParameter(gl.ALPHA_BITS));
    751    es3fFboStateQueryTests.colorBits = [red, green, blue, alpha];
    752    es3fFboStateQueryTests.depthBits = /** @type {number} */ (gl.getParameter(gl.DEPTH_BITS));
    753    es3fFboStateQueryTests.stencilBits = /** @type {number} */ (gl.getParameter(gl.STENCIL_BITS));
    754 
    755    this.addChild(new es3fFboStateQueryTests.DefaultFramebufferCase('draw_framebuffer_default_framebuffer', 'default framebuffer', gl.DRAW_FRAMEBUFFER));
    756    this.addChild(new es3fFboStateQueryTests.DefaultFramebufferCase('read_framebuffer_default_framebuffer', 'default framebuffer', gl.READ_FRAMEBUFFER));
    757    this.addChild(new es3fFboStateQueryTests.AttachmentObjectCase('framebuffer_attachment_object', 'FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE and FRAMEBUFFER_ATTACHMENT_OBJECT_NAME'));
    758    this.addChild(new es3fFboStateQueryTests.AttachmentTextureLevelCase('framebuffer_attachment_texture_level', 'FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL'));
    759    this.addChild(new es3fFboStateQueryTests.AttachmentTextureCubeMapFaceCase('framebuffer_attachment_texture_cube_map_face', 'FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE'));
    760    this.addChild(new es3fFboStateQueryTests.AttachmentTextureLayerCase('framebuffer_attachment_texture_layer', 'FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER'));
    761    this.addChild(new es3fFboStateQueryTests.AttachmentTextureColorCodingCase('framebuffer_attachment_color_encoding', 'FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING'));
    762    this.addChild(new es3fFboStateQueryTests.AttachmentTextureComponentTypeCase('framebuffer_attachment_component_type', 'FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE'));
    763    this.addChild(new es3fFboStateQueryTests.AttachmentSizeInitialCase('framebuffer_attachment_x_size_initial', 'FRAMEBUFFER_ATTACHMENT_x_SIZE'));
    764    this.addChild(new es3fFboStateQueryTests.AttachmentSizeRboCase('framebuffer_attachment_x_size_rbo', 'FRAMEBUFFER_ATTACHMENT_x_SIZE'));
    765    this.addChild(new es3fFboStateQueryTests.AttachmentSizeTextureCase('framebuffer_attachment_x_size_texture', 'FRAMEBUFFER_ATTACHMENT_x_SIZE'));
    766    this.addChild(new es3fFboStateQueryTests.UnspecifiedAttachmentTextureColorCodingCase('framebuffer_unspecified_attachment_color_encoding', 'FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING'));
    767    this.addChild(new es3fFboStateQueryTests.UnspecifiedAttachmentTextureComponentTypeCase('framebuffer_unspecified_attachment_component_type', 'FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE'));
    768    this.addChild(new es3fFboStateQueryTests.UnspecifiedAttachmentSizeRboCase('framebuffer_unspecified_attachment_x_size_rbo', 'FRAMEBUFFER_ATTACHMENT_x_SIZE'));
    769    this.addChild(new es3fFboStateQueryTests.UnspecifiedAttachmentSizeTextureCase('framebuffer_unspecified_attachment_x_size_texture', 'FRAMEBUFFER_ATTACHMENT_x_SIZE'));
    770 };
    771 
    772 /**
    773 * Run test
    774 * @param {WebGL2RenderingContext} context
    775 */
    776 es3fFboStateQueryTests.run = function(context) {
    777    gl = context;
    778    //Set up Test Root parameters
    779    var state = tcuTestCase.runner;
    780    state.setRoot(new es3fFboStateQueryTests.FboStateQueryTests());
    781 
    782    //Set up name and description of this test series.
    783    setCurrentTestName(state.testCases.fullName());
    784    description(state.testCases.getDescription());
    785 
    786    try {
    787        //Run test cases
    788        tcuTestCase.runTestCases();
    789    }
    790    catch (err) {
    791        testFailedOptions('Failed to es3fFboStateQueryTests.run tests', false);
    792        tcuTestCase.runner.terminate();
    793    }
    794 };
    795 
    796 });