tor-browser

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

gl-get-tex-parameter.js (6349B)


      1 /*
      2 Copyright (c) 2019 The Khronos Group Inc.
      3 Use of this source code is governed by an MIT-style license that can be
      4 found in the LICENSE.txt file.
      5 */
      6 
      7 // This test relies on the surrounding web page defining a variable
      8 // "contextVersion" which indicates what version of WebGL it's running
      9 // on -- 1 for WebGL 1.0, 2 for WebGL 2.0, etc.
     10 
     11 "use strict";
     12 description();
     13 var wtu = WebGLTestUtils;
     14 var gl = wtu.create3DContext("example", undefined, contextVersion);
     15 
     16 // NOTE: We explicitly do this in a funky order
     17 // to hopefully find subtle bugs.
     18 
     19 var targets = [
     20  'TEXTURE_2D',
     21  'TEXTURE_2D',
     22  'TEXTURE_CUBE_MAP',
     23  'TEXTURE_CUBE_MAP'
     24 ];
     25 
     26 if (contextVersion > 1) {
     27  targets = targets.concat([
     28    'TEXTURE_2D_ARRAY',
     29    'TEXTURE_2D_ARRAY',
     30    'TEXTURE_3D',
     31    'TEXTURE_3D'
     32  ]);
     33 }
     34 
     35 // Create textures on different active textures.
     36 for (var ii = 0; ii < targets.length; ++ii) {
     37  var target = targets[ii];
     38  var tex = gl.createTexture();
     39  gl.activeTexture(gl.TEXTURE0 + ii);
     40  gl.bindTexture(gl[target], tex);
     41 }
     42 
     43 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "should be no errors");
     44 
     45 var states = [
     46  { state: 'TEXTURE_WRAP_S',            default: 'REPEAT',                 value1: 'CLAMP_TO_EDGE',           value2: 'REPEAT'          },
     47  { state: 'TEXTURE_WRAP_T',            default: 'REPEAT',                 value1: 'MIRRORED_REPEAT',         value2: 'REPEAT'          },
     48  { state: 'TEXTURE_MAG_FILTER',        default: 'LINEAR',                 value1: 'NEAREST',                 value2: 'LINEAR'          },
     49  { state: 'TEXTURE_MIN_FILTER',        default: 'NEAREST_MIPMAP_LINEAR',  value1: 'LINEAR_MIPMAP_LINEAR',    value2: 'NEAREST'         }
     50 ];
     51 
     52 if (contextVersion > 1) {
     53  states = states.concat([
     54    { state: 'TEXTURE_WRAP_R',            default: 'REPEAT',                 value1: 'CLAMP_TO_EDGE',           value2: 'MIRRORED_REPEAT' },
     55    { state: 'TEXTURE_COMPARE_FUNC',      default: 'LEQUAL',                 value1: 'GREATER',                 value2: 'LESS'            },
     56    { state: 'TEXTURE_COMPARE_MODE',      default: 'NONE',                   value1: 'COMPARE_REF_TO_TEXTURE',  value2: 'NONE'            },
     57    { state: 'TEXTURE_BASE_LEVEL',        default: 0,                        value1: 100,                       value2: 99                },
     58    { state: 'TEXTURE_MAX_LEVEL',         default: 1000,                     value1: 800,                       value2: 300               },
     59    { state: 'TEXTURE_MIN_LOD',           default: -1000.0,                  value1: -500.0,                    value2: -999.0            },
     60    { state: 'TEXTURE_MAX_LOD',           default: 1000.0,                   value1: 500.0,                     value2: 999.0             },
     61    // Note: For TEXTURE_IMMUTABLE_LEVELS and TEXTURE_IMMUTABLE_FORMAT,
     62    // these two pname are used by getTexParameter API only, not available in texParameter[fi] in specifications.
     63    // Thus, these two states store default value only.
     64    { state: 'TEXTURE_IMMUTABLE_LEVELS',  default: 0,     },
     65    { state: 'TEXTURE_IMMUTABLE_FORMAT',  default: false, }
     66  ]);
     67 }
     68 
     69 function getStateInfoValue(stateInfo, item, method) {
     70  switch (stateInfo.state) {
     71  case 'TEXTURE_WRAP_R':
     72  case 'TEXTURE_WRAP_S':
     73  case 'TEXTURE_WRAP_T':
     74  case 'TEXTURE_MAG_FILTER':
     75  case 'TEXTURE_MIN_FILTER':
     76  case 'TEXTURE_COMPARE_FUNC':
     77  case 'TEXTURE_COMPARE_MODE':
     78      if (method === 'Get') {
     79        return 'gl["' + stateInfo[item] + '"]';
     80      } else if (method === 'Set') {
     81        return gl[stateInfo[item]];
     82      }
     83      break;
     84  case 'TEXTURE_BASE_LEVEL':
     85  case 'TEXTURE_MAX_LEVEL':
     86  case 'TEXTURE_MIN_LOD':
     87  case 'TEXTURE_MAX_LOD':
     88      if (method === 'Get') {
     89        return '' + stateInfo[item];
     90      } else if (method === 'Set') {
     91        return stateInfo[item];
     92      }
     93      break;
     94  case 'TEXTURE_IMMUTABLE_LEVELS':
     95  case 'TEXTURE_IMMUTABLE_FORMAT':
     96      // Return default value only.
     97      return '' + stateInfo.default;
     98  default:
     99      wtu.error("Not reached!");
    100      return null;
    101      break;
    102  }
    103 }
    104 
    105 function applyStates(fn) {
    106  for (var ss = 0; ss < states.length; ++ss) {
    107    var stateInfo = states[ss];
    108    for (var ii = 0; ii < targets.length; ++ii) {
    109      var target = targets[ii];
    110      gl.activeTexture(gl.TEXTURE0 + ii);
    111      fn(target, stateInfo);
    112    }
    113  }
    114 }
    115 
    116 // test the default state.
    117 applyStates(function(target, stateInfo) {
    118  var a = 'gl.getTexParameter(gl["' + target + '"], gl["' + stateInfo.state + '"])';
    119  var b = getStateInfoValue(stateInfo, 'default', 'Get');
    120  shouldBe(a, b);
    121 });
    122 
    123 // test new state
    124 applyStates(function(target, stateInfo) {
    125  switch (stateInfo.state) {
    126  case 'TEXTURE_IMMUTABLE_FORMAT':
    127  case 'TEXTURE_IMMUTABLE_LEVELS':
    128      // Skip these two pname for texParameterf[fi].
    129      break;
    130  case 'TEXTURE_MIN_LOD':
    131  case 'TEXTURE_MAX_LOD':
    132      gl.texParameterf(gl[target], gl[stateInfo.state], getStateInfoValue(stateInfo, 'value1', 'Set'));
    133      break;
    134  default:
    135      gl.texParameteri(gl[target], gl[stateInfo.state], getStateInfoValue(stateInfo, 'value1', 'Set'));
    136      break;
    137  }
    138 });
    139 
    140 applyStates(function(target, stateInfo) {
    141  var a = 'gl.getTexParameter(gl["' + target + '"], gl["' + stateInfo.state + '"])';
    142  var b = getStateInfoValue(stateInfo, 'value1', 'Get');
    143  shouldBe(a, b);
    144 });
    145 
    146 // test different states on each target.
    147 function getItem(count) {
    148  return (count % 2) ? 'value2' : 'value1';
    149 }
    150 
    151 applyStates(function() {
    152  var count = 0;
    153  return function(target, stateInfo) {
    154    switch (stateInfo.state) {
    155    case 'TEXTURE_IMMUTABLE_FORMAT':
    156    case 'TEXTURE_IMMUTABLE_LEVELS':
    157        // Skip these two pname for texParameterf[fi].
    158        break;
    159    case 'TEXTURE_MIN_LOD':
    160    case 'TEXTURE_MAX_LOD':
    161        gl.texParameterf(gl[target], gl[stateInfo.state], getStateInfoValue(stateInfo, getItem(count), 'Set'));
    162        break;
    163    default:
    164        gl.texParameteri(gl[target], gl[stateInfo.state], getStateInfoValue(stateInfo, getItem(count), 'Set'));
    165        break;
    166    }
    167    ++count;
    168  }
    169 }());
    170 
    171 applyStates(function() {
    172  var count = 0;
    173  return function(target, stateInfo) {
    174    var a = 'gl.getTexParameter(gl["' + target + '"], gl["' + stateInfo.state + '"])';
    175    var b = getStateInfoValue(stateInfo, getItem(count), 'Get');
    176    shouldBe(a, b);
    177    ++count;
    178  };
    179 }());
    180 
    181 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "should be no errors");
    182 
    183 var successfullyParsed = true;