tor-browser

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

es3fPixelBufferObjectTest.js (23875B)


      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 'use strict';
     21 goog.provide('functional.gles3.es3fPixelBufferObjectTest');
     22 goog.require('framework.common.tcuImageCompare');
     23 goog.require('framework.common.tcuTestCase');
     24 goog.require('framework.common.tcuTexture');
     25 goog.require('framework.common.tcuTextureUtil');
     26 goog.require('framework.delibs.debase.deRandom');
     27 goog.require('framework.delibs.debase.deString');
     28 goog.require('framework.opengl.gluShaderProgram');
     29 goog.require('framework.opengl.gluTextureUtil');
     30 
     31 goog.scope(function() {
     32 
     33 var es3fPixelBufferObjectTest = functional.gles3.es3fPixelBufferObjectTest;
     34 var gluShaderProgram = framework.opengl.gluShaderProgram;
     35 var tcuTestCase = framework.common.tcuTestCase;
     36 var deRandom = framework.delibs.debase.deRandom;
     37 var deString = framework.delibs.debase.deString;
     38 var tcuTextureUtil = framework.common.tcuTextureUtil;
     39 var tcuTexture = framework.common.tcuTexture;
     40 var gluTextureUtil = framework.opengl.gluTextureUtil;
     41 var tcuImageCompare = framework.common.tcuImageCompare;
     42 
     43    var DE_ASSERT = function(x) {
     44        if (!x)
     45            throw new Error('Assert failed');
     46    };
     47 
     48    es3fPixelBufferObjectTest.DE_STATIC_ASSERT = function(expression) {
     49        if (!expression) throw new Error('Assert failed');
     50    };
     51 
     52    /** @enum */
     53    es3fPixelBufferObjectTest.FramebufferType = {
     54        FRAMEBUFFERTYPE_NATIVE: 0,
     55        FRAMEBUFFERTYPE_RENDERBUFFER: 1
     56    };
     57 
     58    /**
     59     * @constructor
     60     * @struct
     61     */
     62    es3fPixelBufferObjectTest.TestSpec = function() { // This is originaly a struct
     63        this.name = '';
     64        this.description = '';
     65        this.useColorClear = false;
     66        this.renderTriangles = false;
     67        /** @type {es3fPixelBufferObjectTest.FramebufferType} */ this.framebufferType;
     68        /** @type {number} */ this.renderbufferFormat;
     69    };
     70 
     71    /**
     72     * @constructor
     73     * @extends {tcuTestCase.DeqpTest}
     74     * @param {es3fPixelBufferObjectTest.TestSpec} spec
     75     */
     76    es3fPixelBufferObjectTest.ReadPixelsTest = function(spec) {
     77        tcuTestCase.DeqpTest.call(this, spec.name, spec.description);
     78        this.m_random = new deRandom.Random(deString.deStringHash(spec.name));
     79        this.m_program = null;
     80        this.m_framebuffeType = spec.framebufferType;
     81        this.m_renderbufferFormat = spec.renderbufferFormat;
     82        this.m_texChannelClass = undefined;
     83        this.m_useColorClears = spec.useColorClear;
     84        this.m_renderTriangles = spec.renderTriangles;
     85        this.m_colorScale = 1.0;
     86 
     87        if (this.m_framebuffeType === es3fPixelBufferObjectTest.FramebufferType.FRAMEBUFFERTYPE_NATIVE) {
     88            this.m_colorScale = 1.0;
     89        } else if (this.m_framebuffeType === es3fPixelBufferObjectTest.FramebufferType.FRAMEBUFFERTYPE_RENDERBUFFER) {
     90            this.m_texChannelClass = tcuTexture.getTextureChannelClass(gluTextureUtil.mapGLInternalFormat(spec.renderbufferFormat).type);
     91            switch (this.m_texChannelClass) {
     92                case tcuTexture.TextureChannelClass.UNSIGNED_FIXED_POINT:
     93                    this.m_colorScale = 1.0;
     94                    break;
     95                case tcuTexture.TextureChannelClass.SIGNED_INTEGER:
     96                    this.m_colorScale = 100.0;
     97                    break;
     98                case tcuTexture.TextureChannelClass.UNSIGNED_INTEGER:
     99                    this.m_colorScale = 100.0;
    100                    break;
    101                case tcuTexture.TextureChannelClass.FLOATING_POINT:
    102                    this.m_colorScale = 100.0;
    103                    break;
    104                default:
    105                    DE_ASSERT(false);
    106            }
    107        } else {
    108            DE_ASSERT(false);
    109        }
    110    };
    111 
    112    es3fPixelBufferObjectTest.ReadPixelsTest.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
    113    es3fPixelBufferObjectTest.ReadPixelsTest.prototype.constructor = es3fPixelBufferObjectTest.ReadPixelsTest;
    114 
    115    es3fPixelBufferObjectTest.ReadPixelsTest.prototype.init = function() {
    116        var outtype = '';
    117 
    118        if (this.m_framebuffeType === es3fPixelBufferObjectTest.FramebufferType.FRAMEBUFFERTYPE_NATIVE)
    119            outtype = 'vec4';
    120        else if (this.m_framebuffeType === es3fPixelBufferObjectTest.FramebufferType.FRAMEBUFFERTYPE_RENDERBUFFER) {
    121            switch (this.m_texChannelClass) {
    122                case tcuTexture.TextureChannelClass.UNSIGNED_FIXED_POINT:
    123                    outtype = 'vec4';
    124                    break;
    125                case tcuTexture.TextureChannelClass.SIGNED_INTEGER:
    126                    outtype = 'ivec4';
    127                    break;
    128                case tcuTexture.TextureChannelClass.UNSIGNED_INTEGER:
    129                    outtype = 'uvec4';
    130                    break;
    131                case tcuTexture.TextureChannelClass.FLOATING_POINT:
    132                    outtype = 'vec4';
    133                    break;
    134                default:
    135                    DE_ASSERT(false);
    136            }
    137        } else
    138            DE_ASSERT(false);
    139 
    140        /** @type {string} */ var vertexShaderSource =
    141        '#version 300 es\n' +
    142        'in mediump vec3 a_position;\n' +
    143        'in mediump vec4 a_color;\n' +
    144        'uniform mediump float u_colorScale;\n' +
    145        'out mediump vec4 v_color;\n' +
    146        'void main(void)\n' +
    147        ' {\n' +
    148        '\tgl_Position = vec4(a_position, 1.0);\n' +
    149        '\tv_color = u_colorScale * a_color;\n' +
    150        '}';
    151 
    152        /** @type {string} */ var fragmentShaderSource =
    153        '#version 300 es\n' +
    154        'in mediump vec4 v_color;\n' +
    155        'layout (location = 0) out mediump ' +
    156        outtype +
    157        ' o_color;\n' +
    158        'void main(void)\n' +
    159        ' {\n' +
    160        '\to_color = ' +
    161        outtype +
    162        '(v_color);\n' +
    163        '}';
    164 
    165        this.m_program = new gluShaderProgram.ShaderProgram(gl, gluShaderProgram.makeVtxFragSources(vertexShaderSource, fragmentShaderSource));
    166 
    167        if (!this.m_program.isOk())
    168            throw new Error('Compile failed. Program not created');
    169 
    170    };
    171 
    172    /**
    173     * @param {Array<number>} a
    174     * @param {Array<number>} b
    175     * @param {Array<number>} c
    176     */
    177    es3fPixelBufferObjectTest.ReadPixelsTest.prototype.renderTriangle = function(a, b, c) {
    178 
    179        var positions = new Float32Array(36);
    180 
    181        positions[0] = a[0];
    182        positions[1] = a[1];
    183        positions[2] = a[2];
    184 
    185        positions[3] = b[0];
    186        positions[4] = b[1];
    187        positions[5] = b[2];
    188 
    189        positions[6] = c[0];
    190        positions[7] = c[1];
    191        positions[8] = c[2];
    192 
    193        var colors = new Float32Array([
    194            1.0, 0.0, 0.0, 1.0,
    195            0.0, 1.0, 0.0, 1.0,
    196            0.0, 0.0, 1.0, 1.0]);
    197 
    198        gl.useProgram(this.m_program.getProgram());
    199        assertMsgOptions(gl.getError() === gl.NO_ERROR, 'useProgram failed ', false, true);
    200 
    201        /** @type {WebGLUniformLocation} */ var colorScaleLoc = gl.getUniformLocation(this.m_program.getProgram(), 'u_colorScale');
    202        assertMsgOptions(colorScaleLoc != -1, 'Could not find u_colorScale ', false, true);
    203 
    204        gl.uniform1f(colorScaleLoc, this.m_colorScale);
    205 
    206        /** @type {number} */ var coordLoc = gl.getAttribLocation(this.m_program.getProgram(), 'a_position');
    207        assertMsgOptions(coordLoc != -1, 'Could not find a_position ', false, true);
    208 
    209        /** @type {number} */ var colorLoc = gl.getAttribLocation(this.m_program.getProgram(), 'a_color');
    210        assertMsgOptions(colorLoc != -1, 'Could not find a_color ', false, true);
    211 
    212        gl.enableVertexAttribArray(colorLoc);
    213        assertMsgOptions(gl.getError() === gl.NO_ERROR, 'enableVertexAttribArray failed ', false, true);
    214        gl.enableVertexAttribArray(coordLoc);
    215        assertMsgOptions(gl.getError() === gl.NO_ERROR, 'enableVertexAttribArray failed ', false, true);
    216 
    217        var pos = gl.createBuffer();
    218        gl.bindBuffer(gl.ARRAY_BUFFER, pos);
    219        gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);
    220        gl.vertexAttribPointer(coordLoc, 3, gl.FLOAT, false, 0, 0);
    221 
    222        var c = gl.createBuffer();
    223        gl.bindBuffer(gl.ARRAY_BUFFER, c);
    224        gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
    225        gl.vertexAttribPointer(colorLoc, 4, gl.FLOAT, false, 0, 0);
    226 
    227        gl.drawArrays(gl.TRIANGLES, 0, 3);
    228 
    229        gl.disableVertexAttribArray(colorLoc);
    230        gl.disableVertexAttribArray(coordLoc);
    231    };
    232 
    233    /**
    234     * @param {number} r
    235     * @param {number} g
    236     * @param {number} b
    237     * @param {number} a
    238     */
    239 
    240    es3fPixelBufferObjectTest.ReadPixelsTest.prototype.clearColor = function(r, g, b, a) {
    241        if (this.m_framebuffeType == es3fPixelBufferObjectTest.FramebufferType.FRAMEBUFFERTYPE_NATIVE) {
    242            gl.clearColor(r, g, b, a);
    243            gl.clear(gl.COLOR_BUFFER_BIT);
    244        } else if (this.m_framebuffeType == es3fPixelBufferObjectTest.FramebufferType.FRAMEBUFFERTYPE_RENDERBUFFER) {
    245            switch (this.m_texChannelClass) {
    246                case tcuTexture.TextureChannelClass.UNSIGNED_FIXED_POINT:
    247                    gl.clearColor(r, g, b, a);
    248                    gl.clear(gl.COLOR_BUFFER_BIT);
    249                    break;
    250                case tcuTexture.TextureChannelClass.SIGNED_INTEGER:
    251                    gl.clearBufferiv(gl.COLOR, 0, new Int32Array([r, g, b, a]));
    252                    break;
    253                case tcuTexture.TextureChannelClass.UNSIGNED_INTEGER:
    254                    gl.clearBufferuiv(gl.COLOR, 0, new Uint32Array([r, g, b, a]));
    255                    break;
    256                case tcuTexture.TextureChannelClass.FLOATING_POINT:
    257                    gl.clearBufferfv(gl.COLOR, 0, new Float32Array([r, g, b, a]));
    258                    break;
    259                default:
    260                    DE_ASSERT(false);
    261            }
    262        } else
    263          DE_ASSERT(false);
    264 
    265    };
    266 
    267    es3fPixelBufferObjectTest.ReadPixelsTest.prototype.iterate = function() {
    268        var width = gl.drawingBufferWidth;
    269        var height = gl.drawingBufferHeight;
    270 
    271        var framebuffer = null;
    272        var renderbuffer = null;
    273 
    274        switch (this.m_framebuffeType) {
    275            case es3fPixelBufferObjectTest.FramebufferType.FRAMEBUFFERTYPE_NATIVE:
    276                gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
    277                break;
    278            case es3fPixelBufferObjectTest.FramebufferType.FRAMEBUFFERTYPE_RENDERBUFFER:
    279                framebuffer = gl.createFramebuffer();
    280                renderbuffer = gl.createRenderbuffer();
    281 
    282                gl.bindRenderbuffer(gl.RENDERBUFFER, renderbuffer);
    283                gl.renderbufferStorage(gl.RENDERBUFFER, this.m_renderbufferFormat, width, height);
    284 
    285                gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
    286                gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, renderbuffer);
    287                break;
    288        }
    289 
    290        this.clearColor(this.m_colorScale * 0.4, this.m_colorScale * 1.0, this.m_colorScale * 0.5, this.m_colorScale * 1.0);
    291 
    292        if (this.m_useColorClears) {
    293            /** @type {number} */ var maxClearCount = 10;
    294            /** @type {number} */ var minClearCount = 6;
    295            /** @type {number} */ var minClearSize = 15;
    296 
    297            /** @type {number} */ var clearCount = this.m_random.getInt(minClearCount, maxClearCount);
    298 
    299            for (var clearNdx = 0; clearNdx < clearCount; clearNdx++) {
    300                /** @type {number} */ var clearX = this.m_random.getInt(0, width - minClearSize);
    301                /** @type {number} */ var clearY = this.m_random.getInt(0, height - minClearSize);
    302 
    303                /** @type {number} */ var clearWidth = this.m_random.getInt(minClearSize, width - clearX);
    304                /** @type {number} */ var clearHeight = this.m_random.getInt(minClearSize, height - clearY);
    305 
    306                /** @type {number} */ var clearRed = this.m_colorScale * this.m_random.getFloat();
    307                /** @type {number} */ var clearGreen = this.m_colorScale * this.m_random.getFloat();
    308                /** @type {number} */ var clearBlue = this.m_colorScale * this.m_random.getFloat();
    309                /** @type {number} */ var clearAlpha = this.m_colorScale * (0.5 + 0.5 * this.m_random.getFloat());
    310 
    311                gl.enable(gl.SCISSOR_TEST);
    312                gl.scissor(clearX, clearY, clearWidth, clearHeight);
    313 
    314                this.clearColor(clearRed, clearGreen, clearBlue, clearAlpha);
    315            }
    316 
    317            gl.disable(gl.SCISSOR_TEST);
    318 
    319        }
    320 
    321        if (this.m_renderTriangles) {
    322            /** @type {number} */ var minTriangleCount = 4;
    323            /** @type {number} */ var maxTriangleCount = 10;
    324 
    325            /** @type {number} */ var triangleCount = this.m_random.getInt(minTriangleCount, maxTriangleCount);
    326 
    327            for (var triangleNdx = 0; triangleNdx < triangleCount; triangleNdx++) {
    328                /** @type {number} */ var x1 = 2.0 * this.m_random.getFloat() - 1.0;
    329                /** @type {number} */ var y1 = 2.0 * this.m_random.getFloat() - 1.0;
    330                /** @type {number} */ var z1 = 2.0 * this.m_random.getFloat() - 1.0;
    331 
    332                /** @type {number} */ var x2 = 2.0 * this.m_random.getFloat() - 1.0;
    333                /** @type {number} */ var y2 = 2.0 * this.m_random.getFloat() - 1.0;
    334                /** @type {number} */ var z2 = 2.0 * this.m_random.getFloat() - 1.0;
    335 
    336                /** @type {number} */ var x3 = 2.0 * this.m_random.getFloat() - 1.0;
    337                /** @type {number} */ var y3 = 2.0 * this.m_random.getFloat() - 1.0;
    338                /** @type {number} */ var z3 = 2.0 * this.m_random.getFloat() - 1.0;
    339 
    340                this.renderTriangle([x1, y1, z1], [x2, y2, z2], [x3, y3, z3]);
    341            }
    342        }
    343 
    344        /** @type {tcuTexture.TextureFormat} */ var readFormat;
    345        /** @type {number} */ var readPixelsFormat;
    346        /** @type {number} */ var readPixelsType;
    347        /** @type {boolean} */ var floatCompare;
    348 
    349        if (this.m_framebuffeType == es3fPixelBufferObjectTest.FramebufferType.FRAMEBUFFERTYPE_NATIVE) {
    350            readFormat = gluTextureUtil.mapGLTransferFormat(gl.RGBA, gl.UNSIGNED_BYTE);
    351            readPixelsFormat = gl.RGBA;
    352            readPixelsType = gl.UNSIGNED_BYTE;
    353            floatCompare = false;
    354        } else if (this.m_framebuffeType == es3fPixelBufferObjectTest.FramebufferType.FRAMEBUFFERTYPE_RENDERBUFFER) {
    355            switch (this.m_texChannelClass) {
    356                case tcuTexture.TextureChannelClass.UNSIGNED_FIXED_POINT:
    357                    readFormat = gluTextureUtil.mapGLTransferFormat(gl.RGBA, gl.UNSIGNED_BYTE);
    358                    readPixelsFormat = gl.RGBA;
    359                    readPixelsType = gl.UNSIGNED_BYTE;
    360                    floatCompare = true;
    361                    break;
    362                case tcuTexture.TextureChannelClass.SIGNED_INTEGER:
    363                    readFormat = gluTextureUtil.mapGLTransferFormat(gl.RGBA_INTEGER, gl.INT);
    364                    readPixelsFormat = gl.RGBA_INTEGER;
    365                    readPixelsType = gl.INT;
    366                    floatCompare = false;
    367                    break;
    368                case tcuTexture.TextureChannelClass.UNSIGNED_INTEGER:
    369                    readFormat = gluTextureUtil.mapGLTransferFormat(gl.RGBA_INTEGER, gl.UNSIGNED_INT);
    370                    readPixelsFormat = gl.RGBA_INTEGER;
    371                    readPixelsType = gl.UNSIGNED_INT;
    372                    floatCompare = false;
    373                    break;
    374                case tcuTexture.TextureChannelClass.FLOATING_POINT:
    375                    readFormat = gluTextureUtil.mapGLTransferFormat(gl.RGBA, gl.FLOAT);
    376                    readPixelsFormat = gl.RGBA;
    377                    readPixelsType = gl.FLOAT;
    378                    floatCompare = true;
    379                    break;
    380                default:
    381                    DE_ASSERT(false);
    382                    // Silence warning
    383                    readFormat = gluTextureUtil.mapGLTransferFormat(gl.RGBA, gl.FLOAT);
    384                    readPixelsFormat = gl.RGBA;
    385                    readPixelsType = gl.FLOAT;
    386                    floatCompare = true;
    387            }
    388        } else {
    389            // Silence warnings
    390            readFormat = gluTextureUtil.mapGLTransferFormat(gl.RGBA, gl.FLOAT);
    391            readPixelsFormat = gl.RGBA;
    392            readPixelsType = gl.FLOAT;
    393            floatCompare = true;
    394            DE_ASSERT(false);
    395        }
    396 
    397        var readReference = new tcuTexture.Texture2D(readFormat, width, height);
    398        readReference.allocLevel(0);
    399 
    400        var pixelBuffer = gl.createBuffer();
    401 
    402        gl.bindBuffer(gl.PIXEL_PACK_BUFFER, pixelBuffer);
    403        gl.bufferData(gl.PIXEL_PACK_BUFFER, readReference.getLevel(0).getDataSize(), gl.STREAM_READ);
    404        gl.readPixels(0, 0, width, height, readPixelsFormat, readPixelsType, 0);
    405 
    406        var bufferData = new Uint8Array(readReference.getLevel(0).getDataSize());
    407 
    408        gl.getBufferSubData(gl.PIXEL_PACK_BUFFER, 0, bufferData);
    409 
    410        var readResult = new tcuTexture.ConstPixelBufferAccess({
    411            width: width,
    412            height: height,
    413            format: readFormat,
    414            data: bufferData.buffer});
    415 
    416        gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);
    417 
    418        gl.readPixels(0, 0, width, height, readPixelsFormat, readPixelsType, readReference.getLevel(0).getDataPtr());
    419 
    420        if (framebuffer)
    421            gl.deleteFramebuffer(framebuffer);
    422 
    423        if (renderbuffer)
    424            gl.deleteRenderbuffer(renderbuffer);
    425 
    426        var isOk = false;
    427 
    428        if (floatCompare) {
    429            // When converting between integers and floats, certain GPUs might have different behaviors
    430            // from javascript in rounding (up vs down). Increase tolerance to allow both behaviors.
    431            // Detailed discussion in Mesa upstream can be found at:
    432            //   https://bugs.freedesktop.org/show_bug.cgi?id=89314.
    433            var threshold;
    434            switch (this.m_renderbufferFormat) {
    435              case gl.RGB10_A2:
    436              case gl.RGB5_A1:
    437              case gl.RGB565:
    438                threshold = [0.004, 0.004, 0.004, 0.0];
    439                break;
    440              default:
    441                threshold = [0.0, 0.0, 0.0, 0.0];
    442                break;
    443            }
    444            isOk = tcuImageCompare.floatThresholdCompare('Result comparison', 'Result of read pixels to memory compared with result of read pixels to buffer', readReference.getLevel(0), readResult, threshold);
    445        }
    446        else
    447            isOk = tcuImageCompare.intThresholdCompare('Result comparison', 'Result of read pixels to memory compared with result of read pixels to buffer', readReference.getLevel(0), readResult, [0, 0, 0, 0]);
    448 
    449        gl.deleteBuffer(pixelBuffer);
    450 
    451        assertMsgOptions(isOk, this.getDescription(), true, true);
    452 
    453        return tcuTestCase.IterateResult.STOP;
    454    };
    455 
    456    es3fPixelBufferObjectTest.init = function() {
    457        var state = tcuTestCase.runner;
    458        /** @type {tcuTestCase.DeqpTest} */ var testGroup = state.testCases;
    459 
    460        /** @type {tcuTestCase.DeqpTest} */ var nativeFramebufferGroup = tcuTestCase.newTest('native', 'Tests with reading from native framebuffer');
    461 
    462        var nativeFramebufferTests = [{
    463                name: 'clears',
    464                description: 'Simple read pixels test with color clears',
    465                useColorClear: true,
    466                renderTriangles: false,
    467                framebufferType: es3fPixelBufferObjectTest.FramebufferType.FRAMEBUFFERTYPE_NATIVE,
    468                renderbufferFormat: gl.NONE
    469            }, {
    470                name: 'triangles',
    471                description: 'Simple read pixels test rendering triangles',
    472                useColorClear: false,
    473                renderTriangles: true,
    474                framebufferType: es3fPixelBufferObjectTest.FramebufferType.FRAMEBUFFERTYPE_NATIVE,
    475                renderbufferFormat: gl.NONE
    476            }
    477        ];
    478 
    479        for (var testNdx = 0; testNdx < nativeFramebufferTests.length; testNdx++)
    480            nativeFramebufferGroup.addChild(new es3fPixelBufferObjectTest.ReadPixelsTest(nativeFramebufferTests[testNdx]));
    481 
    482        testGroup.addChild(nativeFramebufferGroup);
    483 
    484        /** @type {tcuTestCase.DeqpTest} */ var renderbufferGroup = tcuTestCase.newTest('renderbuffer', 'Tests with reading from renderbuffer');
    485 
    486        var renderbufferFormats = [
    487            gl.RGBA8,
    488            gl.RGBA8I,
    489            gl.RGBA8UI,
    490            gl.RGBA16I,
    491            gl.RGBA16UI,
    492            gl.RGBA32I,
    493            gl.RGBA32UI,
    494 
    495            gl.SRGB8_ALPHA8,
    496            gl.RGB10_A2,
    497            gl.RGB10_A2UI,
    498            gl.RGBA4,
    499            gl.RGB5_A1,
    500 
    501            gl.RGB8,
    502            gl.RGB565,
    503 
    504            gl.RG8,
    505            gl.RG8I,
    506            gl.RG8UI,
    507            gl.RG16I,
    508            gl.RG16UI,
    509            gl.RG32I,
    510            gl.RG32UI
    511        ];
    512 
    513        var renderbufferFormatsStr = [
    514            'rgba8',
    515            'rgba8i',
    516            'rgba8ui',
    517            'rgba16i',
    518            'rgba16ui',
    519            'rgba32i',
    520            'rgba32ui',
    521 
    522            'srgb8_alpha8',
    523            'rgb10_a2',
    524            'rgb10_a2ui',
    525            'rgba4',
    526            'rgb5_a1',
    527 
    528            'rgb8',
    529            'rgb565',
    530 
    531            'rg8',
    532            'rg8i',
    533            'rg8ui',
    534            'rg16i',
    535            'rg16ui',
    536            'rg32i',
    537            'rg32ui'
    538        ];
    539        es3fPixelBufferObjectTest.DE_STATIC_ASSERT(renderbufferFormatsStr.length == renderbufferFormats.length);
    540 
    541        for (var formatNdx = 0; formatNdx < renderbufferFormats.length; formatNdx++) {
    542            for (var trianglesClears = 0; trianglesClears < 2; trianglesClears++) {
    543                var nameDescription = renderbufferFormatsStr[formatNdx] + '_' + (trianglesClears == 0 ? 'triangles' : 'clears');
    544                var testSpec = new es3fPixelBufferObjectTest.TestSpec();
    545                testSpec.name = nameDescription;
    546                testSpec.description = nameDescription;
    547                testSpec.useColorClear = trianglesClears == 1;
    548                testSpec.renderTriangles = trianglesClears == 0;
    549                testSpec.framebufferType = es3fPixelBufferObjectTest.FramebufferType.FRAMEBUFFERTYPE_RENDERBUFFER;
    550                testSpec.renderbufferFormat = renderbufferFormats[formatNdx];
    551 
    552                renderbufferGroup.addChild(new es3fPixelBufferObjectTest.ReadPixelsTest(testSpec));
    553            }
    554        }
    555 
    556        testGroup.addChild(renderbufferGroup);
    557    };
    558 
    559    es3fPixelBufferObjectTest.run = function(context) {
    560        gl = context;
    561        //Set up Test Root parameters
    562        var testName = 'pixel_buffer_object';
    563        var testDescription = 'Pixel Buffer Object Tests';
    564        var state = tcuTestCase.runner;
    565 
    566        state.testName = testName;
    567        state.testCases = tcuTestCase.newTest(testName, testDescription, null);
    568 
    569        //Set up name and description of this test series.
    570        setCurrentTestName(testName);
    571        description(testDescription);
    572 
    573        try {
    574            //Create test cases
    575            es3fPixelBufferObjectTest.init();
    576            //Run test cases
    577            tcuTestCase.runTestCases();
    578        }
    579        catch (err) {
    580            bufferedLogToConsole(err);
    581            tcuTestCase.runner.terminate();
    582        }
    583    };
    584 
    585 });