tor-browser

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

es3fFboDepthbufferTests.js (15294B)


      1 /*-------------------------------------------------------------------------
      2 * drawElements Quality Program OpenGL ES Utilities
      3 * ------------------------------------------------
      4 *
      5 * Copyright 2014 The Android Open Source Project
      6 *
      7 * Licensed under the Apache License, Version 2.0 (the 'License');
      8 * you may not use this file except in compliance with the License.
      9 * You may obtain a copy of the License at
     10 *
     11 *      http://www.apache.org/licenses/LICENSE-2.0
     12 *
     13 * Unless required by applicable law or agreed to in writing, software
     14 * distributed under the License is distributed on an 'AS IS' BASIS,
     15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16 * See the License for the specific language governing permissions and
     17 * limitations under the License.
     18 *
     19 */
     20 
     21 'use strict';
     22 goog.provide('functional.gles3.es3fFboDepthbufferTests');
     23 goog.require('framework.common.tcuSurface');
     24 goog.require('framework.common.tcuTestCase');
     25 goog.require('framework.common.tcuTexture');
     26 goog.require('framework.opengl.gluTextureUtil');
     27 goog.require('functional.gles3.es3fFboTestCase');
     28 goog.require('functional.gles3.es3fFboTestUtil');
     29 goog.require('framework.common.tcuRGBA');
     30 goog.require('framework.delibs.debase.deRandom');
     31 goog.require('framework.common.tcuImageCompare');
     32 goog.require('framework.common.tcuTextureUtil');
     33 goog.require('framework.referencerenderer.rrUtil');
     34 goog.require('framework.delibs.debase.deMath');
     35 goog.require('framework.opengl.gluShaderUtil');
     36 
     37 goog.scope(function() {
     38 var es3fFboDepthbufferTests = functional.gles3.es3fFboDepthbufferTests;
     39 var es3fFboTestCase = functional.gles3.es3fFboTestCase;
     40 var es3fFboTestUtil = functional.gles3.es3fFboTestUtil;
     41 var tcuTestCase = framework.common.tcuTestCase;
     42 var tcuSurface = framework.common.tcuSurface;
     43 var tcuTexture = framework.common.tcuTexture;
     44 var gluTextureUtil = framework.opengl.gluTextureUtil;
     45 var tcuRGBA = framework.common.tcuRGBA;
     46 var deRandom = framework.delibs.debase.deRandom;
     47 var tcuImageCompare = framework.common.tcuImageCompare;
     48 var tcuTextureUtil = framework.common.tcuTextureUtil;
     49 var rrUtil = framework.referencerenderer.rrUtil;
     50 var deMath = framework.delibs.debase.deMath;
     51 var gluShaderUtil = framework.opengl.gluShaderUtil;
     52 
     53 /** @type {WebGL2RenderingContext} */ var gl;
     54 
     55 var setParentClass = function(child, parent) {
     56    child.prototype = Object.create(parent.prototype);
     57    child.prototype.constructor = child;
     58 };
     59 
     60 /**
     61 * @constructor
     62 * @extends {es3fFboTestCase.FboTestCase}
     63 * @param {string} name
     64 * @param {string} desc
     65 * @param {number} format
     66 * @param {number} width
     67 * @param {number} height
     68 */
     69 es3fFboDepthbufferTests.BasicFboDepthCase = function(name, desc, format, width, height) {
     70    es3fFboTestCase.FboTestCase.call(this, name, desc);
     71    this.m_format = format;
     72    this.m_width = width;
     73    this.m_height = height;
     74 };
     75 
     76 setParentClass(es3fFboDepthbufferTests.BasicFboDepthCase, es3fFboTestCase.FboTestCase);
     77 
     78 es3fFboDepthbufferTests.BasicFboDepthCase.prototype.preCheck = function() {
     79        this.checkFormatSupport(this.m_format);
     80        return true; // No exception thrown
     81    };
     82 
     83 es3fFboDepthbufferTests.BasicFboDepthCase.prototype.render = function(dst) {
     84        var ctx = this.getCurrentContext();
     85        var colorFormat = gl.RGBA8;
     86        /** @type {es3fFboTestUtil.GradientShader} */
     87        var gradShader = new es3fFboTestUtil.GradientShader(gluShaderUtil.DataType.FLOAT_VEC4);
     88 
     89        /** @type {es3fFboTestUtil.Texture2DShader} */
     90        var texShader = new es3fFboTestUtil.Texture2DShader(
     91            [gluShaderUtil.DataType.SAMPLER_2D], gluShaderUtil.DataType.FLOAT_VEC4);
     92        var texShaderID = ctx.createProgram(texShader);
     93        var gradShaderID = ctx.createProgram(gradShader);
     94        var clearDepth = 1;
     95 
     96        // Setup shaders
     97        gradShader.setGradient(ctx, gradShaderID, [0, 0, 0, 0], [1, 1, 1, 1]);
     98        texShader.setUniforms(ctx, texShaderID);
     99 
    100        // Setup FBO
    101 
    102        var fbo = ctx.createFramebuffer();
    103        var colorRbo = ctx.createRenderbuffer();
    104        var depthRbo = ctx.createRenderbuffer();
    105 
    106        ctx.bindRenderbuffer(gl.RENDERBUFFER, colorRbo);
    107        ctx.renderbufferStorage(gl.RENDERBUFFER, colorFormat, this.m_width, this.m_height);
    108 
    109        ctx.bindRenderbuffer(gl.RENDERBUFFER, depthRbo);
    110        ctx.renderbufferStorage(gl.RENDERBUFFER, this.m_format, this.m_width, this.m_height);
    111 
    112        ctx.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    113        ctx.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorRbo);
    114        ctx.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, depthRbo);
    115        this.checkError();
    116        this.checkFramebufferStatus(gl.FRAMEBUFFER);
    117 
    118        ctx.viewport(0, 0, this.m_width, this.m_height);
    119 
    120        // Clear depth to 1
    121        ctx.clearBufferfv(gl.DEPTH, 0, [clearDepth]);
    122 
    123        // Render gradient with depth = [-1..1]
    124        ctx.enable(gl.DEPTH_TEST);
    125        rrUtil.drawQuad(ctx, gradShaderID, [-1.0, -1.0, -1.0], [1.0, 1.0, 1.0]);
    126 
    127        // Render grid pattern with depth = 0
    128        var format = gl.RGBA;
    129        var dataType = gl.UNSIGNED_BYTE;
    130        var texW = 128;
    131        var texH = 128;
    132        var data = new tcuTexture.TextureLevel(gluTextureUtil.mapGLTransferFormat(format, dataType), texW, texH, 1);
    133 
    134        tcuTextureUtil.fillWithGrid(data.getAccess(), 8, [0.2, 0.7, 0.1, 1.0], [0.7, 0.1, 0.5, 0.8]);
    135 
    136        var gridTex = ctx.createTexture();
    137        ctx.bindTexture(gl.TEXTURE_2D, gridTex);
    138        ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    139        ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    140        ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    141        ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    142        ctx.texImage2D(gl.TEXTURE_2D, 0, format, texW, texH, 0, format, dataType, data.getAccess().getDataPtr());
    143 
    144        rrUtil.drawQuad(ctx, texShaderID, [-1.0, -1.0, 0.0], [1.0, 1.0, 0.0]);
    145        this.checkError();
    146 
    147        // Read results.
    148        this.readPixelsUsingFormat(dst, 0, 0, this.m_width, this.m_height,
    149            gluTextureUtil.mapGLInternalFormat(colorFormat),
    150             [1, 1, 1, 1], [0, 0, 0, 0]);
    151 };
    152 
    153 /**
    154 * @constructor
    155 * @extends {es3fFboTestCase.FboTestCase}
    156 * @param {string} name
    157 * @param {string} desc
    158 * @param {number} format
    159 * @param {number} width
    160 * @param {number} height
    161 */
    162 es3fFboDepthbufferTests.DepthWriteClampCase = function(name, desc, format, width, height) {
    163    es3fFboTestCase.FboTestCase.call(this, name, desc);
    164    this.m_format = format;
    165    this.m_width = width;
    166    this.m_height = height;
    167 };
    168 
    169 setParentClass(es3fFboDepthbufferTests.DepthWriteClampCase, es3fFboTestCase.FboTestCase);
    170 
    171 es3fFboDepthbufferTests.DepthWriteClampCase.prototype.preCheck = function() {
    172        this.checkFormatSupport(this.m_format);
    173        return true; // No exception thrown
    174    };
    175 
    176 es3fFboDepthbufferTests.DepthWriteClampCase.prototype.render = function(dst) {
    177        var ctx = this.getCurrentContext();
    178        var colorFormat = gl.RGBA8;
    179        var transferFmt = gluTextureUtil.getTransferFormat(gluTextureUtil.mapGLInternalFormat(this.m_format));
    180        /** @type {es3fFboTestUtil.DepthGradientShader} */
    181        var gradShader = new es3fFboTestUtil.DepthGradientShader(gluShaderUtil.DataType.FLOAT_VEC4);
    182 
    183        var gradShaderID = ctx.createProgram(gradShader);
    184        var clearDepth = 1;
    185        var red = [1, 0, 0, 1];
    186        var green = [0, 1, 0, 1];
    187 
    188        // Setup FBO
    189 
    190        var fbo = ctx.createFramebuffer();
    191        var colorRbo = ctx.createRenderbuffer();
    192        var depthTexture = ctx.createTexture();
    193 
    194        ctx.bindRenderbuffer(gl.RENDERBUFFER, colorRbo);
    195        ctx.renderbufferStorage(gl.RENDERBUFFER, colorFormat, this.m_width, this.m_height);
    196 
    197        ctx.bindTexture(gl.TEXTURE_2D, depthTexture);
    198        ctx.texImage2D(gl.TEXTURE_2D, 0, this.m_format, this.m_width, this.m_height, 0, transferFmt.format, transferFmt.dataType, null);
    199        ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
    200        ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
    201 
    202        ctx.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    203        ctx.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorRbo);
    204        ctx.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depthTexture, 0);
    205        this.checkError();
    206        this.checkFramebufferStatus(gl.FRAMEBUFFER);
    207 
    208        ctx.viewport(0, 0, this.m_width, this.m_height);
    209 
    210        // Clear depth to 1
    211        ctx.clearBufferfv(gl.DEPTH, 0, [clearDepth]);
    212 
    213        // Render gradient with depth = [-1..1]
    214        ctx.enable(gl.DEPTH_TEST);
    215        ctx.depthFunc(gl.ALWAYS);
    216        gradShader.setUniforms(ctx, gradShaderID, -1, 2, green);
    217        rrUtil.drawQuad(ctx, gradShaderID, [-1.0, -1.0, -1.0], [1.0, 1.0, 1.0]);
    218        ctx.depthMask(false);
    219 
    220        // Test if any fragment has greater depth than 1; there should be none
    221        ctx.depthFunc(gl.LESS); // (1 < depth) ?
    222        gradShader.setUniforms(ctx, gradShaderID, 1, 1, red);
    223        rrUtil.drawQuad(ctx, gradShaderID, [-1.0, -1.0, -1.0], [1.0, 1.0, 1.0]);
    224 
    225        // Test if any fragment has smaller depth than 0; there should be none
    226        ctx.depthFunc(gl.GREATER); // (0 > depth) ?
    227        gradShader.setUniforms(ctx, gradShaderID, 0, 0, red);
    228        rrUtil.drawQuad(ctx, gradShaderID, [-1.0, -1.0, -1.0], [1.0, 1.0, 1.0]);
    229 
    230        // Read results.
    231        this.readPixelsUsingFormat(dst, 0, 0, this.m_width, this.m_height,
    232            gluTextureUtil.mapGLInternalFormat(colorFormat),
    233             [1, 1, 1, 1], [0, 0, 0, 0]);
    234 
    235        ctx.depthMask(true);
    236 };
    237 
    238 /**
    239 * @constructor
    240 * @extends {es3fFboTestCase.FboTestCase}
    241 * @param {string} name
    242 * @param {string} desc
    243 * @param {number} format
    244 * @param {number} width
    245 * @param {number} height
    246 */
    247 es3fFboDepthbufferTests.DepthTestClampCase = function(name, desc, format, width, height) {
    248    es3fFboTestCase.FboTestCase.call(this, name, desc);
    249    this.m_format = format;
    250    this.m_width = width;
    251    this.m_height = height;
    252 };
    253 
    254 setParentClass(es3fFboDepthbufferTests.DepthTestClampCase, es3fFboTestCase.FboTestCase);
    255 
    256 es3fFboDepthbufferTests.DepthTestClampCase.prototype.preCheck = function() {
    257        this.checkFormatSupport(this.m_format);
    258        return true; // No exception thrown
    259    };
    260 
    261 es3fFboDepthbufferTests.DepthTestClampCase.prototype.render = function(dst) {
    262        var ctx = this.getCurrentContext();
    263        var colorFormat = gl.RGBA8;
    264        var transferFmt = gluTextureUtil.getTransferFormat(gluTextureUtil.mapGLInternalFormat(this.m_format));
    265        /** @type {es3fFboTestUtil.DepthGradientShader} */
    266        var gradShader = new es3fFboTestUtil.DepthGradientShader(gluShaderUtil.DataType.FLOAT_VEC4);
    267 
    268        var gradShaderID = ctx.createProgram(gradShader);
    269        var clearDepth = 1;
    270        var yellow = [1, 1, 0, 1];
    271        var green = [0, 1, 0, 1];
    272 
    273        // Setup FBO
    274 
    275        var fbo = ctx.createFramebuffer();
    276        var colorRbo = ctx.createRenderbuffer();
    277        var depthTexture = ctx.createTexture();
    278 
    279        ctx.bindRenderbuffer(gl.RENDERBUFFER, colorRbo);
    280        ctx.renderbufferStorage(gl.RENDERBUFFER, colorFormat, this.m_width, this.m_height);
    281 
    282        ctx.bindTexture(gl.TEXTURE_2D, depthTexture);
    283        ctx.texImage2D(gl.TEXTURE_2D, 0, this.m_format, this.m_width, this.m_height, 0, transferFmt.format, transferFmt.dataType, null);
    284        ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
    285        ctx.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
    286 
    287        ctx.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    288        ctx.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorRbo);
    289        ctx.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, depthTexture, 0);
    290        this.checkError();
    291        this.checkFramebufferStatus(gl.FRAMEBUFFER);
    292 
    293        ctx.viewport(0, 0, this.m_width, this.m_height);
    294 
    295        // Clear depth to 1
    296        ctx.clearBufferfv(gl.DEPTH, 0, [clearDepth]);
    297 
    298        // Test values used in depth test are clamped
    299 
    300        // Render green quad, depth gradient = [-1..2]
    301        ctx.enable(gl.DEPTH_TEST);
    302        ctx.depthFunc(gl.ALWAYS);
    303 
    304        gradShader.setUniforms(ctx, gradShaderID, -1, 2, green);
    305        rrUtil.drawQuad(ctx, gradShaderID, [-1.0, -1.0, -1.0], [1.0, 1.0, 1.0]);
    306 
    307        // Render yellow quad, depth gradient = [-0.5..3]. Gradients have equal values only outside [0, 1] range due to clamping
    308        ctx.depthFunc(gl.EQUAL);
    309 
    310        gradShader.setUniforms(ctx, gradShaderID, -0.5, 3, yellow);
    311        rrUtil.drawQuad(ctx, gradShaderID, [-1.0, -1.0, -1.0], [1.0, 1.0, 1.0]);
    312 
    313        // Read results.
    314        this.readPixelsUsingFormat(dst, 0, 0, this.m_width, this.m_height,
    315            gluTextureUtil.mapGLInternalFormat(colorFormat),
    316             [1, 1, 1, 1], [0, 0, 0, 0]);
    317 };
    318 
    319 /**
    320 * @constructor
    321 * @extends {tcuTestCase.DeqpTest}
    322 */
    323 es3fFboDepthbufferTests.FboDepthbufferTests = function() {
    324    tcuTestCase.DeqpTest.call(this, 'depth', 'depth tests');
    325 };
    326 
    327 setParentClass(es3fFboDepthbufferTests.FboDepthbufferTests, tcuTestCase.DeqpTest);
    328 
    329 es3fFboDepthbufferTests.FboDepthbufferTests.prototype.init = function() {
    330    var depthFormats = [
    331        gl.DEPTH_COMPONENT32F,
    332        gl.DEPTH_COMPONENT24,
    333        gl.DEPTH_COMPONENT16,
    334        gl.DEPTH32F_STENCIL8,
    335        gl.DEPTH24_STENCIL8
    336    ];
    337 
    338    // .basic
    339    var basicGroup = tcuTestCase.newTest('basic', 'Basic depth tests');
    340    this.addChild(basicGroup);
    341 
    342    for (var ndx = 0; ndx < depthFormats.length; ndx++)
    343        basicGroup.addChild(new es3fFboDepthbufferTests.BasicFboDepthCase(es3fFboTestUtil.getFormatName(depthFormats[ndx]), '', depthFormats[ndx], 119, 127));
    344 
    345    // .depth_write_clamp
    346    var depthClampGroup = tcuTestCase.newTest('depth_write_clamp', 'Depth write clamping tests');
    347    this.addChild(depthClampGroup);
    348 
    349    for (var ndx = 0; ndx < depthFormats.length; ndx++)
    350        depthClampGroup.addChild(new es3fFboDepthbufferTests.DepthWriteClampCase(es3fFboTestUtil.getFormatName(depthFormats[ndx]), '', depthFormats[ndx], 119, 127));
    351 
    352    // .depth_test_clamp
    353    var depthTestGroup = tcuTestCase.newTest('depth_test_clamp', 'Depth test value clamping tests');
    354    this.addChild(depthTestGroup);
    355 
    356    for (var ndx = 0; ndx < depthFormats.length; ndx++)
    357        depthTestGroup.addChild(new es3fFboDepthbufferTests.DepthTestClampCase(es3fFboTestUtil.getFormatName(depthFormats[ndx]), '', depthFormats[ndx], 119, 127));
    358 
    359 };
    360 
    361 /**
    362 * Run test
    363 * @param {WebGL2RenderingContext} context
    364 */
    365 es3fFboDepthbufferTests.run = function(context) {
    366    gl = context;
    367    //Set up Test Root parameters
    368    var state = tcuTestCase.runner;
    369    state.setRoot(new es3fFboDepthbufferTests.FboDepthbufferTests());
    370 
    371    //Set up name and description of this test series.
    372    setCurrentTestName(state.testCases.fullName());
    373    description(state.testCases.getDescription());
    374 
    375    try {
    376        //Run test cases
    377        tcuTestCase.runTestCases();
    378    }
    379    catch (err) {
    380        testFailedOptions('Failed to es3fFboDepthbufferTests.run tests', false);
    381        tcuTestCase.runner.terminate();
    382    }
    383 };
    384 
    385 });