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;