blob: 8844bbf5440918181d519074ddb8b49a28a2498d [file] [log] [blame]
/*
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;