tor-browser

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

sglrReferenceContextTest.js (34791B)


      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('framework.opengl.simplereference.sglrReferenceContextTest');
     22 goog.require('framework.common.tcuLogImage');
     23 goog.require('framework.common.tcuPixelFormat');
     24 goog.require('framework.common.tcuRGBA');
     25 goog.require('framework.common.tcuSurface');
     26 goog.require('framework.common.tcuTestCase');
     27 goog.require('framework.opengl.gluDrawUtil');
     28 goog.require('framework.opengl.simplereference.sglrReferenceContext');
     29 goog.require('framework.opengl.simplereference.sglrShaderProgram');
     30 goog.require('framework.referencerenderer.rrFragmentOperations');
     31 goog.require('framework.referencerenderer.rrGenericVector');
     32 goog.require('framework.referencerenderer.rrShadingContext');
     33 goog.require('framework.referencerenderer.rrVertexAttrib');
     34 goog.require('framework.referencerenderer.rrVertexPacket');
     35 
     36 goog.scope(function() {
     37    var sglrReferenceContextTest = framework.opengl.simplereference.sglrReferenceContextTest;
     38    var sglrReferenceContext = framework.opengl.simplereference.sglrReferenceContext;
     39    var tcuTestCase = framework.common.tcuTestCase;
     40    var tcuPixelFormat = framework.common.tcuPixelFormat;
     41    var gluDrawUtil = framework.opengl.gluDrawUtil;
     42    var tcuSurface = framework.common.tcuSurface;
     43    var tcuLogImage = framework.common.tcuLogImage;
     44    var sglrShaderProgram = framework.opengl.simplereference.sglrShaderProgram;
     45    var rrGenericVector = framework.referencerenderer.rrGenericVector;
     46    var rrVertexAttrib = framework.referencerenderer.rrVertexAttrib;
     47    var rrShadingContext = framework.referencerenderer.rrShadingContext;
     48    var rrVertexPacket = framework.referencerenderer.rrVertexPacket;
     49    var rrFragmentOperations = framework.referencerenderer.rrFragmentOperations;
     50    var tcuRGBA = framework.common.tcuRGBA;
     51 
     52    /**
     53     * @constructor
     54     * @extends {tcuTestCase.DeqpTest}
     55     * @param {string} name
     56     * @param {string} description
     57     */
     58    sglrReferenceContextTest.ClearContext = function(name, description) {
     59        tcuTestCase.DeqpTest.call(this, name, description);
     60    };
     61 
     62    sglrReferenceContextTest.ClearContext.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
     63    sglrReferenceContextTest.ClearContext.prototype.constructor = sglrReferenceContextTest.ClearContext;
     64 
     65    sglrReferenceContextTest.ClearContext.prototype.init = function() {};
     66 
     67    sglrReferenceContextTest.ClearContext.prototype.iterate = function() {
     68 
     69        var width = 200;
     70        var height = 188;
     71        var samples = 1;
     72        var limits = new sglrReferenceContext.ReferenceContextLimits(gl);
     73        var format = new tcuPixelFormat.PixelFormat(8, 8, 8, 8);
     74        var buffers = new sglrReferenceContext.ReferenceContextBuffers(format, 24, 8, width, height, samples);
     75        var ctx = new sglrReferenceContext.ReferenceContext(limits, buffers.getColorbuffer(), buffers.getDepthbuffer(), buffers.getStencilbuffer());
     76        ctx.clearColor(1, 0, 0, 1);
     77        ctx.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
     78        var pixels = new tcuSurface.Surface(width, height);
     79        ctx.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels.getAccess().getDataPtr());
     80 
     81        var numFailedPixels = 0;
     82        var redPixel = new gluDrawUtil.Pixel([255, 0, 0, 255]);
     83        for (var x = 0; x < width; x++)
     84            for (var y = 0; y < height; y++) {
     85                var pixel = new gluDrawUtil.Pixel(pixels.getPixel(x, y));
     86                if (!pixel.equals(redPixel))
     87                    numFailedPixels += 1;
     88            }
     89 
     90        var access = pixels.getAccess();
     91 
     92        tcuLogImage.logImage('Result', '', access);
     93 
     94        if (numFailedPixels > 0)
     95            testFailedOptions('Image comparison failed, got ' + numFailedPixels + ' non-equal pixels.', false);
     96        else
     97            testPassedOptions('Image comparison succeed', true);
     98 
     99        ctx.scissor(width / 4, height / 4, width / 2, height / 2);
    100        ctx.enable(gl.SCISSOR_TEST);
    101        ctx.clearColor(0, 1, 1, 1);
    102        ctx.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
    103        ctx.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels.getAccess().getDataPtr());
    104 
    105        numFailedPixels = 0;
    106        var greenBluePixel = new gluDrawUtil.Pixel([0, 255, 255, 255]);
    107        for (var x = 0; x < width; x++)
    108            for (var y = 0; y < height; y++) {
    109                var pixel = new gluDrawUtil.Pixel(pixels.getPixel(x, y));
    110                if ((x >= width / 4 && x < width - width / 4) && (y >= height / 4 && y < height - height / 4)) {
    111                    if (!pixel.equals(greenBluePixel))
    112                        numFailedPixels += 1;
    113                } else
    114                    if (!pixel.equals(redPixel))
    115                        numFailedPixels += 1;
    116            }
    117 
    118        access = pixels.getAccess();
    119 
    120        tcuLogImage.logImage('Result', '', access);
    121 
    122        if (numFailedPixels > 0)
    123            testFailedOptions('Image comparison failed, got ' + numFailedPixels + ' non-equal pixels.', false);
    124        else
    125            testPassedOptions('Image comparison succeed', true);
    126 
    127        return tcuTestCase.IterateResult.STOP;
    128    };
    129 
    130    /**
    131     * @constructor
    132     * @extends {tcuTestCase.DeqpTest}
    133     * @param {string} name
    134     * @param {string} description
    135     */
    136    sglrReferenceContextTest.Framebuffer = function(name, description) {
    137        tcuTestCase.DeqpTest.call(this, name, description);
    138    };
    139 
    140    sglrReferenceContextTest.Framebuffer.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
    141    sglrReferenceContextTest.Framebuffer.prototype.constructor = sglrReferenceContextTest.Framebuffer;
    142 
    143    sglrReferenceContextTest.Framebuffer.prototype.init = function() {};
    144 
    145    sglrReferenceContextTest.Framebuffer.prototype.iterate = function() {
    146        var limits = new sglrReferenceContext.ReferenceContextLimits(gl);
    147        var format = new tcuPixelFormat.PixelFormat(8, 8, 8, 8);
    148        var width = 200;
    149        var height = 188;
    150        var samples = 1;
    151        var buffers = new sglrReferenceContext.ReferenceContextBuffers(format, 24, 8, width, height, samples);
    152        var ctx = new sglrReferenceContext.ReferenceContext(limits, buffers.getColorbuffer(), buffers.getDepthbuffer(), buffers.getStencilbuffer());
    153        ctx.clearColor(0, 0, 1, 1);
    154        ctx.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
    155        var fbo = ctx.createFramebuffer();
    156        var rbo = ctx.createRenderbuffer();
    157        ctx.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    158        ctx.bindRenderbuffer(gl.RENDERBUFFER, rbo);
    159        ctx.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA8, width, height);
    160        ctx.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, rbo);
    161        bufferedLogToConsole('Framebuffer status: ' + (ctx.checkFramebufferStatus(gl.FRAMEBUFFER) == gl.FRAMEBUFFER_COMPLETE));
    162        ctx.clearColor(1, 0, 0, 1);
    163        ctx.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
    164        var pixels = new tcuSurface.Surface(width, height);
    165        ctx.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels.getAccess().getDataPtr());
    166        var numFailedPixels = 0;
    167        var redPixel = new gluDrawUtil.Pixel([255, 0, 0, 255]);
    168        for (var x = 0; x < width; x++)
    169            for (var y = 0; y < height; y++) {
    170                var pixel = new gluDrawUtil.Pixel(pixels.getPixel(x, y));
    171                if (!pixel.equals(redPixel))
    172                    numFailedPixels += 1;
    173            }
    174        var access = pixels.getAccess();
    175        tcuLogImage.logImage('Result', '', access);
    176 
    177        if (numFailedPixels > 0)
    178            testFailedOptions('Image comparison failed, got ' + numFailedPixels + ' non-equal pixels.', false);
    179        else
    180            testPassedOptions('Image comparison succeed', true);
    181 
    182        ctx.scissor(width / 4, height / 4, width / 2, height / 2);
    183        ctx.enable(gl.SCISSOR_TEST);
    184        ctx.clearColor(0, 1, 1, 1);
    185        ctx.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
    186        ctx.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels.getAccess().getDataPtr());
    187 
    188        numFailedPixels = 0;
    189        var greenBluePixel = new gluDrawUtil.Pixel([0, 255, 255, 255]);
    190        for (var x = 0; x < width; x++)
    191            for (var y = 0; y < height; y++) {
    192                var pixel = new gluDrawUtil.Pixel(pixels.getPixel(x, y));
    193                if ((x >= width / 4 && x < width - width / 4) && (y >= height / 4 && y < height - height / 4)) {
    194                    if (!pixel.equals(greenBluePixel))
    195                        numFailedPixels += 1;
    196                } else
    197                    if (!pixel.equals(redPixel))
    198                        numFailedPixels += 1;
    199            }
    200 
    201        access = pixels.getAccess();
    202 
    203        tcuLogImage.logImage('Result', '', access);
    204 
    205        if (numFailedPixels > 0)
    206            testFailedOptions('Image comparison failed, got ' + numFailedPixels + ' non-equal pixels.', false);
    207        else
    208            testPassedOptions('Image comparison succeed', true);
    209 
    210        ctx.bindFramebuffer(gl.FRAMEBUFFER, null);
    211        ctx.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels.getAccess().getDataPtr());
    212 
    213        var bluePixel = new gluDrawUtil.Pixel([0, 0, 255, 255]);
    214        for (var x = 0; x < width; x++)
    215            for (var y = 0; y < height; y++) {
    216                var pixel = new gluDrawUtil.Pixel(pixels.getPixel(x, y));
    217                if (!pixel.equals(bluePixel))
    218                    numFailedPixels += 1;
    219            }
    220        access = pixels.getAccess();
    221        tcuLogImage.logImage('Result', '', access);
    222 
    223        if (numFailedPixels > 0)
    224            testFailedOptions('Image comparison failed, got ' + numFailedPixels + ' non-equal pixels.', false);
    225        else
    226            testPassedOptions('Image comparison succeed', true);
    227 
    228        return tcuTestCase.IterateResult.STOP;
    229    };
    230 
    231    /**
    232     * @constructor
    233     * @extends {tcuTestCase.DeqpTest}
    234     * @param {string} name
    235     * @param {string} description
    236     */
    237    sglrReferenceContextTest.Shader = function(name, description) {
    238        tcuTestCase.DeqpTest.call(this, name, description);
    239    };
    240 
    241    sglrReferenceContextTest.Shader.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
    242    sglrReferenceContextTest.Shader.prototype.constructor = sglrReferenceContextTest.Shader;
    243 
    244    sglrReferenceContextTest.Shader.prototype.init = function() {};
    245 
    246    sglrReferenceContextTest.Shader.prototype.iterate = function() {
    247        var limits = new sglrReferenceContext.ReferenceContextLimits(gl);
    248        var format = new tcuPixelFormat.PixelFormat(8, 8, 8, 8);
    249        var width = 200;
    250        var height = 188;
    251        var samples = 1;
    252        var buffers = new sglrReferenceContext.ReferenceContextBuffers(format, 24, 8, width, height, samples);
    253        var ctx = new sglrReferenceContext.ReferenceContext(limits, buffers.getColorbuffer(), buffers.getDepthbuffer(), buffers.getStencilbuffer());
    254        ctx.clearColor(0, 0, 1, 1);
    255        ctx.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
    256 
    257        var vertices = [
    258            -0.5, 0.5,
    259            0.5, 0.5,
    260            -0.5, -0.5,
    261            0.5, 0.5,
    262            0.5, -0.5,
    263            -0.5, -0.5
    264        ];
    265 
    266        var vertices32 = new Float32Array(vertices);
    267 
    268        var squareVerticesBuffer = ctx.createBuffer();
    269        ctx.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
    270        ctx.bufferData(gl.ARRAY_BUFFER, vertices32, gl.STATIC_DRAW);
    271 
    272        var colors = [
    273            1, 0, 0, 1,
    274            1, 0, 0, 1,
    275            1, 0, 0, 1,
    276            1, 0, 0, 1,
    277            1, 0, 0, 1,
    278            1, 0, 0, 1
    279        ];
    280 
    281        var colors32 = new Float32Array(colors);
    282 
    283        var squareColorsBuffer = ctx.createBuffer();
    284        ctx.bindBuffer(gl.ARRAY_BUFFER, squareColorsBuffer);
    285        ctx.bufferData(gl.ARRAY_BUFFER, colors32, gl.STATIC_DRAW);
    286 
    287        /** @type {sglrShaderProgram.ShaderProgramDeclaration} */ var progDecl = new sglrShaderProgram.ShaderProgramDeclaration();
    288 
    289        progDecl.pushVertexAttribute(new sglrShaderProgram.VertexAttribute('aVertexPosition', rrGenericVector.GenericVecType.FLOAT));
    290 
    291        progDecl.pushVertexAttribute(new sglrShaderProgram.VertexAttribute('aVertexColor', rrGenericVector.GenericVecType.FLOAT));
    292 
    293        progDecl.pushVertexSource(new sglrShaderProgram.VertexSource(''));
    294 
    295        progDecl.pushFragmentOutput(new sglrShaderProgram.FragmentOutput(rrGenericVector.GenericVecType.FLOAT));
    296 
    297        progDecl.pushFragmentSource(new sglrShaderProgram.FragmentSource(''));
    298 
    299        /** @type {sglrReferenceContextTest.ContextShaderProgram} */ var program = new sglrReferenceContextTest.ContextShaderProgram(progDecl);
    300 
    301        //Create program
    302        ctx.createProgram(program);
    303 
    304        //Use program
    305        ctx.useProgram(program);
    306 
    307        var vertexPositionAttribute = ctx.getAttribLocation(program, 'aVertexPosition');
    308        var vertexColorAttribute = ctx.getAttribLocation(program, 'aVertexColor');
    309        ctx.enableVertexAttribArray(vertexPositionAttribute);
    310        ctx.enableVertexAttribArray(vertexColorAttribute);
    311 
    312        ctx.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
    313        ctx.vertexAttribPointer(vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0);
    314 
    315        ctx.bindBuffer(gl.ARRAY_BUFFER, squareColorsBuffer);
    316        ctx.vertexAttribPointer(vertexColorAttribute, 4, gl.FLOAT, false, 0, 0);
    317 
    318        ctx.drawQuads(gl.TRIANGLES, 0, 6);
    319 
    320        var pixels = new tcuSurface.Surface(width, height);
    321        ctx.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels.getAccess().getDataPtr());
    322 
    323        var numFailedPixels = 0;
    324 
    325        var redPixel = new gluDrawUtil.Pixel([255, 0, 0, 255]);
    326        var bluePixel = new gluDrawUtil.Pixel([0, 0, 255, 255]);
    327 
    328        var pixel = new gluDrawUtil.Pixel(pixels.getPixel(0, 0));
    329        if (!pixel.equals(bluePixel))
    330            numFailedPixels += 1;
    331 
    332        pixel = new gluDrawUtil.Pixel(pixels.getPixel(100, 94));
    333        if (!pixel.equals(redPixel))
    334            numFailedPixels += 1;
    335 
    336        var access = pixels.getAccess();
    337 
    338        tcuLogImage.logImage('Result', '', access);
    339 
    340        if (numFailedPixels > 0)
    341            testFailedOptions('Image comparison failed, got ' + numFailedPixels + ' non-equal pixels.', false);
    342        else
    343            testPassedOptions('Image comparison succeed', true);
    344 
    345        return tcuTestCase.IterateResult.STOP;
    346    };
    347 
    348    /**
    349     * @constructor
    350     * @extends {tcuTestCase.DeqpTest}
    351     * @param {string} name
    352     * @param {string} description
    353     */
    354    sglrReferenceContextTest.TriangleStrip = function(name, description) {
    355        tcuTestCase.DeqpTest.call(this, name, description);
    356    };
    357 
    358    sglrReferenceContextTest.TriangleStrip.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
    359    sglrReferenceContextTest.TriangleStrip.prototype.constructor = sglrReferenceContextTest.TriangleStrip;
    360 
    361    sglrReferenceContextTest.TriangleStrip.prototype.init = function() {};
    362 
    363    sglrReferenceContextTest.TriangleStrip.prototype.iterate = function() {
    364        var limits = new sglrReferenceContext.ReferenceContextLimits(gl);
    365        var format = new tcuPixelFormat.PixelFormat(8, 8, 8, 8);
    366        var width = 200;
    367        var height = 188;
    368        var samples = 1;
    369        var buffers = new sglrReferenceContext.ReferenceContextBuffers(format, 24, 8, width, height, samples);
    370        var ctx = new sglrReferenceContext.ReferenceContext(limits, buffers.getColorbuffer(), buffers.getDepthbuffer(), buffers.getStencilbuffer());
    371        ctx.clearColor(0, 0, 1, 1);
    372        ctx.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
    373 
    374        var vertices = [
    375            -0.5, 0.5,
    376            0.5, 0.5,
    377            -0.5, 0,
    378            0.5, 0,
    379            -0.5, -0.5,
    380            0.5, -0.5
    381        ];
    382 
    383        var vertices32 = new Float32Array(vertices);
    384 
    385        var squareVerticesBuffer = ctx.createBuffer();
    386        ctx.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
    387        ctx.bufferData(gl.ARRAY_BUFFER, vertices32, gl.STATIC_DRAW);
    388 
    389        var colors = [
    390            1, 0, 0, 1,
    391            1, 0, 0, 1,
    392            1, 0, 0, 1,
    393            1, 0, 0, 1,
    394            1, 0, 0, 1,
    395            1, 0, 0, 1
    396        ];
    397 
    398        var colors32 = new Float32Array(colors);
    399 
    400        var squareColorsBuffer = ctx.createBuffer();
    401        ctx.bindBuffer(gl.ARRAY_BUFFER, squareColorsBuffer);
    402        ctx.bufferData(gl.ARRAY_BUFFER, colors32, gl.STATIC_DRAW);
    403 
    404        /** @type {sglrShaderProgram.ShaderProgramDeclaration} */ var progDecl = new sglrShaderProgram.ShaderProgramDeclaration();
    405 
    406        progDecl.pushVertexAttribute(new sglrShaderProgram.VertexAttribute('aVertexPosition', rrGenericVector.GenericVecType.FLOAT));
    407 
    408        progDecl.pushVertexAttribute(new sglrShaderProgram.VertexAttribute('aVertexColor', rrGenericVector.GenericVecType.FLOAT));
    409 
    410        progDecl.pushVertexSource(new sglrShaderProgram.VertexSource(''));
    411 
    412        progDecl.pushFragmentOutput(new sglrShaderProgram.FragmentOutput(rrGenericVector.GenericVecType.FLOAT));
    413 
    414        progDecl.pushFragmentSource(new sglrShaderProgram.FragmentSource(''));
    415 
    416        /** @type {sglrReferenceContextTest.ContextShaderProgram} */ var program = new sglrReferenceContextTest.ContextShaderProgram(progDecl);
    417 
    418        //Create program
    419        ctx.createProgram(program);
    420 
    421        //Use program
    422        ctx.useProgram(program);
    423 
    424        var vertexPositionAttribute = ctx.getAttribLocation(program, 'aVertexPosition');
    425        var vertexColorAttribute = ctx.getAttribLocation(program, 'aVertexColor');
    426        ctx.enableVertexAttribArray(vertexPositionAttribute);
    427        ctx.enableVertexAttribArray(vertexColorAttribute);
    428 
    429        ctx.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
    430        ctx.vertexAttribPointer(vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0);
    431 
    432        ctx.bindBuffer(gl.ARRAY_BUFFER, squareColorsBuffer);
    433        ctx.vertexAttribPointer(vertexColorAttribute, 4, gl.FLOAT, false, 0, 0);
    434 
    435        ctx.drawQuads(gl.TRIANGLE_STRIP, 0, 6);
    436 
    437        var pixels = new tcuSurface.Surface(width, height);
    438        ctx.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels.getAccess().getDataPtr());
    439 
    440        var numFailedPixels = 0;
    441 
    442        var redPixel = new gluDrawUtil.Pixel([255, 0, 0, 255]);
    443        var bluePixel = new gluDrawUtil.Pixel([0, 0, 255, 255]);
    444 
    445        var pixel = new gluDrawUtil.Pixel(pixels.getPixel(0, 0));
    446        if (!pixel.equals(bluePixel))
    447            numFailedPixels += 1;
    448 
    449        pixel = new gluDrawUtil.Pixel(pixels.getPixel(100, 94));
    450        if (!pixel.equals(redPixel))
    451            numFailedPixels += 1;
    452 
    453        var access = pixels.getAccess();
    454 
    455        tcuLogImage.logImage('Result', '', access);
    456 
    457        if (numFailedPixels > 0)
    458            testFailedOptions('Image comparison failed, got ' + numFailedPixels + ' non-equal pixels.', false);
    459        else
    460            testPassedOptions('Image comparison succeed', true);
    461 
    462        return tcuTestCase.IterateResult.STOP;
    463    };
    464 
    465    /**
    466     * @constructor
    467     * @extends {tcuTestCase.DeqpTest}
    468     * @param {string} name
    469     * @param {string} description
    470     */
    471    sglrReferenceContextTest.TriangleFan = function(name, description) {
    472        tcuTestCase.DeqpTest.call(this, name, description);
    473    };
    474 
    475    sglrReferenceContextTest.TriangleFan.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
    476    sglrReferenceContextTest.TriangleFan.prototype.constructor = sglrReferenceContextTest.TriangleFan;
    477 
    478    sglrReferenceContextTest.TriangleFan.prototype.init = function() {};
    479 
    480    sglrReferenceContextTest.TriangleFan.prototype.iterate = function() {
    481        var limits = new sglrReferenceContext.ReferenceContextLimits(gl);
    482        var format = new tcuPixelFormat.PixelFormat(8, 8, 8, 8);
    483        var width = 200;
    484        var height = 188;
    485        var samples = 1;
    486        var buffers = new sglrReferenceContext.ReferenceContextBuffers(format, 24, 8, width, height, samples);
    487        var ctx = new sglrReferenceContext.ReferenceContext(limits, buffers.getColorbuffer(), buffers.getDepthbuffer(), buffers.getStencilbuffer());
    488        ctx.clearColor(0, 0, 1, 1);
    489        ctx.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
    490 
    491        var vertices = [
    492            -0.5, 0,
    493            -0.5, 0.5,
    494            0.5, 0.5,
    495            0.5, 0,
    496            0.5, -0.5,
    497            -0.5, -0.5
    498        ];
    499 
    500        var vertices32 = new Float32Array(vertices);
    501 
    502        var squareVerticesBuffer = ctx.createBuffer();
    503        ctx.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
    504        ctx.bufferData(gl.ARRAY_BUFFER, vertices32, gl.STATIC_DRAW);
    505 
    506        var colors = [
    507            1, 0, 0, 1,
    508            1, 0, 0, 1,
    509            1, 0, 0, 1,
    510            1, 0, 0, 1,
    511            1, 0, 0, 1,
    512            1, 0, 0, 1
    513        ];
    514 
    515        var colors32 = new Float32Array(colors);
    516 
    517        var squareColorsBuffer = ctx.createBuffer();
    518        ctx.bindBuffer(gl.ARRAY_BUFFER, squareColorsBuffer);
    519        ctx.bufferData(gl.ARRAY_BUFFER, colors32, gl.STATIC_DRAW);
    520 
    521        /** @type {sglrShaderProgram.ShaderProgramDeclaration} */ var progDecl = new sglrShaderProgram.ShaderProgramDeclaration();
    522 
    523        progDecl.pushVertexAttribute(new sglrShaderProgram.VertexAttribute('aVertexPosition', rrGenericVector.GenericVecType.FLOAT));
    524 
    525        progDecl.pushVertexAttribute(new sglrShaderProgram.VertexAttribute('aVertexColor', rrGenericVector.GenericVecType.FLOAT));
    526 
    527        progDecl.pushVertexSource(new sglrShaderProgram.VertexSource(''));
    528 
    529        progDecl.pushFragmentOutput(new sglrShaderProgram.FragmentOutput(rrGenericVector.GenericVecType.FLOAT));
    530 
    531        progDecl.pushFragmentSource(new sglrShaderProgram.FragmentSource(''));
    532 
    533        /** @type {sglrReferenceContextTest.ContextShaderProgram} */ var program = new sglrReferenceContextTest.ContextShaderProgram(progDecl);
    534 
    535        //Create program
    536        ctx.createProgram(program);
    537 
    538        //Use program
    539        ctx.useProgram(program);
    540 
    541        var vertexPositionAttribute = ctx.getAttribLocation(program, 'aVertexPosition');
    542        var vertexColorAttribute = ctx.getAttribLocation(program, 'aVertexColor');
    543        ctx.enableVertexAttribArray(vertexPositionAttribute);
    544        ctx.enableVertexAttribArray(vertexColorAttribute);
    545 
    546        ctx.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
    547        ctx.vertexAttribPointer(vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0);
    548 
    549        ctx.bindBuffer(gl.ARRAY_BUFFER, squareColorsBuffer);
    550        ctx.vertexAttribPointer(vertexColorAttribute, 4, gl.FLOAT, false, 0, 0);
    551 
    552        ctx.drawQuads(gl.TRIANGLE_FAN, 0, 6);
    553 
    554        var pixels = new tcuSurface.Surface(width, height);
    555        ctx.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels.getAccess().getDataPtr());
    556 
    557        var numFailedPixels = 0;
    558 
    559        var redPixel = new gluDrawUtil.Pixel([255, 0, 0, 255]);
    560        var bluePixel = new gluDrawUtil.Pixel([0, 0, 255, 255]);
    561 
    562        var pixel = new gluDrawUtil.Pixel(pixels.getPixel(0, 0));
    563        if (!pixel.equals(bluePixel))
    564            numFailedPixels += 1;
    565 
    566        pixel = new gluDrawUtil.Pixel(pixels.getPixel(100, 94));
    567        if (!pixel.equals(redPixel))
    568            numFailedPixels += 1;
    569 
    570        var access = pixels.getAccess();
    571 
    572        tcuLogImage.logImage('Result', '', access);
    573 
    574        if (numFailedPixels > 0)
    575            testFailedOptions('Image comparison failed, got ' + numFailedPixels + ' non-equal pixels.', false);
    576        else
    577            testPassedOptions('Image comparison succeed', true);
    578 
    579        return tcuTestCase.IterateResult.STOP;
    580    };
    581 
    582    /**
    583     * @constructor
    584     * @extends {tcuTestCase.DeqpTest}
    585     * @param {string} name
    586     * @param {string} description
    587     */
    588    sglrReferenceContextTest.DrawElements = function(name, description) {
    589        tcuTestCase.DeqpTest.call(this, name, description);
    590    };
    591 
    592    sglrReferenceContextTest.DrawElements.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
    593    sglrReferenceContextTest.DrawElements.prototype.constructor = sglrReferenceContextTest.DrawElements;
    594 
    595    sglrReferenceContextTest.DrawElements.prototype.init = function() {};
    596 
    597    sglrReferenceContextTest.DrawElements.prototype.iterate = function() {
    598        var limits = new sglrReferenceContext.ReferenceContextLimits(gl);
    599        var format = new tcuPixelFormat.PixelFormat(8, 8, 8, 8);
    600        var width = 200;
    601        var height = 188;
    602        var samples = 1;
    603        var buffers = new sglrReferenceContext.ReferenceContextBuffers(format, 24, 8, width, height, samples);
    604        var ctx = new sglrReferenceContext.ReferenceContext(limits, buffers.getColorbuffer(), buffers.getDepthbuffer(), buffers.getStencilbuffer());
    605        ctx.clearColor(0, 0, 1, 1);
    606        ctx.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT);
    607 
    608        var vertices = [
    609            -0.5, 0.5,
    610            0, 0.5,
    611            0.4, 0.5,
    612 
    613            -0.5, 0.1,
    614            0, 0.1,
    615            0.4, 0.1,
    616 
    617            -0.5, -0.7,
    618            0, -0.7,
    619            0.4, -0.7
    620        ];
    621 
    622        var vertices32 = new Float32Array(vertices);
    623 
    624        var squareVerticesBuffer = ctx.createBuffer();
    625        ctx.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
    626        ctx.bufferData(gl.ARRAY_BUFFER, vertices32, gl.STATIC_DRAW);
    627 
    628        var indices = [
    629            0, 1, 3, 1, 3, 4,
    630            1, 2, 4, 2, 4, 5,
    631            3, 4, 6, 4, 6, 7,
    632            4, 5, 7, 5, 7, 8
    633        ];
    634        var indicesBuffer = ctx.createBuffer();
    635        ctx.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indicesBuffer);
    636        ctx.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
    637 
    638        var colors = [
    639            1, 0, 0, 1,
    640            0, 1, 0, 1,
    641            0, 0, 1, 1,
    642            1, 1, 1, 1,
    643            1, 1, 0, 1,
    644            0, 1, 1, 1,
    645            1, 0, 1, 1,
    646            0.5, 0.5, 0.5, 1,
    647            0, 0, 0, 0
    648        ];
    649 
    650        var colors32 = new Float32Array(colors);
    651 
    652        var squareColorsBuffer = ctx.createBuffer();
    653        ctx.bindBuffer(gl.ARRAY_BUFFER, squareColorsBuffer);
    654        ctx.bufferData(gl.ARRAY_BUFFER, colors32, gl.STATIC_DRAW);
    655 
    656        /** @type {sglrShaderProgram.ShaderProgramDeclaration} */ var progDecl = new sglrShaderProgram.ShaderProgramDeclaration();
    657 
    658        progDecl.pushVertexAttribute(new sglrShaderProgram.VertexAttribute('aVertexPosition', rrGenericVector.GenericVecType.FLOAT));
    659 
    660        progDecl.pushVertexAttribute(new sglrShaderProgram.VertexAttribute('aVertexColor', rrGenericVector.GenericVecType.FLOAT));
    661 
    662        progDecl.pushVertexSource(new sglrShaderProgram.VertexSource(''));
    663 
    664        progDecl.pushFragmentOutput(new sglrShaderProgram.FragmentOutput(rrGenericVector.GenericVecType.FLOAT));
    665 
    666        progDecl.pushFragmentSource(new sglrShaderProgram.FragmentSource(''));
    667 
    668        /** @type {sglrReferenceContextTest.ContextShaderProgram} */ var program = new sglrReferenceContextTest.ContextShaderProgram(progDecl);
    669 
    670        //Create program
    671        ctx.createProgram(program);
    672 
    673        //Use program
    674        ctx.useProgram(program);
    675 
    676        var vertexPositionAttribute = ctx.getAttribLocation(program, 'aVertexPosition');
    677        var vertexColorAttribute = ctx.getAttribLocation(program, 'aVertexColor');
    678        ctx.enableVertexAttribArray(vertexPositionAttribute);
    679        ctx.enableVertexAttribArray(vertexColorAttribute);
    680 
    681        ctx.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
    682        ctx.vertexAttribPointer(vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0);
    683 
    684        ctx.bindBuffer(gl.ARRAY_BUFFER, squareColorsBuffer);
    685        ctx.vertexAttribPointer(vertexColorAttribute, 4, gl.FLOAT, false, 0, 0);
    686 
    687        ctx.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT, 0);
    688 
    689        var pixels = new tcuSurface.Surface(width, height);
    690        ctx.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels.getAccess().getDataPtr());
    691 
    692        var numFailedPixels = 0;
    693 
    694        var access = pixels.getAccess();
    695 
    696        var pixelsTotest = [
    697            // location, color
    698            [2, 1], [0, 0, 255, 255],
    699            // The red vertex is between 140 and 141 so account for some blending with the white vertex
    700            [50, 140], [255, 5, 5, 255],
    701            [50, 28], [255, 0, 255, 255],
    702            [139, 28], [0, 0, 0, 255],
    703            [50, 102], [255, 255, 255, 255],
    704            [139, 102], [0, 255, 255, 255]
    705        ];
    706 
    707        var threshold = new tcuRGBA.RGBA([5, 5, 5, 5]);
    708 
    709        for (var i = 0; i < pixelsTotest.length; i += 2) {
    710            var location = pixelsTotest[i];
    711            var reference = new tcuRGBA.RGBA(pixelsTotest[i + 1]);
    712            var color = access.getPixelInt(location[0], location[1]);
    713            var pixel = new tcuRGBA.RGBA(color);
    714            if (!tcuRGBA.compareThreshold(pixel, reference, threshold))
    715                numFailedPixels++;
    716        }
    717 
    718        tcuLogImage.logImage('Result', '', access);
    719 
    720        if (numFailedPixels > 0)
    721            testFailedOptions('Image comparison failed, got ' + numFailedPixels + ' non-equal pixels.', false);
    722        else
    723            testPassedOptions('Image comparison succeed', true);
    724 
    725        return tcuTestCase.IterateResult.STOP;
    726    };
    727 
    728    /**
    729     * @constructor
    730     * @extends {sglrShaderProgram.ShaderProgram}
    731     * @param {sglrShaderProgram.ShaderProgramDeclaration} progDecl
    732     */
    733    sglrReferenceContextTest.ContextShaderProgram = function(progDecl) {
    734        sglrShaderProgram.ShaderProgram.call(this, progDecl);
    735    };
    736 
    737    sglrReferenceContextTest.ContextShaderProgram.prototype = Object.create(sglrShaderProgram.ShaderProgram.prototype);
    738    sglrReferenceContextTest.ContextShaderProgram.prototype.constructor = sglrReferenceContextTest.ContextShaderProgram;
    739 
    740    /**
    741     * @param {Array<rrVertexAttrib.VertexAttrib>} inputs
    742     * @param {Array<rrVertexPacket.VertexPacket>} packets
    743     * @param {number} numPackets
    744     */
    745    sglrReferenceContextTest.ContextShaderProgram.prototype.shadeVertices = function(inputs, packets, numPackets) {
    746        for (var packetNdx = 0; packetNdx < numPackets; ++packetNdx) {
    747            /** @type {number} */ var varyingLocColor = 0;
    748 
    749            /** @type {rrVertexPacket.VertexPacket} */ var packet = packets[packetNdx];
    750 
    751            // Calc output color
    752            /** @type {Array<number>} */ var coord = [1.0, 1.0];
    753            /** @type {Array<number>} */ var color = [1.0, 1.0, 1.0];
    754 
    755            for (var attribNdx = 0; attribNdx < this.getVertexShader().getInputs().length; attribNdx++) {
    756                /** @type {number} */ var numComponents = inputs[attribNdx].componentCount;
    757 
    758                var attribValue = rrVertexAttrib.readVertexAttrib(inputs[attribNdx], packet.instanceNdx, packet.vertexNdx, this.getVertexShader().getInputs()[attribNdx].type);
    759 
    760                if (attribNdx == 0) {
    761                    coord[0] = attribValue[0];
    762                    coord[1] = attribValue[1];
    763                } else {
    764                    color[0] = attribValue[0] * attribValue[3];
    765                    color[1] = attribValue[1] * attribValue[3];
    766                    color[2] = attribValue[2] * attribValue[3];
    767                }
    768            }
    769 
    770            // Transform position
    771            packet.position = [coord[0], coord[1], 1.0, 1.0];
    772 
    773            // Pass color to FS
    774            packet.outputs[varyingLocColor] = [color[0], color[1], color[2], 1.0];
    775        }
    776    };
    777 
    778    /**
    779     * @param {Array<rrFragmentOperations.Fragment>} packets
    780     * @param {rrShadingContext.FragmentShadingContext} context
    781     */
    782    sglrReferenceContextTest.ContextShaderProgram.prototype.shadeFragments = function(packets, context) {
    783        var varyingLocColor = 0;
    784 
    785        // Normal shading
    786        for (var packetNdx = 0; packetNdx < packets.length; ++packetNdx)
    787            packets[packetNdx].value = rrShadingContext.readTriangleVarying(packets[packetNdx], context, varyingLocColor);
    788    };
    789 
    790    sglrReferenceContextTest.init = function() {
    791        var state = tcuTestCase.runner;
    792        /** @type {tcuTestCase.DeqpTest} */ var testGroup = state.testCases;
    793 
    794        /** @type {tcuTestCase.DeqpTest} */ var referenceContextGroup = tcuTestCase.newTest('reference_context', 'Test reference context');
    795 
    796        referenceContextGroup.addChild(new sglrReferenceContextTest.ClearContext('clear_context', 'Clear Context Test'));
    797        referenceContextGroup.addChild(new sglrReferenceContextTest.Framebuffer('Framebuffer', 'Framebuffer Test'));
    798        referenceContextGroup.addChild(new sglrReferenceContextTest.Shader('Shaders', 'Drawing using TRIANGLES'));
    799        referenceContextGroup.addChild(new sglrReferenceContextTest.TriangleStrip('TriangleStrip', 'Drawing using TRIANGLE_STRIP'));
    800        referenceContextGroup.addChild(new sglrReferenceContextTest.TriangleFan('TriangleFan', 'Drawing using TRIANGLE_FAN'));
    801        referenceContextGroup.addChild(new sglrReferenceContextTest.DrawElements('DrawElements', 'Drawing using DrawElements and TRIANGLES'));
    802 
    803        testGroup.addChild(referenceContextGroup);
    804 
    805    };
    806 
    807    sglrReferenceContextTest.run = function(context) {
    808        gl = context;
    809        //Set up Test Root parameters
    810        var testName = 'single_reference_context';
    811        var testDescription = 'Single Reference Context Tests';
    812        var state = tcuTestCase.runner;
    813 
    814        state.testName = testName;
    815        state.testCases = tcuTestCase.newTest(testName, testDescription, null);
    816 
    817        //Set up name and description of this test series.
    818        setCurrentTestName(testName);
    819        description(testDescription);
    820 
    821        try {
    822            //Create test cases
    823            sglrReferenceContextTest.init();
    824            //Run test cases
    825            tcuTestCase.runTestCases();
    826        }
    827        catch (err) {
    828            bufferedLogToConsole(err);
    829            tcuTestCase.runner.terminate();
    830        }
    831 
    832    };
    833 
    834 });