Skip to content

Commit dcf8adb

Browse files
committed
Add test for TEXTURE_MIN/MAG_FILTER and TEXTURE_MAX_ANISOTROPY.
Addresses #3143.
1 parent 71413e9 commit dcf8adb

File tree

3 files changed

+253
-1
lines changed

3 files changed

+253
-1
lines changed

sdk/tests/conformance/textures/misc/00_test_list.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ copy-tex-image-and-sub-image-2d.html
44
--min-version 1.0.2 copy-tex-image-2d-formats.html
55
--min-version 1.0.4 copy-tex-image-crash.html
66
--min-version 1.0.4 copytexsubimage2d-large-partial-copy-corruption.html
7-
--min-version 1.0.4 copytexsubimage2d-subrects.html
7+
--min-version 1.0.4 copytexsubimage2d-subrects.html
88
--min-version 1.0.4 cube-incomplete-fbo.html
99
--min-version 1.0.4 cube-map-uploads-out-of-order.html
1010
--min-version 1.0.3 default-texture.html
@@ -38,6 +38,7 @@ texture-complete.html
3838
--min-version 1.0.3 --max-version 1.9.9 texture-fakeblack.html
3939
--min-version 1.0.2 --max-version 1.9.9 texture-formats-test.html
4040
--min-version 1.0.2 texture-hd-dpi.html
41+
--min-version 1.0.4 texture-min-mag-filter.html
4142
texture-mips.html
4243
--max-version 1.9.9 texture-npot-video.html
4344
--max-version 1.9.9 texture-npot.html
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
<!--
2+
Copyright (c) 2020 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+
<!DOCTYPE html>
8+
<html>
9+
<head>
10+
<meta charset="utf-8">
11+
<title>Test TEXTURE_MIN/MAG_FILTER and TEXTURE_MAX_ANISOTROPY</title>
12+
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
13+
<script src="../../../js/js-test-pre.js"></script>
14+
<script src="../../../js/webgl-test-utils.js"></script>
15+
</head>
16+
<body>
17+
<div id="description"></div>
18+
<div id="console"></div>
19+
<script>
20+
"use strict";
21+
description("Test TEXTURE_MIN/MAG_FILTER and TEXTURE_MAX_ANISOTROPY");
22+
debug("");
23+
24+
var wtu = WebGLTestUtils;
25+
var gl = wtu.create3DContext();
26+
27+
if (!gl) {
28+
testFailed("WebGL context does not exist");
29+
} else {
30+
testPassed("WebGL context exists");
31+
32+
testFiltering();
33+
34+
debug('');
35+
wtu.glErrorShouldBe(gl, gl.NO_ERROR, "End of run");
36+
}
37+
38+
function makeRgbaFramebuffer(gl, w, h) {
39+
const tex = gl.createTexture();
40+
41+
let was = gl.getParameter(gl.TEXTURE_BINDING_2D);
42+
gl.bindTexture(gl.TEXTURE_2D, tex);
43+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
44+
gl.bindTexture(gl.TEXTURE_2D, was);
45+
46+
const fb = gl.createFramebuffer();
47+
was = gl.getParameter(gl.FRAMEBUFFER_BINDING);
48+
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
49+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0,
50+
gl.TEXTURE_2D, tex, 0);
51+
gl.bindFramebuffer(gl.FRAMEBUFFER, was);
52+
53+
return fb;
54+
}
55+
56+
function testFiltering() {
57+
const RED = [255, 0, 0, 255];
58+
const GREEN = [0, 255, 0, 255];
59+
const BLUE = [0, 0, 255, 255];
60+
const DATA_LEVEL_0 = new Uint8Array([
61+
RED[0], RED[1], RED[2], RED[3],
62+
GREEN[0], GREEN[1], GREEN[2], GREEN[3],
63+
GREEN[0], GREEN[1], GREEN[2], GREEN[3],
64+
RED[0], RED[1], RED[2], RED[3],
65+
]);
66+
67+
const DATA_LEVEL_1 = new Uint8Array([
68+
BLUE[0], BLUE[1], BLUE[2], BLUE[3],
69+
]);
70+
71+
const tex = gl.createTexture();
72+
gl.bindTexture(gl.TEXTURE_2D, tex);
73+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, gl.UNSIGNED_BYTE, DATA_LEVEL_0);
74+
gl.texImage2D(gl.TEXTURE_2D, 1, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, DATA_LEVEL_1);
75+
76+
const VS = `
77+
void main() {
78+
gl_Position = vec4(0, 0, 0, 1);
79+
gl_PointSize = 1.0;
80+
}
81+
`;
82+
const FS = `
83+
uniform sampler2D u_tex0;
84+
precision mediump float;
85+
void main() {
86+
vec2 pos = gl_PointCoord - vec2(0.5);
87+
pos.x *= 1.03;
88+
pos += vec2(0.3);
89+
gl_FragColor = texture2D(u_tex0, pos, -0.7);
90+
//gl_FragColor.rg = pos;
91+
}
92+
`;
93+
94+
const prog = gl.createProgram();
95+
let shader;
96+
shader = gl.createShader(gl.VERTEX_SHADER);
97+
gl.shaderSource(shader, VS);
98+
gl.compileShader(shader);
99+
gl.attachShader(prog, shader);
100+
101+
shader = gl.createShader(gl.FRAGMENT_SHADER);
102+
gl.shaderSource(shader, FS);
103+
gl.compileShader(shader);
104+
gl.attachShader(prog, shader);
105+
106+
gl.linkProgram(prog);
107+
gl.useProgram(prog);
108+
109+
// -
110+
111+
const fb = makeRgbaFramebuffer(gl, 1, 1);
112+
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
113+
gl.viewport(0, 0, 1, 1);
114+
115+
const MAG = [
116+
gl.NEAREST, gl.LINEAR
117+
];
118+
const MIN = [
119+
{
120+
filter: gl.NEAREST,
121+
test: (r, g, b, a) => r && !g && !b,
122+
}, {
123+
filter: gl.LINEAR,
124+
test: (r, g, b, a) => r && g && !b,
125+
}, {
126+
filter: gl.NEAREST_MIPMAP_NEAREST,
127+
test: (r, g, b, a) => r && !g && !b,
128+
}, {
129+
// LINEAR, MIPMAP_NEAREST: Linear within mipmap that's nearest
130+
filter: gl.LINEAR_MIPMAP_NEAREST,
131+
test: (r, g, b, a) => r && g && !b,
132+
}, {
133+
// NEAREST, MIPMAP_LINEAR: The opposite
134+
filter: gl.NEAREST_MIPMAP_LINEAR,
135+
//test: (r, g, b, a) => r && !g && b,
136+
// NEAREST_MIPMAP_LINEAR w/ anisotropy sometimes yields RED.
137+
test: (r, g, b, a) => !g,
138+
}, {
139+
filter: gl.LINEAR_MIPMAP_LINEAR,
140+
test: (r, g, b, a) => r && g && b,
141+
},
142+
];
143+
144+
const ANISO = [1];
145+
const anisoExt = gl.getExtension('EXT_texture_filter_anisotropic');
146+
if (anisoExt) {
147+
ANISO.push(2);
148+
}
149+
150+
for (const min of MIN) {
151+
debug('\nmin: ' + wtu.glEnumToString(gl,min.filter));
152+
for (const mag of MAG) {
153+
debug(' mag: ' + wtu.glEnumToString(gl,mag));
154+
for (const aniso of ANISO) {
155+
debug(' aniso: ' + aniso);
156+
const res = filtering_result(mag, min.filter, anisoExt, aniso);
157+
debug(' res: ' + res);
158+
const ok = min.test(res[0], res[1], res[2], res[3]);
159+
if (ok) {
160+
testPassed('Result was ' + res.toString());
161+
} else {
162+
testFailed('Result was ' + res.toString());
163+
}
164+
}
165+
}
166+
}
167+
}
168+
169+
function filtering_result(mag, min, anisoExt, aniso) {
170+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, mag);
171+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, min);
172+
if (anisoExt) {
173+
gl.texParameterf(gl.TEXTURE_2D, anisoExt.TEXTURE_MAX_ANISOTROPY_EXT, aniso);
174+
}
175+
176+
gl.clearColor(0, 0, 0, 0);
177+
gl.clear(gl.COLOR_BUFFER_BIT);
178+
gl.drawArrays(gl.POINTS, 0, 1);
179+
180+
const data = new Uint8Array(4);
181+
gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, data);
182+
return data;
183+
}
184+
185+
var successfullyParsed = true;
186+
</script>
187+
<script src="../../../js/js-test-post.js"></script>
188+
189+
</body>
190+
</html>
191+

sdk/tests/js/tests/ext-texture-filter-anisotropic.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ if (!gl) {
3434
if (contextVersion >= 2) {
3535
runSamplerTestEnabled();
3636
}
37+
testFiltering();
3738
}
3839
}
3940

@@ -162,5 +163,64 @@ function runSamplerTestEnabled() {
162163
gl.deleteSampler(sampler);
163164
}
164165

166+
function makeRgbaFramebuffer(gl, w, h) {
167+
const tex = gl.createTexture();
168+
169+
let was = gl.getParameter(gl.TEXTURE_2D_BINDING);
170+
gl.bindTexture(gl.TEXTURE_2D, tex);
171+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
172+
gl.bindTexture(gl.TEXTURE_2D, was);
173+
174+
const fb = gl.createFramebuffer();
175+
was = gl.getParameter(gl.FRAMEBUFFER_BINDING);
176+
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
177+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0,
178+
gl.TEXTURE_2D, tex, 0);
179+
gl.bindFramebuffer(gl.FRAMEBUFFER, was);
180+
181+
return fb;
182+
}
183+
184+
function testFiltering() {
185+
const fb = makeRgbaFramebuffer(gl, 1, 1);
186+
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
187+
188+
const DATA_LEVEL_0 = new Uint8Array([
189+
255, 0, 0, 255,
190+
0, 255, 0, 255,
191+
0, 255, 0, 255,
192+
255, 0, 0, 255,
193+
]);
194+
195+
const DATA_LEVEL_1 = new Uint8Array([
196+
0, 0, 255, 255,
197+
]);
198+
199+
const tex = gl.createTexture();
200+
gl.bindTexture(gl.TEXTURE_2D, tex);
201+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, gl.UNSIGNED_BYTE, DATA_LEVEL_0);
202+
gl.texImage2D(gl.TEXTURE_2D, 1, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, DATA_LEVEL_1);
203+
204+
const VS = `
205+
void main() {
206+
gl_Position = vec4(0, 0, 0, 1);
207+
}
208+
`;
209+
const FS = `
210+
uniform sampler2D u_tex0;
211+
void main() {
212+
gl_FragColor = texture2D(u_tex0, vec2(0.3, 0.3), 0.3);
213+
}
214+
`;
215+
216+
217+
218+
219+
220+
221+
222+
223+
224+
165225
debug("");
166226
var successfullyParsed = true;

0 commit comments

Comments
 (0)