tor-browser

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

es3fNegativeBufferApiTests.js (62042B)


      1 'use strict';
      2 goog.provide('functional.gles3.es3fNegativeBufferApiTests');
      3 goog.require('framework.common.tcuTestCase');
      4 goog.require('framework.opengl.gluStrUtil');
      5 goog.require('functional.gles3.es3fApiCase');
      6 
      7 goog.scope(function() {
      8 
      9    var es3fNegativeBufferApiTests = functional.gles3.es3fNegativeBufferApiTests;
     10    var es3fApiCase = functional.gles3.es3fApiCase;
     11    var gluStrUtil = framework.opengl.gluStrUtil;
     12    var tcuTestCase = framework.common.tcuTestCase;
     13 
     14    /**
     15    * @param {WebGL2RenderingContext} gl
     16    */
     17    es3fNegativeBufferApiTests.init = function(gl) {
     18 
     19        var testGroup = tcuTestCase.runner.testCases;
     20        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
     21            'bind_buffer', 'Invalid gl.bindBuffer() usage', gl,
     22            function() {
     23                bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not one of the allowable values.');
     24                gl.bindBuffer(-1, null);
     25                this.expectError(gl.INVALID_ENUM);
     26            }
     27        ));
     28 
     29        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
     30            'buffer_data', 'Invalid gl.bufferData() usage', gl,
     31            function() {
     32                var buffer = gl.createBuffer();
     33                gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
     34 
     35                bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not gl.ARRAY_BUFFER or gl.ELEMENT_ARRAY_BUFFER.');
     36                gl.bufferData(-1, 0, gl.STREAM_DRAW);
     37                this.expectError(gl.INVALID_ENUM);
     38 
     39                bufferedLogToConsole('gl.INVALID_ENUM is generated if usage is not gl.STREAM_DRAW, gl.STATIC_DRAW, or gl.DYNAMIC_DRAW.');
     40                gl.bufferData(gl.ARRAY_BUFFER, 0, -1);
     41                this.expectError(gl.INVALID_ENUM);
     42 
     43                bufferedLogToConsole('gl.INVALID_VALUE is generated if size is negative.');
     44                gl.bufferData(gl.ARRAY_BUFFER, -1, gl.STREAM_DRAW);
     45                this.expectError(gl.INVALID_VALUE);
     46 
     47                bufferedLogToConsole('gl.INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.');
     48                gl.bindBuffer(gl.ARRAY_BUFFER, null);
     49                gl.bufferData(gl.ARRAY_BUFFER, 0, gl.STREAM_DRAW);
     50                this.expectError(gl.INVALID_OPERATION);
     51 
     52                gl.deleteBuffer(buffer);
     53            }
     54        ));
     55 
     56        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
     57            'buffer_sub_data', 'Invalid gl.bufferSubData() usage', gl,
     58            function() {
     59                var buffer = gl.createBuffer();
     60                var data = new ArrayBuffer(5);
     61                gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
     62                gl.bufferData(gl.ARRAY_BUFFER, 10, gl.STREAM_DRAW);
     63 
     64                bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not gl.ARRAY_BUFFER or gl.ELEMENT_ARRAY_BUFFER.');
     65                gl.bufferSubData(-1, 1, data);
     66                this.expectError(gl.INVALID_ENUM);
     67 
     68                bufferedLogToConsole('gl.INVALID_OPERATION is generated if the reserved buffer object name 0 is bound to target.');
     69                gl.bindBuffer(gl.ARRAY_BUFFER, null);
     70                gl.bufferSubData(gl.ARRAY_BUFFER, 0, data);
     71                this.expectError(gl.INVALID_OPERATION);
     72 
     73                gl.deleteBuffer(buffer);
     74            }
     75        ));
     76 
     77        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
     78            'buffer_sub_data_size_offset', 'Invalid gl.bufferSubData() usage', gl,
     79            function() {
     80                var buffer = gl.createBuffer();
     81                var data = new ArrayBuffer(5);
     82                gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
     83                gl.bufferData(gl.ARRAY_BUFFER, 10, gl.STREAM_DRAW);
     84 
     85                bufferedLogToConsole('gl.INVALID_VALUE is generated if offset is negative');
     86                gl.bufferSubData(gl.ARRAY_BUFFER, -1, data);
     87                this.expectError(gl.INVALID_VALUE);
     88 
     89                bufferedLogToConsole('gl.INVALID_VALUE is generated if the data would be written past the end of the buffer.');
     90                gl.bufferSubData(gl.ARRAY_BUFFER, 7, data);
     91                this.expectError(gl.INVALID_VALUE);
     92                gl.bufferSubData(gl.ARRAY_BUFFER, 15, data);
     93                this.expectError(gl.INVALID_VALUE);
     94 
     95                bufferedLogToConsole('An exception is thrown if data is null.');
     96                this.expectThrowNoError(function() {
     97                    gl.bufferSubData(gl.ARRAY_BUFFER, 0, null);
     98                });
     99 
    100                gl.deleteBuffer(buffer);
    101            }
    102        ));
    103 
    104        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    105            'clear', 'Invalid gl.clear() usage', gl,
    106            function() {
    107                bufferedLogToConsole('gl.INVALID_VALUE is generated if any bit other than the three defined bits is set in mask.');
    108                gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
    109                this.expectError(gl.NO_ERROR);
    110                gl.clear(0x0200);
    111                this.expectError(gl.INVALID_VALUE);
    112                gl.clear(0x1000);
    113                this.expectError(gl.INVALID_VALUE);
    114                gl.clear(0x0010);
    115                this.expectError(gl.INVALID_VALUE);
    116            }
    117        ));
    118 
    119        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    120            'read_pixels', 'Invalid gl.readPixels() usage', gl,
    121            function() {
    122                var buffer = new ArrayBuffer(8);
    123                var ubyteData = new Uint8Array(buffer);
    124                var ushortData = new Uint16Array(buffer);
    125 
    126                bufferedLogToConsole('gl.INVALID_OPERATION is generated if the combination of format and type is unsupported.');
    127                gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_SHORT_4_4_4_4, ushortData);
    128                this.expectError(gl.INVALID_OPERATION);
    129 
    130                bufferedLogToConsole('gl.INVALID_OPERATION is generated if the ArrayBuffer type does not match the type parameter.');
    131                gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, ushortData);
    132                this.expectError(gl.INVALID_OPERATION);
    133 
    134                bufferedLogToConsole('gl.INVALID_VALUE is generated if either width or height is negative.');
    135                gl.readPixels(0, 0, -1, 1, gl.RGBA, gl.UNSIGNED_BYTE, ubyteData);
    136                this.expectError(gl.INVALID_VALUE);
    137                gl.readPixels(0, 0, 1, -1, gl.RGBA, gl.UNSIGNED_BYTE, ubyteData);
    138                this.expectError(gl.INVALID_VALUE);
    139                gl.readPixels(0, 0, -1, -1, gl.RGBA, gl.UNSIGNED_BYTE, ubyteData);
    140                this.expectError(gl.INVALID_VALUE);
    141 
    142                bufferedLogToConsole('gl.INVALID_FRAMEBUFFER_OPERATION is generated if the currently bound framebuffer is not framebuffer complete.');
    143                var fbo = gl.createFramebuffer();
    144                gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    145                gl.checkFramebufferStatus(gl.FRAMEBUFFER);
    146                gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, ubyteData);
    147                this.expectError(gl.INVALID_FRAMEBUFFER_OPERATION);
    148                gl.bindFramebuffer(gl.FRAMEBUFFER, null);
    149                gl.deleteFramebuffer(fbo);
    150            }
    151        ));
    152 
    153        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    154            'read_pixels_format_mismatch', 'Invalid glReadPixels() usage', gl,
    155            function() {
    156                var buffer = new ArrayBuffer(8);
    157                var ubyteData = new Uint8Array(buffer);
    158                var ushortData = new Uint16Array(buffer);
    159 
    160                bufferedLogToConsole('Unsupported combinations of format and type will generate a gl.INVALID_OPERATION error.');
    161                gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_SHORT_5_6_5, ushortData);
    162                this.expectError(gl.INVALID_OPERATION);
    163                gl.readPixels(0, 0, 1, 1, gl.ALPHA, gl.UNSIGNED_SHORT_5_6_5, ushortData);
    164                this.expectError(gl.INVALID_OPERATION);
    165                gl.readPixels(0, 0, 1, 1, gl.RGB, gl.UNSIGNED_SHORT_4_4_4_4, ushortData);
    166                this.expectError(gl.INVALID_OPERATION);
    167                gl.readPixels(0, 0, 1, 1, gl.ALPHA, gl.UNSIGNED_SHORT_4_4_4_4, ushortData);
    168                this.expectError(gl.INVALID_OPERATION);
    169                gl.readPixels(0, 0, 1, 1, gl.RGB, gl.UNSIGNED_SHORT_5_5_5_1, ushortData);
    170                this.expectError(gl.INVALID_OPERATION);
    171                gl.readPixels(0, 0, 1, 1, gl.ALPHA, gl.UNSIGNED_SHORT_5_5_5_1, ushortData);
    172                this.expectError(gl.INVALID_OPERATION);
    173 
    174                bufferedLogToConsole('gl.RGBA/gl.UNSIGNED_BYTE is always accepted and the other acceptable pair can be discovered by querying gl.IMPLEMENTATION_COLOR_READ_FORMAT and gl.IMPLEMENTATION_COLOR_READ_TYPE.');
    175                gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, ubyteData);
    176                this.expectError(gl.NO_ERROR);
    177                var readFormat = /** @type {number} */ (gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_FORMAT));
    178                var readType = /** @type {number} */ (gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_TYPE));
    179                gl.readPixels(0, 0, 1, 1, readFormat, readType, ubyteData);
    180                this.expectError(gl.NO_ERROR);
    181            }
    182        ));
    183 
    184        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    185            'read_pixels_fbo_format_mismatch', 'Invalid gl.readPixels() usage', gl,
    186            function() {
    187                var ubyteData = new Uint8Array(4);
    188                var floatData = new Float32Array(4);
    189 
    190                var texture = gl.createTexture();
    191                gl.bindTexture(gl.TEXTURE_2D, texture);
    192                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 32, 32, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    193 
    194                var fbo = gl.createFramebuffer();
    195                gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    196                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
    197                this.expectError(gl.NO_ERROR);
    198 
    199                bufferedLogToConsole('gl.INVALID_OPERATION is generated if currently bound framebuffer format is incompatible with format and type.');
    200 
    201                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 32, 32, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    202                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
    203                gl.checkFramebufferStatus(gl.FRAMEBUFFER);
    204                this.expectError(gl.NO_ERROR);
    205                gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.FLOAT, floatData);
    206                this.expectError(gl.INVALID_OPERATION);
    207 
    208                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32I, 32, 32, 0, gl.RGBA_INTEGER, gl.INT, null);
    209                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
    210                gl.checkFramebufferStatus(gl.FRAMEBUFFER);
    211                this.expectError(gl.NO_ERROR);
    212                gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.FLOAT, floatData);
    213                this.expectError(gl.INVALID_OPERATION);
    214 
    215                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32UI, 32, 32, 0, gl.RGBA_INTEGER, gl.UNSIGNED_INT, null);
    216                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
    217                gl.checkFramebufferStatus(gl.FRAMEBUFFER);
    218                this.expectError(gl.NO_ERROR);
    219                gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.FLOAT, floatData);
    220                this.expectError(gl.INVALID_OPERATION);
    221 
    222                bufferedLogToConsole('gl.INVALID_OPERATION is generated if gl.READ_FRAMEBUFFER_BINDING is non-zero, the read framebuffer is complete, and the value of gl.SAMPLE_BUFFERS for the read framebuffer is greater than zero.');
    223 
    224                var rbo = gl.createRenderbuffer();
    225                gl.bindRenderbuffer(gl.RENDERBUFFER, rbo);
    226                gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 4, gl.RGBA8, 32, 32);
    227                gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo);
    228 
    229                var binding = /** @type {WebGLFramebuffer} */ (gl.getParameter(gl.READ_FRAMEBUFFER_BINDING));
    230                bufferedLogToConsole('gl.READ_FRAMEBUFFER_BINDING: ' + binding);
    231                gl.checkFramebufferStatus(gl.FRAMEBUFFER);
    232                var sampleBuffers = /** @type {number} */ (gl.getParameter(gl.SAMPLE_BUFFERS));
    233                bufferedLogToConsole('gl.SAMPLE_BUFFERS: ' + sampleBuffers);
    234                this.expectError(gl.NO_ERROR);
    235 
    236                if (binding == null || sampleBuffers <= 0) {
    237                    this.testFailed('expected gl.READ_FRAMEBUFFER_BINDING to be non-zero and gl.SAMPLE_BUFFERS to be greater than zero');
    238                } else {
    239                    gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, ubyteData);
    240                    this.expectError(gl.INVALID_OPERATION);
    241                }
    242 
    243                gl.bindRenderbuffer(gl.RENDERBUFFER, null);
    244                gl.deleteRenderbuffer(rbo);
    245                gl.bindFramebuffer(gl.FRAMEBUFFER, null);
    246                gl.deleteFramebuffer(fbo);
    247                gl.bindTexture(gl.TEXTURE_2D, null);
    248                gl.deleteTexture(texture);
    249            }
    250        ));
    251 
    252        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    253            'bind_buffer_range', 'Invalid glBindBufferRange() usage', gl,
    254            function() {
    255                var bufEmpty = new ArrayBuffer(16);
    256 
    257                var bufUniform = gl.createBuffer();
    258                gl.bindBuffer(gl.UNIFORM_BUFFER, bufUniform);
    259                gl.bufferData(gl.UNIFORM_BUFFER, bufEmpty, gl.STREAM_DRAW);
    260 
    261                var bufTF = gl.createBuffer();
    262                gl.bindBuffer(gl.TRANSFORM_FEEDBACK_BUFFER, bufTF);
    263                gl.bufferData(gl.TRANSFORM_FEEDBACK_BUFFER, bufEmpty, gl.STREAM_DRAW);
    264 
    265                bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not gl.TRANSFORM_FEEDBACK_BUFFER or gl.UNIFORM_BUFFER.');
    266                gl.bindBufferRange(gl.ARRAY_BUFFER, 0, bufUniform, 0, 4);
    267                this.expectError(gl.INVALID_ENUM);
    268 
    269                bufferedLogToConsole('gl.INVALID_VALUE is generated if target is gl.TRANSFORM_FEEDBACK_BUFFER and index is greater than or equal to gl.MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS.');
    270                var maxTFSize = /** @type {number} */ (gl.getParameter(gl.MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS));
    271                gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, maxTFSize, bufTF, 0, 4);
    272                this.expectError(gl.INVALID_VALUE);
    273 
    274                bufferedLogToConsole('gl.INVALID_VALUE is generated if target is gl.UNIFORM_BUFFER and index is greater than or equal to gl.MAX_UNIFORM_BUFFER_BINDINGS.');
    275                var maxUSize = /** @type {number} */ (gl.getParameter(gl.MAX_UNIFORM_BUFFER_BINDINGS));
    276                gl.bindBufferRange(gl.UNIFORM_BUFFER, maxUSize, bufUniform, 0, 4);
    277                this.expectError(gl.INVALID_VALUE);
    278 
    279                bufferedLogToConsole('gl.INVALID_VALUE is generated if size is less than or equal to zero.');
    280                gl.bindBufferRange(gl.UNIFORM_BUFFER, 0, bufUniform, 0, -1);
    281                this.expectError(gl.INVALID_VALUE);
    282                gl.bindBufferRange(gl.UNIFORM_BUFFER, 0, bufUniform, 0, 0);
    283                this.expectError(gl.INVALID_VALUE);
    284 
    285                bufferedLogToConsole('gl.INVALID_VALUE is generated if target is gl.TRANSFORM_FEEDBACK_BUFFER and size or offset are not multiples of 4.');
    286                gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, bufTF, 4, 5);
    287                this.expectError(gl.INVALID_VALUE);
    288                gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, bufTF, 5, 4);
    289                this.expectError(gl.INVALID_VALUE);
    290                gl.bindBufferRange(gl.TRANSFORM_FEEDBACK_BUFFER, 0, bufTF, 5, 7);
    291                this.expectError(gl.INVALID_VALUE);
    292 
    293                bufferedLogToConsole('gl.INVALID_VALUE is generated if target is gl.UNIFORM_BUFFER and offset is not a multiple of gl.UNIFORM_BUFFER_OFFSET_ALIGNMENT.');
    294                var alignment = /** @type {number} */ (gl.getParameter(gl.UNIFORM_BUFFER_OFFSET_ALIGNMENT));
    295                gl.bindBufferRange(gl.UNIFORM_BUFFER, 0, bufUniform, alignment + 1, 4);
    296                this.expectError(gl.INVALID_VALUE);
    297 
    298                gl.deleteBuffer(bufUniform);
    299                gl.deleteBuffer(bufTF);
    300            }
    301        ));
    302 
    303        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    304            'bind_buffer_base', 'Invalid glBindBufferBase() usage', gl,
    305            function() {
    306                var bufEmpty = new ArrayBuffer(16);
    307 
    308                var bufUniform = gl.createBuffer();
    309                gl.bindBuffer(gl.UNIFORM_BUFFER, bufUniform);
    310                gl.bufferData(gl.UNIFORM_BUFFER, bufEmpty, gl.STREAM_DRAW);
    311 
    312                var bufTF = gl.createBuffer();
    313                gl.bindBuffer(gl.TRANSFORM_FEEDBACK_BUFFER, bufTF);
    314                gl.bufferData(gl.TRANSFORM_FEEDBACK_BUFFER, bufEmpty, gl.STREAM_DRAW);
    315 
    316                bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not gl.TRANSFORM_FEEDBACK_BUFFER or gl.UNIFORM_BUFFER.');
    317                gl.bindBufferBase(-1, 0, bufUniform);
    318                this.expectError(gl.INVALID_ENUM);
    319                gl.bindBufferBase(gl.ARRAY_BUFFER, 0, bufUniform);
    320                this.expectError(gl.INVALID_ENUM);
    321 
    322                bufferedLogToConsole('gl.INVALID_VALUE is generated if target is gl.UNIFORM_BUFFER and index is greater than or equal to gl.MAX_UNIFORM_BUFFER_BINDINGS.');
    323                var maxUSize = /** @type {number} */ (gl.getParameter(gl.MAX_UNIFORM_BUFFER_BINDINGS));
    324                gl.bindBufferBase(gl.UNIFORM_BUFFER, maxUSize, bufUniform);
    325                this.expectError(gl.INVALID_VALUE);
    326 
    327                bufferedLogToConsole('gl.INVALID_VALUE is generated if target is gl.TRANSFORM_FEEDBACK_BUFFER andindex is greater than or equal to gl.MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS.');
    328                var maxTFSize = /** @type {number} */ (gl.getParameter(gl.MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS));
    329                gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, maxTFSize, bufTF);
    330                this.expectError(gl.INVALID_VALUE);
    331 
    332                gl.deleteBuffer(bufUniform);
    333                gl.deleteBuffer(bufTF);
    334            }
    335        ));
    336 
    337        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    338            'clear_bufferiv', 'Invalid gl.clearBufferiv() usage', gl,
    339            function() {
    340                var data = new Int32Array(32 * 32);
    341 
    342                var texture = gl.createTexture();
    343                gl.bindTexture(gl.TEXTURE_2D, texture);
    344                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32I, 32, 32, 0, gl.RGBA_INTEGER, gl.INT, null);
    345 
    346                var fbo = gl.createFramebuffer();
    347                gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    348                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
    349                gl.checkFramebufferStatus(gl.FRAMEBUFFER);
    350                this.expectError(gl.NO_ERROR);
    351 
    352                bufferedLogToConsole('gl.INVALID_ENUM is generated if buffer is not an accepted value.');
    353                gl.clearBufferiv(-1, 0, data);
    354                this.expectError(gl.INVALID_ENUM);
    355                gl.clearBufferiv(gl.FRAMEBUFFER, 0, data);
    356                this.expectError(gl.INVALID_ENUM);
    357 
    358                bufferedLogToConsole('gl.INVALID_VALUE is generated if buffer is gl.COLOR, gl.FRONT, gl.BACK, gl.LEFT, gl.RIGHT, or gl.FRONT_AND_BACK and drawBuffer is greater than or equal to gl.MAX_DRAW_BUFFERS.');
    359                var maxDrawBuffers = /** @type {number} */ (gl.getParameter(gl.MAX_DRAW_BUFFERS));
    360                gl.clearBufferiv(gl.COLOR, maxDrawBuffers, data);
    361                this.expectError(gl.INVALID_VALUE);
    362 
    363                bufferedLogToConsole('gl.INVALID_ENUM is generated if buffer is gl.DEPTH or gl.DEPTH_STENCIL.');
    364                gl.clearBufferiv(gl.DEPTH, 1, data);
    365                this.expectError(gl.INVALID_ENUM);
    366                gl.clearBufferiv(gl.DEPTH_STENCIL, 1, data);
    367                this.expectError(gl.INVALID_ENUM);
    368 
    369                bufferedLogToConsole('gl.INVALID_VALUE is generated if buffer is gl.STENCIL and drawBuffer is not zero.');
    370                gl.clearBufferiv(gl.STENCIL, 1, data);
    371                this.expectError(gl.INVALID_VALUE);
    372 
    373                gl.deleteFramebuffer(fbo);
    374                gl.deleteTexture(texture);
    375            }
    376        ));
    377 
    378        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    379            'clear_bufferuiv', 'Invalid gl.clearBufferuiv() usage', gl,
    380            function() {
    381                var data = new Uint32Array(32 * 32);
    382 
    383                var texture = gl.createTexture();
    384                gl.bindTexture(gl.TEXTURE_2D, texture);
    385                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32UI, 32, 32, 0, gl.RGBA_INTEGER, gl.UNSIGNED_INT, null);
    386 
    387                var fbo = gl.createFramebuffer();
    388                gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    389                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
    390                gl.checkFramebufferStatus(gl.FRAMEBUFFER);
    391                this.expectError(gl.NO_ERROR);
    392 
    393                bufferedLogToConsole('gl.INVALID_ENUM is generated if buffer is not an accepted value.');
    394                gl.clearBufferuiv(-1, 0, data);
    395                this.expectError(gl.INVALID_ENUM);
    396                gl.clearBufferuiv(gl.FRAMEBUFFER, 0, data);
    397                this.expectError(gl.INVALID_ENUM);
    398 
    399                bufferedLogToConsole('gl.INVALID_VALUE is generated if buffer is gl.COLOR, gl.FRONT, gl.BACK, gl.LEFT, gl.RIGHT, or gl.FRONT_AND_BACK and drawBuffer is greater than or equal to gl.MAX_DRAW_BUFFERS.');
    400                var maxDrawBuffers = /** @type {number} */ (gl.getParameter(gl.MAX_DRAW_BUFFERS));
    401                gl.clearBufferuiv(gl.COLOR, maxDrawBuffers, data);
    402                this.expectError(gl.INVALID_VALUE);
    403 
    404                bufferedLogToConsole('gl.INVALID_ENUM is generated if buffer is gl.DEPTH, gl.STENCIL or gl.DEPTH_STENCIL.');
    405                gl.clearBufferuiv(gl.DEPTH, 1, data);
    406                this.expectError(gl.INVALID_ENUM);
    407                gl.clearBufferuiv(gl.STENCIL, 1, data);
    408                this.expectError(gl.INVALID_ENUM);
    409                gl.clearBufferuiv(gl.DEPTH_STENCIL, 1, data);
    410                this.expectError(gl.INVALID_ENUM);
    411 
    412                gl.deleteFramebuffer(fbo);
    413                gl.deleteTexture(texture);
    414            }
    415        ));
    416 
    417        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    418            'clear_bufferfv', 'Invalid gl.clearBufferfv() usage', gl,
    419            function() {
    420                var data = new Float32Array(32 * 32);
    421 
    422                var texture = gl.createTexture();
    423                // Float type texture isn't color-renderable without EXT_color_buffer_float extension.
    424                if (gl.getExtension('EXT_color_buffer_float')) {
    425                    gl.bindTexture(gl.TEXTURE_2D, texture);
    426                    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32F, 32, 32, 0, gl.RGBA, gl.FLOAT, null);
    427 
    428                    var fbo = gl.createFramebuffer();
    429                    gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    430                    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
    431                    gl.checkFramebufferStatus(gl.FRAMEBUFFER);
    432                    this.expectError(gl.NO_ERROR);
    433 
    434                    bufferedLogToConsole('gl.INVALID_ENUM is generated if buffer is not an accepted value.');
    435                    gl.clearBufferfv(-1, 0, data);
    436                    this.expectError(gl.INVALID_ENUM);
    437                    gl.clearBufferfv(gl.FRAMEBUFFER, 0, data);
    438                    this.expectError(gl.INVALID_ENUM);
    439 
    440                    bufferedLogToConsole('gl.INVALID_VALUE is generated if buffer is gl.COLOR, gl.FRONT, gl.BACK, gl.LEFT, gl.RIGHT, or gl.FRONT_AND_BACK and drawBuffer is greater than or equal to gl.MAX_DRAW_BUFFERS.');
    441                    var maxDrawBuffers = /** @type {number} */ (gl.getParameter(gl.MAX_DRAW_BUFFERS));
    442                    gl.clearBufferfv(gl.COLOR, maxDrawBuffers, data);
    443                    this.expectError(gl.INVALID_VALUE);
    444 
    445                    bufferedLogToConsole('gl.INVALID_ENUM is generated if buffer is gl.STENCIL or gl.DEPTH_STENCIL.');
    446                    gl.clearBufferfv(gl.STENCIL, 1, data);
    447                    this.expectError(gl.INVALID_ENUM);
    448                    gl.clearBufferfv(gl.DEPTH_STENCIL, 1, data);
    449                    this.expectError(gl.INVALID_ENUM);
    450 
    451                    bufferedLogToConsole('gl.INVALID_VALUE is generated if buffer is gl.DEPTH and drawBuffer is not zero.');
    452                    gl.clearBufferfv(gl.DEPTH, 1, data);
    453                    this.expectError(gl.INVALID_VALUE);
    454                }
    455 
    456                gl.deleteFramebuffer(fbo);
    457                gl.deleteTexture(texture);
    458            }
    459        ));
    460 
    461        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    462            'clear_bufferfi', 'Invalid gl.clearBufferfi() usage', gl,
    463            function() {
    464                bufferedLogToConsole('gl.INVALID_ENUM is generated if buffer is not an accepted value.');
    465                gl.clearBufferfi(-1, 0, 1.0, 1);
    466                this.expectError(gl.INVALID_ENUM);
    467                gl.clearBufferfi(gl.FRAMEBUFFER, 0, 1.0, 1);
    468                this.expectError(gl.INVALID_ENUM);
    469 
    470                bufferedLogToConsole('gl.INVALID_ENUM is generated if buffer is not gl.DEPTH_STENCIL.');
    471                gl.clearBufferfi(gl.DEPTH, 0, 1.0, 1);
    472                this.expectError(gl.INVALID_ENUM);
    473                gl.clearBufferfi(gl.STENCIL, 0, 1.0, 1);
    474                this.expectError(gl.INVALID_ENUM);
    475                gl.clearBufferfi(gl.COLOR, 0, 1.0, 1);
    476                this.expectError(gl.INVALID_ENUM);
    477 
    478                bufferedLogToConsole('gl.INVALID_VALUE is generated if buffer is gl.DEPTH_STENCIL and drawBuffer is not zero.');
    479                gl.clearBufferfi(gl.DEPTH_STENCIL, 1, 1.0, 1);
    480                this.expectError(gl.INVALID_VALUE);
    481 
    482            }
    483        ));
    484 
    485        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    486            'copy_buffer_sub_data', 'Invalid gl.copyBufferSubData() usage', gl,
    487            function() {
    488                var buf = {
    489                    r: gl.createBuffer(),
    490                    w: gl.createBuffer()
    491                };
    492 
    493                gl.bindBuffer(gl.COPY_READ_BUFFER, buf.r);
    494                gl.bufferData(gl.COPY_READ_BUFFER, 32, gl.DYNAMIC_COPY);
    495                gl.bindBuffer(gl.COPY_WRITE_BUFFER, buf.w);
    496                gl.bufferData(gl.COPY_WRITE_BUFFER, 32, gl.DYNAMIC_COPY);
    497                this.expectError(gl.NO_ERROR);
    498 
    499                bufferedLogToConsole('gl.INVALID_VALUE is generated if any of readoffset, writeoffset or size is negative.');
    500                gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 0, -4);
    501                this.expectError(gl.INVALID_VALUE);
    502                gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, -1, 0, 4);
    503                this.expectError(gl.INVALID_VALUE);
    504                gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, -1, 4);
    505                this.expectError(gl.INVALID_VALUE);
    506 
    507                bufferedLogToConsole('gl.INVALID_VALUE is generated if readoffset + size exceeds the size of the buffer object bound to readtarget.');
    508                gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 0, 36);
    509                this.expectError(gl.INVALID_VALUE);
    510                gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 24, 0, 16);
    511                this.expectError(gl.INVALID_VALUE);
    512                gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 36, 0, 4);
    513                this.expectError(gl.INVALID_VALUE);
    514 
    515                bufferedLogToConsole('gl.INVALID_VALUE is generated if writeoffset + size exceeds the size of the buffer object bound to writetarget.');
    516                gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 0, 36);
    517                this.expectError(gl.INVALID_VALUE);
    518                gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 24, 16);
    519                this.expectError(gl.INVALID_VALUE);
    520                gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 36, 4);
    521                this.expectError(gl.INVALID_VALUE);
    522 
    523                bufferedLogToConsole('gl.INVALID_VALUE is generated if the same buffer object is bound to both readtarget and writetarget and the ranges [readoffset, readoffset + size) and [writeoffset, writeoffset + size) overlap.');
    524                gl.bindBuffer(gl.COPY_WRITE_BUFFER, buf.r);
    525                gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 16, 4);
    526                this.expectError(gl.NO_ERROR);
    527                gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 0, 4);
    528                this.expectError(gl.INVALID_VALUE);
    529                gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 16, 18);
    530                this.expectError(gl.INVALID_VALUE);
    531                gl.bindBuffer(gl.COPY_WRITE_BUFFER, buf.w);
    532 
    533                bufferedLogToConsole('gl.INVALID_OPERATION is generated if null is bound to readtarget or writetarget.');
    534                gl.bindBuffer(gl.COPY_READ_BUFFER, null);
    535                gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 0, 16);
    536                this.expectError(gl.INVALID_OPERATION);
    537                gl.bindBuffer(gl.COPY_READ_BUFFER, buf.r);
    538 
    539                gl.bindBuffer(gl.COPY_WRITE_BUFFER, null);
    540                gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 0, 16);
    541                this.expectError(gl.INVALID_OPERATION);
    542                gl.bindBuffer(gl.COPY_WRITE_BUFFER, buf.w);
    543 
    544                gl.deleteBuffer(buf.w);
    545                gl.deleteBuffer(buf.r);
    546            }
    547        ));
    548 
    549        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    550            'draw_buffers', 'Invalid glDrawBuffers() usage', gl,
    551            function() {
    552                var maxDrawBuffers = /** @type {number} */ (gl.getParameter(gl.MAX_DRAW_BUFFERS));
    553                var values = [
    554                    gl.NONE,
    555                    gl.BACK,
    556                    gl.COLOR_ATTACHMENT0,
    557                    gl.DEPTH_ATTACHMENT
    558                ];
    559 
    560                var texture = gl.createTexture();
    561                gl.bindTexture(gl.TEXTURE_2D, texture);
    562                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, 32, 32, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    563 
    564                var fbo = gl.createFramebuffer();
    565                gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    566                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
    567                gl.checkFramebufferStatus(gl.FRAMEBUFFER);
    568                this.expectError(gl.NO_ERROR);
    569 
    570                bufferedLogToConsole('gl.INVALID_ENUM is generated if one of the values in bufs is not an accepted value.');
    571                gl.drawBuffers(values.slice(2, 4));
    572                this.expectError(gl.INVALID_ENUM);
    573 
    574                bufferedLogToConsole('gl.INVALID_OPERATION is generated if the GL is bound to the default framebuffer and the number of queried buffers is not 1.');
    575                gl.bindFramebuffer(gl.FRAMEBUFFER, null);
    576                gl.drawBuffers(values.slice(0, 2));
    577                this.expectError(gl.INVALID_OPERATION);
    578 
    579                bufferedLogToConsole('gl.INVALID_OPERATION is generated if the GL is bound to the default framebuffer and the value in bufs is one of the gl.COLOR_ATTACHMENTn tokens.');
    580                gl.bindFramebuffer(gl.FRAMEBUFFER, null);
    581                gl.drawBuffers(values.slice(2, 3));
    582                this.expectError(gl.INVALID_OPERATION);
    583 
    584                bufferedLogToConsole('gl.INVALID_OPERATION is generated if the GL is bound to a framebuffer object and the ith buffer listed in bufs is anything other than gl.NONE or gl.COLOR_ATTACHMENTSi.');
    585                gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    586                gl.drawBuffers(values.slice(1, 2));
    587                this.expectError(gl.INVALID_OPERATION);
    588 
    589                gl.deleteTexture(texture);
    590                gl.deleteFramebuffer(fbo);
    591            }
    592        ));
    593 
    594        // Framebuffer Objects
    595 
    596        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    597            'bind_framebuffer', 'Invalid glBindFramebuffer() usage', gl,
    598            function() {
    599                bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not gl.FRAMEBUFFER.');
    600                gl.bindFramebuffer(-1, null);
    601                this.expectError(gl.INVALID_ENUM);
    602                gl.bindFramebuffer(gl.RENDERBUFFER, null);
    603                this.expectError(gl.INVALID_ENUM);
    604            }
    605        ));
    606 
    607        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    608            'bind_renderbuffer', 'Invalid glBindRenderbuffer() usage', gl,
    609            function() {
    610                bufferedLogToConsole('glINVALID_ENUM is generated if target is not gl.RENDERBUFFER.');
    611                gl.bindRenderbuffer(-1, null);
    612                this.expectError(gl.INVALID_ENUM);
    613                gl.bindRenderbuffer(gl.FRAMEBUFFER, null);
    614                this.expectError(gl.INVALID_ENUM);
    615            }
    616        ));
    617 
    618        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    619            'check_framebuffer_status', 'Invalid glCheckFramebufferStatus() usage', gl,
    620            function() {
    621                bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not gl.FRAMEBUFFER.');
    622                    gl.checkFramebufferStatus(-1);
    623                    this.expectError(gl.INVALID_ENUM);
    624                    gl.checkFramebufferStatus(gl.RENDERBUFFER);
    625                    this.expectError(gl.INVALID_ENUM);
    626            }
    627        ));
    628 
    629        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    630            'framebuffer_renderbuffer', 'Invalid glFramebufferRenderbuffer() usage', gl,
    631            function() {
    632                var rbo = gl.createRenderbuffer();
    633                var fbo = gl.createFramebuffer();
    634                gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    635 
    636                bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not one of the accepted tokens.');
    637                gl.framebufferRenderbuffer(-1, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
    638                this.expectError(gl.INVALID_ENUM);
    639 
    640                bufferedLogToConsole('gl.INVALID_ENUM is generated if renderbuffertarget is not gl.RENDERBUFFER.');
    641                gl.bindRenderbuffer(gl.RENDERBUFFER, rbo);
    642                gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, -1, rbo);
    643                this.expectError(gl.INVALID_ENUM);
    644                gl.bindRenderbuffer(gl.RENDERBUFFER, null);
    645 
    646                bufferedLogToConsole('gl.INVALID_OPERATION is generated if zero is bound to target.');
    647                gl.bindFramebuffer(gl.FRAMEBUFFER, null);
    648                gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, null);
    649                this.expectError(gl.INVALID_OPERATION);
    650 
    651                gl.deleteRenderbuffer(rbo);
    652                gl.deleteFramebuffer(fbo);
    653            }
    654        ));
    655 
    656        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    657            'framebuffer_texture2d', 'Invalid glFramebufferTexture2D() usage', gl,
    658            function() {
    659 
    660                var fbo = gl.createFramebuffer();
    661                var tex2D = gl.createTexture();
    662                var texCube = gl.createTexture();
    663                gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    664                gl.bindTexture(gl.TEXTURE_2D, tex2D);
    665                gl.bindTexture(gl.TEXTURE_CUBE_MAP, texCube);
    666                this.expectError(gl.NO_ERROR);
    667 
    668                bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not one of the accepted tokens.');
    669                gl.framebufferTexture2D(-1, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
    670                this.expectError(gl.INVALID_ENUM);
    671 
    672                bufferedLogToConsole('gl.INVALID_ENUM is generated if textarget is not an accepted texture target.');
    673                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, -1, tex2D, 0);
    674                this.expectError(gl.INVALID_ENUM);
    675 
    676                bufferedLogToConsole('gl.INVALID_VALUE is generated if level is less than 0 or larger than log_2 of maximum texture size.');
    677                var maxTexSize = /** @type {number} */ (gl.getParameter(gl.MAX_TEXTURE_SIZE));
    678                var maxCubeTexSize = /** @type {number} */ (gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE));
    679                var maxSizePlane = Math.floor(Math.log2(maxTexSize)) + 1;
    680                var maxSizeCube = Math.floor(Math.log2(maxCubeTexSize)) + 1;
    681                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex2D, -1);
    682                this.expectError(gl.INVALID_VALUE);
    683                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex2D, maxSizePlane);
    684                this.expectError(gl.INVALID_VALUE);
    685                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X, texCube, maxSizeCube);
    686                this.expectError(gl.INVALID_VALUE);
    687 
    688                bufferedLogToConsole('gl.INVALID_OPERATION is generated if textarget and texture are not compatible.');
    689                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X, tex2D, 0);
    690                this.expectError(gl.INVALID_OPERATION);
    691                gl.deleteTexture(tex2D);
    692 
    693                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texCube, 0);
    694                this.expectError(gl.INVALID_OPERATION);
    695                gl.deleteTexture(texCube);
    696 
    697                bufferedLogToConsole('gl.INVALID_OPERATION is generated if zero is bound to target.');
    698                gl.bindFramebuffer(gl.FRAMEBUFFER, null);
    699                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0);
    700                this.expectError(gl.INVALID_OPERATION);
    701 
    702                gl.deleteFramebuffer(fbo);
    703            }
    704        ));
    705 
    706        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    707            'renderbuffer_storage', 'Invalid glRenderbufferStorage() usage', gl,
    708            function() {
    709                var rbo = gl.createRenderbuffer();
    710                gl.bindRenderbuffer(gl.RENDERBUFFER, rbo);
    711 
    712                bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not gl.RENDERBUFFER.');
    713                gl.renderbufferStorage(-1, gl.RGBA4, 1, 1);
    714                this.expectError(gl.INVALID_ENUM);
    715                gl.renderbufferStorage(gl.FRAMEBUFFER, gl.RGBA4, 1, 1);
    716                this.expectError(gl.INVALID_ENUM);
    717 
    718                bufferedLogToConsole('gl.INVALID_ENUM is generated if internalformat is not a color-renderable, depth-renderable, or stencil-renderable format.');
    719                gl.renderbufferStorage(gl.RENDERBUFFER, -1, 1, 1);
    720                this.expectError(gl.INVALID_ENUM);
    721 
    722                // EXT_color_buffer_half_float disables error
    723                if (gl.getExtension('EXT_color_buffer_half_float') === null) {
    724                    gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGB16F, 1, 1);
    725                    this.expectError(gl.INVALID_ENUM);
    726                }
    727 
    728                gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA8_SNORM, 1, 1);
    729                this.expectError(gl.INVALID_ENUM);
    730 
    731                bufferedLogToConsole('gl.INVALID_VALUE is generated if width or height is less than zero.');
    732                gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, -1, 1);
    733                this.expectError(gl.INVALID_VALUE);
    734                gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 1, -1);
    735                this.expectError(gl.INVALID_VALUE);
    736                gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, -1, -1);
    737                this.expectError(gl.INVALID_VALUE);
    738 
    739                bufferedLogToConsole('gl.INVALID_VALUE is generated if width or height is greater than gl.MAX_RENDERBUFFER_SIZE.');
    740                var maxSize = /** @type {number} */ (gl.getParameter(gl.MAX_RENDERBUFFER_SIZE));
    741                gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 1, maxSize + 1);
    742                this.expectError(gl.INVALID_VALUE);
    743                gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, maxSize + 1, 1);
    744                this.expectError(gl.INVALID_VALUE);
    745                gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, maxSize + 1, maxSize + 1);
    746                this.expectError(gl.INVALID_VALUE);
    747                gl.deleteRenderbuffer(rbo);
    748            }
    749        ));
    750 
    751        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    752            'blit_framebuffer', 'Invalid glBlitFramebuffer() usage', gl,
    753            function() {
    754 
    755                /** @type {Array<WebGLTexture>} */
    756                var texture = [
    757                    gl.createTexture(), gl.createTexture()
    758                ];
    759                gl.bindTexture(gl.TEXTURE_2D, texture[0]);
    760 
    761                /** @type {Array<WebGLRenderbuffer>} */
    762                var rbo = [
    763                    gl.createRenderbuffer(), gl.createRenderbuffer()
    764                ];
    765                gl.bindRenderbuffer(gl.RENDERBUFFER, rbo[0]);
    766 
    767                /** @type {Array<WebGLFramebuffer>} */
    768                var fbo = [
    769                    gl.createFramebuffer(), gl.createFramebuffer()
    770                ];
    771                gl.bindFramebuffer(gl.READ_FRAMEBUFFER, fbo[0]);
    772 
    773                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, 32, 32, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    774                gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH24_STENCIL8, 32, 32);
    775                gl.framebufferTexture2D(gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture[0], 0);
    776                gl.framebufferRenderbuffer(gl.READ_FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, rbo[0]);
    777                gl.checkFramebufferStatus(gl.READ_FRAMEBUFFER);
    778                gl.bindTexture(gl.TEXTURE_2D, texture[1]);
    779                gl.bindRenderbuffer(gl.RENDERBUFFER, rbo[1]);
    780                gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, fbo[1]);
    781 
    782                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, 32, 32, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    783                gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH24_STENCIL8, 32, 32);
    784                gl.framebufferTexture2D(gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture[1], 0);
    785                gl.framebufferRenderbuffer(gl.DRAW_FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, rbo[1]);
    786                gl.checkFramebufferStatus(gl.DRAW_FRAMEBUFFER);
    787                this.expectError(gl.NO_ERROR);
    788 
    789                bufferedLogToConsole('gl.INVALID_OPERATION is generated if mask contains any of the gl.DEPTH_BUFFER_BIT or gl.STENCIL_BUFFER_BIT and filter is not gl.NEAREST.');
    790                gl.blitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, gl.COLOR_BUFFER_BIT | gl.STENCIL_BUFFER_BIT, gl.LINEAR);
    791                this.expectError(gl.INVALID_OPERATION);
    792                gl.blitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT, gl.LINEAR);
    793                this.expectError(gl.INVALID_OPERATION);
    794                gl.blitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT, gl.LINEAR);
    795                this.expectError(gl.INVALID_OPERATION);
    796 
    797                bufferedLogToConsole('gl.INVALID_OPERATION is generated if mask contains gl.COLOR_BUFFER_BIT and read buffer format is incompatible with draw buffer format.');
    798                gl.bindTexture(gl.TEXTURE_2D, texture[0]);
    799 
    800                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32UI, 32, 32, 0, gl.RGBA_INTEGER, gl.UNSIGNED_INT, null);
    801                gl.framebufferTexture2D(gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture[0], 0);
    802                bufferedLogToConsole('// Read buffer: gl.RGBA32UI, draw buffer: gl.RGBA');
    803                gl.blitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, gl.COLOR_BUFFER_BIT, gl.NEAREST);
    804                this.expectError(gl.INVALID_OPERATION);
    805 
    806                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32I, 32, 32, 0, gl.RGBA_INTEGER, gl.INT, null);
    807                gl.framebufferTexture2D(gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture[0], 0);
    808                bufferedLogToConsole('// Read buffer: gl.RGBA32I, draw buffer: gl.RGBA');
    809                gl.blitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, gl.COLOR_BUFFER_BIT, gl.NEAREST);
    810                this.expectError(gl.INVALID_OPERATION);
    811 
    812                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, 32, 32, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    813                gl.framebufferTexture2D(gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture[0], 0);
    814                gl.bindTexture(gl.TEXTURE_2D, texture[1]);
    815                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32I, 32, 32, 0, gl.RGBA_INTEGER, gl.INT, null);
    816                gl.framebufferTexture2D(gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture[1], 0);
    817                bufferedLogToConsole('// Read buffer: gl.RGBA8, draw buffer: gl.RGBA32I');
    818                gl.blitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, gl.COLOR_BUFFER_BIT, gl.NEAREST);
    819                this.expectError(gl.INVALID_OPERATION);
    820 
    821                bufferedLogToConsole('gl.INVALID_OPERATION is generated if filter is gl.LINEAR and the read buffer contains integer data.');
    822                gl.bindTexture(gl.TEXTURE_2D, texture[0]);
    823                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32UI, 32, 32, 0, gl.RGBA_INTEGER, gl.UNSIGNED_INT, null);
    824                gl.framebufferTexture2D(gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture[0], 0);
    825                gl.bindTexture(gl.TEXTURE_2D, texture[1]);
    826                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA32UI, 32, 32, 0, gl.RGBA_INTEGER, gl.UNSIGNED_INT, null);
    827                gl.framebufferTexture2D(gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture[1], 0);
    828                bufferedLogToConsole('// Read buffer: gl.RGBA32UI, filter: gl.LINEAR');
    829                gl.blitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, gl.COLOR_BUFFER_BIT, gl.LINEAR);
    830                this.expectError(gl.INVALID_OPERATION);
    831 
    832                bufferedLogToConsole('gl.INVALID_OPERATION is generated if mask contains gl.DEPTH_BUFFER_BIT or gl.STENCIL_BUFFER_BIT and the source and destination depth and stencil formats do not match.');
    833                gl.bindRenderbuffer(gl.RENDERBUFFER, rbo[0]);
    834                gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH32F_STENCIL8, 32, 32);
    835                gl.framebufferRenderbuffer(gl.READ_FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, rbo[0]);
    836                gl.blitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, gl.DEPTH_BUFFER_BIT, gl.NEAREST);
    837                this.expectError(gl.INVALID_OPERATION);
    838                gl.blitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, gl.STENCIL_BUFFER_BIT, gl.NEAREST);
    839                this.expectError(gl.INVALID_OPERATION);
    840 
    841                gl.bindFramebuffer(gl.FRAMEBUFFER, null);
    842                gl.deleteFramebuffer(fbo[1]);
    843                gl.deleteFramebuffer(fbo[0]);
    844                gl.deleteTexture(texture[1]);
    845                gl.deleteTexture(texture[0]);
    846                gl.deleteRenderbuffer(rbo[1]);
    847                gl.deleteRenderbuffer(rbo[0]);
    848            }
    849        ));
    850 
    851        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    852            'blit_framebuffer_multisample', 'Invalid glBlitFramebuffer() usage', gl,
    853            function() {
    854 
    855                /** @type {Array<WebGLRenderbuffer>} */
    856                var rbo = [
    857                    gl.createRenderbuffer(), gl.createRenderbuffer()
    858                ];
    859                /** @type {Array<WebGLFramebuffer>} */
    860                var fbo = [
    861                    gl.createFramebuffer(), gl.createFramebuffer()
    862                ];
    863 
    864                gl.bindRenderbuffer(gl.RENDERBUFFER, rbo[0]);
    865                gl.bindFramebuffer(gl.READ_FRAMEBUFFER, fbo[0]);
    866                gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 4, gl.RGBA8, 32, 32);
    867                gl.framebufferRenderbuffer(gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo[0]);
    868                gl.checkFramebufferStatus(gl.READ_FRAMEBUFFER);
    869 
    870                gl.bindRenderbuffer(gl.RENDERBUFFER, rbo[1]);
    871                gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, fbo[1]);
    872                this.expectError(gl.NO_ERROR);
    873 
    874                bufferedLogToConsole('gl.INVALID_OPERATION is generated if the value of gl.SAMPLE_BUFFERS for the draw buffer is greater than zero.');
    875                gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 4, gl.RGBA8, 32, 32);
    876                gl.framebufferRenderbuffer(gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo[1]);
    877                gl.blitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, gl.COLOR_BUFFER_BIT, gl.NEAREST);
    878                this.expectError(gl.INVALID_OPERATION);
    879 
    880                bufferedLogToConsole('gl.INVALID_OPERATION is generated if gl.SAMPLE_BUFFERS for the read buffer is greater than zero and the formats of draw and read buffers are not identical.');
    881                gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, 32, 32);
    882                gl.framebufferRenderbuffer(gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo[1]);
    883                gl.blitFramebuffer(0, 0, 16, 16, 0, 0, 16, 16, gl.COLOR_BUFFER_BIT, gl.NEAREST);
    884                this.expectError(gl.INVALID_OPERATION);
    885 
    886                bufferedLogToConsole('gl.INVALID_OPERATION is generated if gl.SAMPLE_BUFFERS for the read buffer is greater than zero and the source and destination rectangles are not defined with the same (X0, Y0) and (X1, Y1) bounds.');
    887                gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA8, 32, 32);
    888                gl.framebufferRenderbuffer(gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo[1]);
    889                gl.blitFramebuffer(0, 0, 16, 16, 2, 2, 18, 18, gl.COLOR_BUFFER_BIT, gl.NEAREST);
    890                this.expectError(gl.INVALID_OPERATION);
    891 
    892                gl.bindFramebuffer(gl.FRAMEBUFFER, null);
    893                gl.deleteRenderbuffer(rbo[0]);
    894                gl.deleteRenderbuffer(rbo[1]);
    895                gl.deleteFramebuffer(fbo[0]);
    896                gl.deleteFramebuffer(fbo[1]);
    897            }
    898        ));
    899 
    900        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    901            'framebuffer_texture_layer', 'Invalid glFramebufferTextureLayer() usage', gl,
    902            function() {
    903 
    904                var fbo = gl.createFramebuffer();
    905                var tex3D = gl.createTexture();
    906                var tex2DArray = gl.createTexture();
    907                var tex2D = gl.createTexture();
    908                gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    909 
    910                gl.bindTexture(gl.TEXTURE_3D, tex3D);
    911                gl.texImage3D(gl.TEXTURE_3D, 0, gl.RGBA, 4, 4, 4, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    912                gl.bindTexture(gl.TEXTURE_2D_ARRAY, tex2DArray);
    913                gl.texImage3D(gl.TEXTURE_2D_ARRAY, 0, gl.RGBA, 4, 4, 4, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    914                gl.bindTexture(gl.TEXTURE_2D, tex2D);
    915                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 4, 4, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    916                this.expectError(gl.NO_ERROR);
    917 
    918                bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not one of the accepted tokens.');
    919                gl.framebufferTextureLayer(-1, gl.COLOR_ATTACHMENT0, tex3D, 0, 1);
    920                this.expectError(gl.INVALID_ENUM);
    921                gl.framebufferTextureLayer(gl.RENDERBUFFER, gl.COLOR_ATTACHMENT0, tex3D, 0, 1);
    922                this.expectError(gl.INVALID_ENUM);
    923 
    924                bufferedLogToConsole('gl.INVALID_ENUM is generated if attachment is not one of the accepted tokens.');
    925                gl.framebufferTextureLayer(gl.FRAMEBUFFER, -1, tex3D, 0, 1);
    926                this.expectError(gl.INVALID_ENUM);
    927                gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.BACK, tex3D, 0, 1);
    928                this.expectError(gl.INVALID_ENUM);
    929 
    930                bufferedLogToConsole('gl.INVALID_OPERATION is generated if texture is non-zero and not the name of a 3D texture or 2D array texture.');
    931                gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, tex2D, 0, 0);
    932                this.expectError(gl.INVALID_OPERATION);
    933 
    934                bufferedLogToConsole('gl.INVALID_VALUE is generated if texture is not zero and layer is negative.');
    935                gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, tex3D, 0, -1);
    936                this.expectError(gl.INVALID_VALUE);
    937 
    938                bufferedLogToConsole('gl.INVALID_VALUE is generated if texture is not zero and layer is greater than gl.MAX_3D_TEXTURE_SIZE-1 for a 3D texture.');
    939                var max3DTexSize = /** @type {number} */ (gl.getParameter(gl.MAX_3D_TEXTURE_SIZE));
    940                gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, tex3D, 0, max3DTexSize);
    941                this.expectError(gl.INVALID_VALUE);
    942 
    943                bufferedLogToConsole('gl.INVALID_VALUE is generated if texture is not zero and layer is greater than gl.MAX_ARRAY_TEXTURE_LAYERS-1 for a 2D array texture.');
    944                var maxArrayTexLayers = /** @type {number} */ (gl.getParameter(gl.MAX_ARRAY_TEXTURE_LAYERS));
    945                gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, tex2DArray, 0, maxArrayTexLayers);
    946                this.expectError(gl.INVALID_VALUE);
    947 
    948                bufferedLogToConsole('gl.INVALID_OPERATION is generated if zero is bound to target.');
    949                gl.bindFramebuffer(gl.FRAMEBUFFER, null);
    950                gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, tex3D, 0, 1);
    951                this.expectError(gl.INVALID_OPERATION);
    952 
    953                gl.deleteTexture(tex3D);
    954                gl.deleteTexture(tex2DArray);
    955                gl.deleteTexture(tex2D);
    956                gl.deleteFramebuffer(fbo);
    957            }
    958        ));
    959 
    960        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    961            'invalidate_framebuffer', 'Invalid gl.invalidateFramebuffer() usage', gl,
    962            function() {
    963                var maxColorAttachments = /** @type {number} */ (gl.getParameter(gl.MAX_COLOR_ATTACHMENTS));
    964                var attachments = [
    965                    gl.COLOR_ATTACHMENT0
    966                ];
    967 
    968                var fbo = gl.createFramebuffer();
    969                gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    970 
    971                var texture = gl.createTexture();
    972                gl.bindTexture(gl.TEXTURE_2D, texture);
    973                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 32, 32, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
    974 
    975                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
    976                gl.checkFramebufferStatus(gl.FRAMEBUFFER);
    977                this.expectError(gl.NO_ERROR);
    978 
    979                bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not gl.FRAMEBUFFER, gl.READ_FRAMEBUFFER or gl.DRAW_FRAMEBUFFER.');
    980                gl.invalidateFramebuffer(-1, attachments);
    981                this.expectError(gl.INVALID_ENUM);
    982                gl.invalidateFramebuffer(gl.BACK, attachments);
    983                this.expectError(gl.INVALID_ENUM);
    984 
    985                bufferedLogToConsole('gl.INVALID_OPERATION is generated if attachments contains gl.COLOR_ATTACHMENTm and m is greater than or equal to the value of gl.MAX_COLOR_ATTACHMENTS.');
    986                gl.invalidateFramebuffer(gl.FRAMEBUFFER, [gl.COLOR_ATTACHMENT0 + maxColorAttachments]);
    987                this.expectError(gl.INVALID_OPERATION);
    988 
    989                gl.deleteTexture(texture);
    990                gl.deleteFramebuffer(fbo);
    991            }
    992        ));
    993 
    994        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
    995            'invalidate_sub_framebuffer', 'Invalid gl.invalidateSubFramebuffer() usage', gl,
    996            function() {
    997                var fbo = gl.createFramebuffer();
    998                gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    999 
   1000                var texture = gl.createTexture();
   1001                gl.bindTexture(gl.TEXTURE_2D, texture);
   1002                gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 32, 32, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
   1003 
   1004                gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
   1005                gl.checkFramebufferStatus(gl.FRAMEBUFFER);
   1006                this.expectError(gl.NO_ERROR);
   1007 
   1008                var maxColorAttachments = /** @type {number} */ (gl.getParameter(gl.MAX_COLOR_ATTACHMENTS));
   1009                var att0 = [gl.COLOR_ATTACHMENT0];
   1010                var attm = [gl.COLOR_ATTACHMENT0 + maxColorAttachments];
   1011 
   1012                bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not gl.FRAMEBUFFER, gl.READ_FRAMEBUFFER or gl.DRAW_FRAMEBUFFER.');
   1013                gl.invalidateSubFramebuffer(-1, att0, 0, 0, 16, 16);
   1014                this.expectError(gl.INVALID_ENUM);
   1015                gl.invalidateSubFramebuffer(gl.BACK, att0, 0, 0, 16, 16);
   1016                this.expectError(gl.INVALID_ENUM);
   1017 
   1018                bufferedLogToConsole('gl.INVALID_OPERATION is generated if attachments contains gl.COLOR_ATTACHMENTm and m is greater than or equal to the value of gl.MAX_COLOR_ATTACHMENTS.');
   1019                gl.invalidateSubFramebuffer(gl.FRAMEBUFFER, attm, 0, 0, 16, 16);
   1020                this.expectError(gl.INVALID_OPERATION);
   1021 
   1022                gl.deleteFramebuffer(fbo);
   1023            }
   1024        ));
   1025 
   1026        testGroup.addChild(new es3fApiCase.ApiCaseCallback(
   1027            'renderbuffer_storage_multisample', 'Invalid glRenderbufferStorageMultisample() usage', gl,
   1028            function() {
   1029 
   1030                var rbo = gl.createRenderbuffer();
   1031                gl.bindRenderbuffer(gl.RENDERBUFFER, rbo);
   1032                /** @type {Int32Array} */ var samplesSupportedRGBA4 = /** @type {Int32Array} */ gl.getInternalformatParameter(gl.RENDERBUFFER, gl.RGBA4, gl.SAMPLES);
   1033                // supported samples are written in descending numeric order, so the first one is the max samples
   1034                var maxSamplesSupportedRGBA4 = samplesSupportedRGBA4[0];
   1035 
   1036                bufferedLogToConsole('gl.INVALID_ENUM is generated if target is not gl.RENDERBUFFER.');
   1037                gl.renderbufferStorageMultisample(-1, 2, gl.RGBA4, 1, 1);
   1038                this.expectError(gl.INVALID_ENUM);
   1039                gl.renderbufferStorageMultisample(gl.FRAMEBUFFER, 2, gl.RGBA4, 1, 1);
   1040                this.expectError(gl.INVALID_ENUM);
   1041 
   1042                bufferedLogToConsole('gl.INVALID_OPERATION is generated if samples is greater than the maximum number of samples supported for internalformat.');
   1043                gl.renderbufferStorageMultisample(gl.RENDERBUFFER, maxSamplesSupportedRGBA4 + 1, gl.RGBA4, 1, 1);
   1044                this.expectError(gl.INVALID_OPERATION);
   1045 
   1046                bufferedLogToConsole('gl.INVALID_ENUM is generated if internalformat is not a color-renderable, depth-renderable, or stencil-renderable format.');
   1047                gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 2, -1, 1, 1);
   1048                this.expectError(gl.INVALID_ENUM);
   1049 
   1050                // EXT_color_buffer_half_float disables error
   1051                if (gl.getExtension('EXT_color_buffer_half_float') === null) {
   1052                    gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 2, gl.RGB16F, 1, 1);
   1053                    this.expectError(gl.INVALID_ENUM);
   1054                }
   1055                gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 2, gl.RGBA8_SNORM, 1, 1);
   1056                this.expectError(gl.INVALID_ENUM);
   1057 
   1058                bufferedLogToConsole('gl.INVALID_VALUE is generated if width or height is less than zero.');
   1059                gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 2, gl.RGBA4, -1, 1);
   1060                this.expectError(gl.INVALID_VALUE);
   1061                gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 2, gl.RGBA4, 1, -1);
   1062                this.expectError(gl.INVALID_VALUE);
   1063                gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 2, gl.RGBA4, -1, -1);
   1064                this.expectError(gl.INVALID_VALUE);
   1065 
   1066                bufferedLogToConsole('gl.INVALID_VALUE is generated if width or height is greater than gl.MAX_RENDERBUFFER_SIZE.');
   1067                var maxSize = /** @type {number} */ (gl.getParameter(gl.MAX_RENDERBUFFER_SIZE));
   1068                gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 4, gl.RGBA4, 1, maxSize + 1);
   1069                this.expectError(gl.INVALID_VALUE);
   1070                gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 4, gl.RGBA4, maxSize + 1, 1);
   1071                this.expectError(gl.INVALID_VALUE);
   1072                gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 4, gl.RGBA4, maxSize + 1, maxSize + 1);
   1073                this.expectError(gl.INVALID_VALUE);
   1074 
   1075                gl.deleteRenderbuffer(rbo);
   1076            }
   1077        ));
   1078 
   1079    };
   1080 
   1081    /**
   1082    * @param {WebGL2RenderingContext} gl
   1083    */
   1084    es3fNegativeBufferApiTests.run = function(gl) {
   1085        var testName = 'negativeBufferApi';
   1086        var testDescription = 'Negative Buffer API tests';
   1087        var state = tcuTestCase.runner;
   1088 
   1089        state.testName = testName;
   1090        state.testCases = tcuTestCase.newTest(testName, testDescription, null);
   1091 
   1092        //Set up name and description of this test series.
   1093        setCurrentTestName(testName);
   1094        description(testDescription);
   1095        try {
   1096            es3fNegativeBufferApiTests.init(gl);
   1097            tcuTestCase.runner.runCallback(tcuTestCase.runTestCases);
   1098        } catch (err) {
   1099            bufferedLogToConsole(err);
   1100            tcuTestCase.runner.terminate();
   1101        }
   1102    };
   1103 
   1104 });