tor-browser

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

es3fTextureStateQuery.js (15431B)


      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.es3fTextureStateQuery');
     23 goog.require('framework.common.tcuTestCase');
     24 goog.require('framework.delibs.debase.deRandom');
     25 goog.require('functional.gles3.es3fApiCase');
     26 goog.require('modules.shared.glsStateQuery');
     27 
     28 goog.scope(function() {
     29 var es3fTextureStateQuery = functional.gles3.es3fTextureStateQuery;
     30 var tcuTestCase = framework.common.tcuTestCase;
     31 var glsStateQuery = modules.shared.glsStateQuery;
     32 var es3fApiCase = functional.gles3.es3fApiCase;
     33 var deRandom = framework.delibs.debase.deRandom;
     34 
     35 var setParentClass = function(child, parent) {
     36    child.prototype = Object.create(parent.prototype);
     37    child.prototype.constructor = child;
     38 };
     39 
     40 /**
     41 * @constructor
     42 * @extends {es3fApiCase.ApiCase}
     43 * @param {string} name
     44 * @param {string} description
     45 * @param {number} textureTarget
     46 */
     47 es3fTextureStateQuery.TextureCase = function(name, description, textureTarget) {
     48    es3fApiCase.ApiCase.call(this, name, description, gl);
     49    /** @type {WebGLTexture} */ this.m_texture;
     50    this.m_textureTarget = textureTarget;
     51 };
     52 
     53 setParentClass(es3fTextureStateQuery.TextureCase, es3fApiCase.ApiCase);
     54 
     55 es3fTextureStateQuery.TextureCase.prototype.testTexture = function() {
     56    throw new Error('Virtual function. Please override.');
     57 };
     58 
     59 es3fTextureStateQuery.TextureCase.prototype.test = function() {
     60    this.m_texture = gl.createTexture();
     61    gl.bindTexture(this.m_textureTarget, this.m_texture);
     62 
     63    this.testTexture();
     64 
     65    gl.bindTexture(this.m_textureTarget, null);
     66    gl.deleteTexture(this.m_texture);
     67 };
     68 
     69 /**
     70 * @constructor
     71 * @extends {es3fTextureStateQuery.TextureCase}
     72 * @param {string} name
     73 * @param {string} description
     74 * @param {number} textureTarget
     75 */
     76 es3fTextureStateQuery.IsTextureCase = function(name, description, textureTarget) {
     77    es3fTextureStateQuery.TextureCase.call(this, name, description, textureTarget);
     78 };
     79 
     80 setParentClass(es3fTextureStateQuery.IsTextureCase, es3fTextureStateQuery.TextureCase);
     81 
     82 es3fTextureStateQuery.IsTextureCase.prototype.testTexture = function() {
     83    this.check(glsStateQuery.compare(gl.isTexture(this.m_texture), true), 'gl.isTexture() should have returned true');
     84 };
     85 
     86 /**
     87 * @constructor
     88 * @extends {es3fTextureStateQuery.TextureCase}
     89 * @param {string} name
     90 * @param {string} description
     91 * @param {number} textureTarget
     92 * @param {number} valueName
     93 * @param {number} initialValue
     94 * @param {Array<number>} valueRange
     95 */
     96 es3fTextureStateQuery.TextureParamCase = function(name, description, textureTarget, valueName, initialValue, valueRange) {
     97    es3fTextureStateQuery.TextureCase.call(this, name, description, textureTarget);
     98    this.m_valueName = valueName;
     99    this.m_initialValue = initialValue;
    100    this.m_valueRange = valueRange;
    101 };
    102 
    103 setParentClass(es3fTextureStateQuery.TextureParamCase, es3fTextureStateQuery.TextureCase);
    104 
    105 es3fTextureStateQuery.TextureParamCase.prototype.testTexture = function() {
    106    this.check(glsStateQuery.verifyTexture(this.m_textureTarget, this.m_valueName, this.m_initialValue));
    107 
    108    for (var ndx = 0; ndx < this.m_valueRange.length; ++ndx) {
    109        gl.texParameteri(this.m_textureTarget, this.m_valueName, this.m_valueRange[ndx]);
    110 
    111        this.check(glsStateQuery.verifyTexture(this.m_textureTarget, this.m_valueName, this.m_valueRange[ndx]));
    112    }
    113 
    114    //check unit conversions with float
    115 
    116    for (var ndx = 0; ndx < this.m_valueRange.length; ++ndx) {
    117        gl.texParameterf(this.m_textureTarget, this.m_valueName, this.m_valueRange[ndx]);
    118 
    119        this.check(glsStateQuery.verifyTexture(this.m_textureTarget, this.m_valueName, this.m_valueRange[ndx]));
    120    }
    121 };
    122 
    123 /**
    124 * @constructor
    125 * @extends {es3fTextureStateQuery.TextureCase}
    126 * @param {string} name
    127 * @param {string} description
    128 * @param {number} textureTarget
    129 * @param {number} lodTarget
    130 * @param {number} initialValue
    131 */
    132 es3fTextureStateQuery.TextureLODCase = function(name, description, textureTarget, lodTarget, initialValue) {
    133    es3fTextureStateQuery.TextureCase.call(this, name, description, textureTarget);
    134    this.m_lodTarget = lodTarget;
    135    this.m_initialValue = initialValue;
    136 };
    137 
    138 setParentClass(es3fTextureStateQuery.TextureLODCase, es3fTextureStateQuery.TextureCase);
    139 
    140 es3fTextureStateQuery.TextureLODCase.prototype.testTexture = function() {
    141    var rnd = new deRandom.Random(0xabcdef);
    142 
    143    this.check(glsStateQuery.verifyTexture(this.m_textureTarget, this.m_lodTarget, this.m_initialValue));
    144 
    145    var numIterations = 60;
    146    for (var ndx = 0; ndx < numIterations; ++ndx) {
    147        var ref = rnd.getFloat(-64000, 64000);
    148 
    149        gl.texParameterf(this.m_textureTarget, this.m_lodTarget, ref);
    150 
    151        this.check(glsStateQuery.verifyTexture(this.m_textureTarget, this.m_lodTarget, ref));
    152    }
    153 
    154    // check unit conversions with int
    155 
    156    for (var ndx = 0; ndx < numIterations; ++ndx) {
    157        var ref = rnd.getInt(-64000, 64000);
    158 
    159        gl.texParameteri(this.m_textureTarget, this.m_lodTarget, ref);
    160 
    161        this.check(glsStateQuery.verifyTexture(this.m_textureTarget, this.m_lodTarget, ref));
    162    }
    163 };
    164 
    165 /**
    166 * @constructor
    167 * @extends {es3fTextureStateQuery.TextureCase}
    168 * @param {string} name
    169 * @param {string} description
    170 * @param {number} textureTarget
    171 * @param {number} levelTarget
    172 * @param {number} initialValue
    173 */
    174 es3fTextureStateQuery.TextureLevelCase = function(name, description, textureTarget, levelTarget, initialValue) {
    175    es3fTextureStateQuery.TextureCase.call(this, name, description, textureTarget);
    176    this.m_levelTarget = levelTarget;
    177    this.m_initialValue = initialValue;
    178 };
    179 
    180 setParentClass(es3fTextureStateQuery.TextureLevelCase, es3fTextureStateQuery.TextureCase);
    181 
    182 es3fTextureStateQuery.TextureLevelCase.prototype.testTexture = function() {
    183    var rnd = new deRandom.Random(0xabcdef);
    184 
    185    this.check(glsStateQuery.verifyTexture(this.m_textureTarget, this.m_levelTarget, this.m_initialValue));
    186 
    187    var numIterations = 60;
    188    for (var ndx = 0; ndx < numIterations; ++ndx) {
    189        var ref = rnd.getInt(0, 64000);
    190 
    191        gl.texParameteri(this.m_textureTarget, this.m_levelTarget, ref);
    192 
    193        this.check(glsStateQuery.verifyTexture(this.m_textureTarget, this.m_levelTarget, ref));
    194    }
    195 
    196    // check unit conversions with float
    197    var nonSignificantOffsets = [-0.45, -0.25, 0, 0.45]; // offsets O so that for any integers z in Z, o in O roundToClosestInt(z+o)==z
    198 
    199    for (var ndx = 0; ndx < numIterations; ++ndx) {
    200        var ref = rnd.getInt(0, 64000);
    201 
    202        for (var i = 0; i < nonSignificantOffsets.length; i++) {
    203            gl.texParameterf(this.m_textureTarget, this.m_levelTarget, ref + nonSignificantOffsets[i]);
    204            this.check(glsStateQuery.verifyTexture(this.m_textureTarget, this.m_levelTarget, ref));
    205        }
    206    }
    207 };
    208 
    209 /**
    210 * @constructor
    211 * @extends {es3fTextureStateQuery.TextureCase}
    212 * @param {string} name
    213 * @param {string} description
    214 * @param {number} textureTarget
    215 */
    216 es3fTextureStateQuery.TextureImmutableLevelsCase = function(name, description, textureTarget) {
    217    es3fTextureStateQuery.TextureCase.call(this, name, description, textureTarget);
    218 };
    219 
    220 setParentClass(es3fTextureStateQuery.TextureImmutableLevelsCase, es3fTextureStateQuery.TextureCase);
    221 
    222 es3fTextureStateQuery.TextureImmutableLevelsCase.prototype.testTexture = function() {
    223    this.check(glsStateQuery.verifyTexture(this.m_textureTarget, gl.TEXTURE_IMMUTABLE_LEVELS, 0));
    224    for (var level = 1; level <= 8; ++level) {
    225        var textureID = gl.createTexture();
    226        gl.bindTexture(this.m_textureTarget, textureID);
    227 
    228        if (this.m_textureTarget == gl.TEXTURE_2D_ARRAY || this.m_textureTarget == gl.TEXTURE_3D)
    229            gl.texStorage3D(this.m_textureTarget, level, gl.RGB8, 256, 256, 256);
    230        else
    231            gl.texStorage2D(this.m_textureTarget, level, gl.RGB8, 256, 256);
    232 
    233        this.check(glsStateQuery.verifyTexture(this.m_textureTarget, gl.TEXTURE_IMMUTABLE_LEVELS, level));
    234        gl.deleteTexture(textureID);
    235    }
    236 };
    237 
    238 /**
    239 * @constructor
    240 * @extends {es3fTextureStateQuery.TextureCase}
    241 * @param {string} name
    242 * @param {string} description
    243 * @param {number} textureTarget
    244 */
    245 es3fTextureStateQuery.TextureImmutableFormatCase = function(name, description, textureTarget) {
    246    es3fTextureStateQuery.TextureCase.call(this, name, description, textureTarget);
    247 };
    248 
    249 setParentClass(es3fTextureStateQuery.TextureImmutableFormatCase, es3fTextureStateQuery.TextureCase);
    250 
    251 es3fTextureStateQuery.TextureImmutableFormatCase.prototype.testTexture = function() {
    252    this.check(glsStateQuery.verifyTexture(this.m_textureTarget, gl.TEXTURE_IMMUTABLE_LEVELS, 0));
    253    var testSingleFormat = function(format) {
    254        var textureID = gl.createTexture();
    255        gl.bindTexture(this.m_textureTarget, textureID);
    256 
    257        if (this.m_textureTarget == gl.TEXTURE_2D_ARRAY || this.m_textureTarget == gl.TEXTURE_3D)
    258            gl.texStorage3D(this.m_textureTarget, 1, format, 32, 32, 32);
    259        else
    260            gl.texStorage2D(this.m_textureTarget, 1, format, 32, 32);
    261 
    262        this.check(glsStateQuery.verifyTexture(this.m_textureTarget, gl.TEXTURE_IMMUTABLE_FORMAT, 1));
    263        gl.deleteTexture(textureID);
    264    };
    265 
    266    var formats = [
    267        gl.RGBA32I, gl.RGBA32UI, gl.RGBA16I, gl.RGBA16UI, gl.RGBA8, gl.RGBA8I,
    268        gl.RGBA8UI, gl.SRGB8_ALPHA8, gl.RGB10_A2, gl.RGB10_A2UI, gl.RGBA4,
    269        gl.RGB5_A1, gl.RGB8, gl.RGB565, gl.RG32I, gl.RG32UI, gl.RG16I, gl.RG16UI,
    270        gl.RG8, gl.RG8I, gl.RG8UI, gl.R32I, gl.R32UI, gl.R16I, gl.R16UI, gl.R8,
    271        gl.R8I, gl.R8UI,
    272 
    273        gl.RGBA32F, gl.RGBA16F, gl.RGBA8_SNORM, gl.RGB32F,
    274        gl.RGB32I, gl.RGB32UI, gl.RGB16F, gl.RGB16I, gl.RGB16UI, gl.RGB8_SNORM,
    275        gl.RGB8I, gl.RGB8UI, gl.SRGB8, gl.R11F_G11F_B10F, gl.RGB9_E5, gl.RG32F,
    276        gl.RG16F, gl.RG8_SNORM, gl.R32F, gl.R16F, gl.R8_SNORM
    277    ];
    278 
    279    var non3dFormats = [
    280        gl.DEPTH_COMPONENT32F, gl.DEPTH_COMPONENT24, gl.DEPTH_COMPONENT16,
    281        gl.DEPTH32F_STENCIL8, gl.DEPTH24_STENCIL8
    282    ];
    283 
    284    for (var formatNdx = 0; formatNdx < formats.length; ++formatNdx)
    285        testSingleFormat.bind(this, formats[formatNdx]);
    286 
    287    if (this.m_textureTarget != gl.TEXTURE_3D)
    288        for (var formatNdx = 0; formatNdx < non3dFormats.length; ++formatNdx)
    289            testSingleFormat.bind(this, non3dFormats[formatNdx]);
    290 };
    291 
    292 /**
    293 * @constructor
    294 * @extends {tcuTestCase.DeqpTest}
    295 */
    296 es3fTextureStateQuery.TextureStateQuery = function() {
    297    tcuTestCase.DeqpTest.call(this, 'texture', 'Texture State Query tests');
    298 };
    299 
    300 es3fTextureStateQuery.TextureStateQuery.prototype = Object.create(tcuTestCase.DeqpTest.prototype);
    301 es3fTextureStateQuery.TextureStateQuery.prototype.constructor = es3fTextureStateQuery.TextureStateQuery;
    302 
    303 es3fTextureStateQuery.TextureStateQuery.prototype.init = function() {
    304    var textureTargets = [
    305        ['texture_2d', gl.TEXTURE_2D],
    306        ['texture_3d', gl.TEXTURE_3D],
    307        ['texture_2d_array', gl.TEXTURE_2D_ARRAY],
    308        ['texture_cube_map', gl.TEXTURE_CUBE_MAP]
    309    ];
    310 
    311    var state = this;
    312    var wrapValues = [gl.CLAMP_TO_EDGE, gl.REPEAT, gl.MIRRORED_REPEAT];
    313    var magValues = [gl.NEAREST, gl.LINEAR];
    314    var minValues = [gl.NEAREST, gl.LINEAR, gl.NEAREST_MIPMAP_NEAREST, gl.NEAREST_MIPMAP_LINEAR, gl.LINEAR_MIPMAP_NEAREST, gl.LINEAR_MIPMAP_LINEAR];
    315    var modes = [gl.COMPARE_REF_TO_TEXTURE, gl.NONE];
    316    var compareFuncs = [gl.LEQUAL, gl.GEQUAL, gl.LESS, gl.GREATER, gl.EQUAL, gl.NOTEQUAL, gl.ALWAYS, gl.NEVER];
    317    textureTargets.forEach(function(elem) {
    318        var name = elem[0];
    319        var target = elem[1];
    320        state.addChild(new es3fTextureStateQuery.IsTextureCase(name + '_is_texture', 'IsTexture', target));
    321        state.addChild(new es3fTextureStateQuery.TextureParamCase(name + '_texture_wrap_s' , 'TEXTURE_WRAP_S',
    322            target, gl.TEXTURE_WRAP_S, gl.REPEAT, wrapValues));
    323        if (target == gl.TEXTURE_2D ||
    324            target == gl.TEXTURE_3D ||
    325            target == gl.TEXTURE_CUBE_MAP)
    326            state.addChild(new es3fTextureStateQuery.TextureParamCase(name + '_texture_wrap_t' , 'TEXTURE_WRAP_T',
    327                target, gl.TEXTURE_WRAP_T, gl.REPEAT, wrapValues));
    328 
    329        if (target == gl.TEXTURE_3D)
    330            state.addChild(new es3fTextureStateQuery.TextureParamCase(name + '_texture_wrap_r' , 'TEXTURE_WRAP_R',
    331                target, gl.TEXTURE_WRAP_R, gl.REPEAT, wrapValues));
    332 
    333        state.addChild(new es3fTextureStateQuery.TextureParamCase(name + '_texture_mag_filter' , 'TEXTURE_MAG_FILTER',
    334            target, gl.TEXTURE_MAG_FILTER, gl.LINEAR, magValues));
    335        state.addChild(new es3fTextureStateQuery.TextureParamCase(name + '_texture_min_filter' , 'TEXTURE_MIN_FILTER',
    336            target, gl.TEXTURE_MIN_FILTER, gl.NEAREST_MIPMAP_LINEAR, minValues));
    337        state.addChild(new es3fTextureStateQuery.TextureLODCase(name + '_texture_min_lod' , 'TEXTURE_MIN_LOD', target, gl.TEXTURE_MIN_LOD, -1000));
    338        state.addChild(new es3fTextureStateQuery.TextureLODCase(name + '_texture_max_lod' , 'TEXTURE_MAX_LOD', target, gl.TEXTURE_MAX_LOD, 1000));
    339        state.addChild(new es3fTextureStateQuery.TextureLevelCase(name + '_texture_base_level' , 'TEXTURE_BASE_LEVEL', target, gl.TEXTURE_BASE_LEVEL, 0));
    340        state.addChild(new es3fTextureStateQuery.TextureLevelCase(name + '_texture_max_level' , 'TEXTURE_MAX_LEVEL', target, gl.TEXTURE_MAX_LEVEL, 1000));
    341 
    342        state.addChild(new es3fTextureStateQuery.TextureParamCase(name + '_texture_compare_mode' , 'TEXTURE_COMPARE_MODE',
    343            target, gl.TEXTURE_COMPARE_MODE, gl.NONE, modes));
    344        state.addChild(new es3fTextureStateQuery.TextureParamCase(name + '_texture_compare_func' , 'TEXTURE_COMPARE_FUNC',
    345            target, gl.TEXTURE_COMPARE_FUNC, gl.LEQUAL, compareFuncs));
    346 
    347        state.addChild(new es3fTextureStateQuery.TextureImmutableLevelsCase(name + '_texture_immutable_levels', 'TEXTURE_IMMUTABLE_LEVELS', target));
    348        state.addChild(new es3fTextureStateQuery.TextureImmutableFormatCase(name + '_texture_immutable_format', 'TEXTURE_IMMUTABLE_FORMAT', target));
    349    });
    350 };
    351 
    352 /**
    353 * Run test
    354 * @param {WebGL2RenderingContext} context
    355 */
    356 es3fTextureStateQuery.run = function(context) {
    357    gl = context;
    358    //Set up Test Root parameters
    359    var state = tcuTestCase.runner;
    360    state.setRoot(new es3fTextureStateQuery.TextureStateQuery());
    361 
    362    //Set up name and description of this test series.
    363    setCurrentTestName(state.testCases.fullName());
    364    description(state.testCases.getDescription());
    365 
    366    try {
    367        //Run test cases
    368        tcuTestCase.runTestCases();
    369    }
    370    catch (err) {
    371        testFailedOptions('Failed to es3fTextureStateQuery.run tests', false);
    372        tcuTestCase.runner.terminate();
    373    }
    374 };
    375 
    376 });