183 lines
6.2 KiB
JavaScript
183 lines
6.2 KiB
JavaScript
/*
|
|
Copyright (c) 2019 The Khronos Group Inc.
|
|
Use of this source code is governed by an MIT-style license that can be
|
|
found in the LICENSE.txt file.
|
|
*/
|
|
|
|
// This test relies on the surrounding web page defining a variable
|
|
// "contextVersion" which indicates what version of WebGL it's running
|
|
// on -- 1 for WebGL 1.0, 2 for WebGL 2.0, etc.
|
|
|
|
"use strict";
|
|
description();
|
|
var wtu = WebGLTestUtils;
|
|
var gl = wtu.create3DContext("example", undefined, contextVersion);
|
|
|
|
// NOTE: We explicitly do this in a funky order
|
|
// to hopefully find subtle bugs.
|
|
|
|
var targets = [
|
|
'TEXTURE_2D',
|
|
'TEXTURE_2D',
|
|
'TEXTURE_CUBE_MAP',
|
|
'TEXTURE_CUBE_MAP'
|
|
];
|
|
|
|
if (contextVersion > 1) {
|
|
targets = targets.concat([
|
|
'TEXTURE_2D_ARRAY',
|
|
'TEXTURE_2D_ARRAY',
|
|
'TEXTURE_3D',
|
|
'TEXTURE_3D'
|
|
]);
|
|
}
|
|
|
|
// Create textures on different active textures.
|
|
for (var ii = 0; ii < targets.length; ++ii) {
|
|
var target = targets[ii];
|
|
var tex = gl.createTexture();
|
|
gl.activeTexture(gl.TEXTURE0 + ii);
|
|
gl.bindTexture(gl[target], tex);
|
|
}
|
|
|
|
wtu.glErrorShouldBe(gl, gl.NO_ERROR, "should be no errors");
|
|
|
|
var states = [
|
|
{ state: 'TEXTURE_WRAP_S', default: 'REPEAT', value1: 'CLAMP_TO_EDGE', value2: 'REPEAT' },
|
|
{ state: 'TEXTURE_WRAP_T', default: 'REPEAT', value1: 'MIRRORED_REPEAT', value2: 'REPEAT' },
|
|
{ state: 'TEXTURE_MAG_FILTER', default: 'LINEAR', value1: 'NEAREST', value2: 'LINEAR' },
|
|
{ state: 'TEXTURE_MIN_FILTER', default: 'NEAREST_MIPMAP_LINEAR', value1: 'LINEAR_MIPMAP_LINEAR', value2: 'NEAREST' }
|
|
];
|
|
|
|
if (contextVersion > 1) {
|
|
states = states.concat([
|
|
{ state: 'TEXTURE_WRAP_R', default: 'REPEAT', value1: 'CLAMP_TO_EDGE', value2: 'MIRRORED_REPEAT' },
|
|
{ state: 'TEXTURE_COMPARE_FUNC', default: 'LEQUAL', value1: 'GREATER', value2: 'LESS' },
|
|
{ state: 'TEXTURE_COMPARE_MODE', default: 'NONE', value1: 'COMPARE_REF_TO_TEXTURE', value2: 'NONE' },
|
|
{ state: 'TEXTURE_BASE_LEVEL', default: 0, value1: 100, value2: 99 },
|
|
{ state: 'TEXTURE_MAX_LEVEL', default: 1000, value1: 800, value2: 300 },
|
|
{ state: 'TEXTURE_MIN_LOD', default: -1000.0, value1: -500.0, value2: -999.0 },
|
|
{ state: 'TEXTURE_MAX_LOD', default: 1000.0, value1: 500.0, value2: 999.0 },
|
|
// Note: For TEXTURE_IMMUTABLE_LEVELS and TEXTURE_IMMUTABLE_FORMAT,
|
|
// these two pname are used by getTexParameter API only, not available in texParameter[fi] in specifications.
|
|
// Thus, these two states store default value only.
|
|
{ state: 'TEXTURE_IMMUTABLE_LEVELS', default: 0, },
|
|
{ state: 'TEXTURE_IMMUTABLE_FORMAT', default: false, }
|
|
]);
|
|
}
|
|
|
|
function getStateInfoValue(stateInfo, item, method) {
|
|
switch (stateInfo.state) {
|
|
case 'TEXTURE_WRAP_R':
|
|
case 'TEXTURE_WRAP_S':
|
|
case 'TEXTURE_WRAP_T':
|
|
case 'TEXTURE_MAG_FILTER':
|
|
case 'TEXTURE_MIN_FILTER':
|
|
case 'TEXTURE_COMPARE_FUNC':
|
|
case 'TEXTURE_COMPARE_MODE':
|
|
if (method === 'Get') {
|
|
return 'gl["' + stateInfo[item] + '"]';
|
|
} else if (method === 'Set') {
|
|
return gl[stateInfo[item]];
|
|
}
|
|
break;
|
|
case 'TEXTURE_BASE_LEVEL':
|
|
case 'TEXTURE_MAX_LEVEL':
|
|
case 'TEXTURE_MIN_LOD':
|
|
case 'TEXTURE_MAX_LOD':
|
|
if (method === 'Get') {
|
|
return '' + stateInfo[item];
|
|
} else if (method === 'Set') {
|
|
return stateInfo[item];
|
|
}
|
|
break;
|
|
case 'TEXTURE_IMMUTABLE_LEVELS':
|
|
case 'TEXTURE_IMMUTABLE_FORMAT':
|
|
// Return default value only.
|
|
return '' + stateInfo.default;
|
|
default:
|
|
wtu.error("Not reached!");
|
|
return null;
|
|
break;
|
|
}
|
|
}
|
|
|
|
function applyStates(fn) {
|
|
for (var ss = 0; ss < states.length; ++ss) {
|
|
var stateInfo = states[ss];
|
|
for (var ii = 0; ii < targets.length; ++ii) {
|
|
var target = targets[ii];
|
|
gl.activeTexture(gl.TEXTURE0 + ii);
|
|
fn(target, stateInfo);
|
|
}
|
|
}
|
|
}
|
|
|
|
// test the default state.
|
|
applyStates(function(target, stateInfo) {
|
|
var a = 'gl.getTexParameter(gl["' + target + '"], gl["' + stateInfo.state + '"])';
|
|
var b = getStateInfoValue(stateInfo, 'default', 'Get');
|
|
shouldBe(a, b);
|
|
});
|
|
|
|
// test new state
|
|
applyStates(function(target, stateInfo) {
|
|
switch (stateInfo.state) {
|
|
case 'TEXTURE_IMMUTABLE_FORMAT':
|
|
case 'TEXTURE_IMMUTABLE_LEVELS':
|
|
// Skip these two pname for texParameterf[fi].
|
|
break;
|
|
case 'TEXTURE_MIN_LOD':
|
|
case 'TEXTURE_MAX_LOD':
|
|
gl.texParameterf(gl[target], gl[stateInfo.state], getStateInfoValue(stateInfo, 'value1', 'Set'));
|
|
break;
|
|
default:
|
|
gl.texParameteri(gl[target], gl[stateInfo.state], getStateInfoValue(stateInfo, 'value1', 'Set'));
|
|
break;
|
|
}
|
|
});
|
|
|
|
applyStates(function(target, stateInfo) {
|
|
var a = 'gl.getTexParameter(gl["' + target + '"], gl["' + stateInfo.state + '"])';
|
|
var b = getStateInfoValue(stateInfo, 'value1', 'Get');
|
|
shouldBe(a, b);
|
|
});
|
|
|
|
// test different states on each target.
|
|
function getItem(count) {
|
|
return (count % 2) ? 'value2' : 'value1';
|
|
}
|
|
|
|
applyStates(function() {
|
|
var count = 0;
|
|
return function(target, stateInfo) {
|
|
switch (stateInfo.state) {
|
|
case 'TEXTURE_IMMUTABLE_FORMAT':
|
|
case 'TEXTURE_IMMUTABLE_LEVELS':
|
|
// Skip these two pname for texParameterf[fi].
|
|
break;
|
|
case 'TEXTURE_MIN_LOD':
|
|
case 'TEXTURE_MAX_LOD':
|
|
gl.texParameterf(gl[target], gl[stateInfo.state], getStateInfoValue(stateInfo, getItem(count), 'Set'));
|
|
break;
|
|
default:
|
|
gl.texParameteri(gl[target], gl[stateInfo.state], getStateInfoValue(stateInfo, getItem(count), 'Set'));
|
|
break;
|
|
}
|
|
++count;
|
|
}
|
|
}());
|
|
|
|
applyStates(function() {
|
|
var count = 0;
|
|
return function(target, stateInfo) {
|
|
var a = 'gl.getTexParameter(gl["' + target + '"], gl["' + stateInfo.state + '"])';
|
|
var b = getStateInfoValue(stateInfo, getItem(count), 'Get');
|
|
shouldBe(a, b);
|
|
++count;
|
|
};
|
|
}());
|
|
|
|
wtu.glErrorShouldBe(gl, gl.NO_ERROR, "should be no errors");
|
|
|
|
var successfullyParsed = true;
|