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.
10 <meta charset=
"utf-8">
11 <title>WebGL EXT_texture_norm16 Conformance Tests
</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>
17 <div id=
"description"></div>
18 <div id=
"console"></div>
21 description("This test verifies the functionality of the EXT_texture_norm16 extension, if it is available.");
25 var wtu
= WebGLTestUtils
;
26 var gl
= wtu
.create3DContext(null, null, 2);
33 var readbackBuf
= new Uint16Array(4);
35 function generateFormatColor(format
, value
, alpha
) {
36 alpha
= alpha
!== undefined ? alpha
: 255;
39 return [value
, 0, 0, alpha
];
41 return [value
, value
, 0, alpha
];
43 return [value
, value
, value
, alpha
];
45 return [value
, value
, value
, value
];
47 wtu
.error("Unreachable: Unknown format.");
52 function testNorm16Texture(internalFormat
, format
, type
, error
="NO_ERROR") {
53 debug(`\ntestNorm16Texture(${[].slice.call(arguments).join(", ")})`);
62 imageData
= new Int16Array(4).fill(pixelValue
);
64 case gl
.UNSIGNED_SHORT
:
66 expectedValue
= pixelValue
>> 8;
67 imageData
= new Uint16Array(4).fill(pixelValue
);
70 wtu
.error("Unreachable: Unknown texture type.");
74 // Texture sampled from
75 gl
.activeTexture(gl
.TEXTURE0
);
76 gl
.bindTexture(gl
.TEXTURE_2D
, textures
[0]);
77 gl
.texImage2D(gl
.TEXTURE_2D
, 0, ext
[internalFormat
] || gl
[internalFormat
],
78 1, 1, 0, gl
[format
], gl
[type
], imageData
);
80 wtu
.glErrorShouldBe(gl
, gl
[error
], `texImage should generate error:${error}`);
81 if (gl
[error
]) return;
83 gl
.drawArrays(gl
.TRIANGLES
, 0, 6);
85 // Read back as gl.UNSIGNED_BYTE
86 wtu
.checkCanvasRect(gl
, 0, 0, 1, 1, generateFormatColor(gl
[format
], expectedValue
));
89 function testNorm16Render(interalFormat
, format
, type
, tolerance
) {
90 // Only UNSIGNED_SHORT are renderable
91 let pixelValue
= 0x6a35;
92 let expectedValue
= pixelValue
;
93 let imageData
= new Uint16Array(4).fill(pixelValue
);
95 // Render to fbo texture attachment test
96 gl
.bindTexture(gl
.TEXTURE_2D
, textures
[1]);
97 gl
.texImage2D(gl
.TEXTURE_2D
, 0, interalFormat
, 1, 1, 0, format
, type
, null);
99 wtu
.glErrorShouldBe(gl
, gl
.NO_ERROR
, "rtt bindings succeed");
101 gl
.bindFramebuffer(gl
.FRAMEBUFFER
, fbos
[0]);
102 gl
.framebufferTexture2D(gl
.FRAMEBUFFER
, gl
.COLOR_ATTACHMENT0
, gl
.TEXTURE_2D
, textures
[1], 0);
104 wtu
.glErrorShouldBe(gl
, gl
.NO_ERROR
, "fbo bindings succeed");
106 gl
.activeTexture(gl
.TEXTURE0
);
107 gl
.bindTexture(gl
.TEXTURE_2D
, textures
[0]);
108 gl
.texImage2D(gl
.TEXTURE_2D
, 0, interalFormat
, 1, 1, 0, format
, type
, imageData
);
110 wtu
.glErrorShouldBe(gl
, gl
.NO_ERROR
, "texture bindings succeed");
112 gl
.drawArrays(gl
.TRIANGLES
, 0, 6);
114 wtu
.checkCanvasRect(gl
, 0, 0, 1, 1, generateFormatColor(format
, expectedValue
, 0xffff), undefined, tolerance
, readbackBuf
, type
);
117 gl
.bindFramebuffer(gl
.FRAMEBUFFER
, fbos
[1]);
118 gl
.bindRenderbuffer(gl
.RENDERBUFFER
, renderbuffer
);
119 gl
.renderbufferStorage(gl
.RENDERBUFFER
, interalFormat
, 1, 1);
120 gl
.framebufferRenderbuffer(gl
.FRAMEBUFFER
, gl
.COLOR_ATTACHMENT0
, gl
.RENDERBUFFER
,
122 gl
.bindRenderbuffer(gl
.RENDERBUFFER
, null);
124 wtu
.glErrorShouldBe(gl
, gl
.NO_ERROR
, "renderbuffer bindings succeed");
126 gl
.clearColor(1, 1, 1, 1);
127 gl
.clear(gl
.COLOR_BUFFER_BIT
);
129 wtu
.checkCanvasRect(gl
, 0, 0, 1, 1, generateFormatColor(format
, 0xffff, 0xffff), undefined, tolerance
, readbackBuf
, type
);
131 // Copy from renderbuffer to textures[1] test
132 gl
.bindTexture(gl
.TEXTURE_2D
, textures
[1]);
133 gl
.copyTexSubImage2D(gl
.TEXTURE_2D
, 0, 0, 0, 0, 0, 1, 1);
135 wtu
.glErrorShouldBe(gl
, gl
.NO_ERROR
, "copy succeed");
137 gl
.bindFramebuffer(gl
.FRAMEBUFFER
, fbos
[0]);
138 wtu
.checkCanvasRect(gl
, 0, 0, 1, 1, generateFormatColor(format
, 0xffff, 0xffff), undefined, tolerance
, readbackBuf
, type
);
140 gl
.bindFramebuffer(gl
.FRAMEBUFFER
, null);
141 gl
.bindTexture(gl
.TEXTURE_2D
, null);
144 function testExtFormatUnrenderable(internalFormatName
, format
, type
) {
145 gl
.bindTexture(gl
.TEXTURE_2D
, textures
[1]);
146 gl
.texImage2D(gl
.TEXTURE_2D
, 0, ext
[internalFormatName
], 1, 1, 0, format
, type
, null);
148 wtu
.glErrorShouldBe(gl
, gl
.NO_ERROR
, "texture definition succeeded");
150 gl
.bindFramebuffer(gl
.FRAMEBUFFER
, fbos
[0]);
151 gl
.framebufferTexture2D(gl
.FRAMEBUFFER
, gl
.COLOR_ATTACHMENT0
, gl
.TEXTURE_2D
, textures
[1], 0);
153 wtu
.glErrorShouldBe(gl
, gl
.NO_ERROR
, "fbo binding succeeded");
155 wtu
.framebufferStatusShouldBe(gl
, gl
.FRAMEBUFFER
, [ gl
.FRAMEBUFFER_INCOMPLETE_ATTACHMENT
, gl
.FRAMEBUFFER_UNSUPPORTED
],
156 `framebuffer should not be complete with ${internalFormatName} texture attached`);
159 function runInternalFormatQueryTest()
162 debug("testing the internal format query");
164 var maxSamples
= gl
.getParameter(gl
.MAX_SAMPLES
);
165 const formats
= [ext
.R16_EXT
, ext
.RG16_EXT
, ext
.RGBA16_EXT
];
166 for (const format
of formats
) {
167 var samples
= gl
.getInternalformatParameter(gl
.RENDERBUFFER
, format
, gl
.SAMPLES
);
168 if (samples
== null || samples
.length
== 0 || samples
[0] < maxSamples
) {
169 testFailed("the maximum value in SAMPLES should be at least " + maxSamples
);
173 testPassed("Internal format query succeeded");
176 function runTestExtension() {
177 textures
= [gl
.createTexture(), gl
.createTexture()];
178 fbos
= [gl
.createFramebuffer(), gl
.createFramebuffer()];
179 renderbuffer
= gl
.createRenderbuffer();
181 for (let i
= 0; i
< 2; i
++) {
182 gl
.bindTexture(gl
.TEXTURE_2D
, textures
[i
]);
183 gl
.texParameteri(gl
.TEXTURE_2D
, gl
.TEXTURE_MAG_FILTER
, gl
.NEAREST
);
184 gl
.texParameteri(gl
.TEXTURE_2D
, gl
.TEXTURE_MIN_FILTER
, gl
.NEAREST
);
187 gl
.bindTexture(gl
.TEXTURE_2D
, null);
189 wtu
.glErrorShouldBe(gl
, gl
.NO_ERROR
, "texture and framebuffer setup succeed");
191 let program300
= wtu
.setupSimpleTextureProgramESSL300(gl
);
192 let program100
= wtu
.setupTexturedQuad(gl
, 0, 1, wtu
.simpleHighPrecisionTextureFragmentShader
);
195 debug("Texture creation");
196 testNorm16Texture("R16_EXT", "RED", "UNSIGNED_SHORT");
197 testNorm16Texture("RG16_EXT", "RG", "UNSIGNED_SHORT");
198 testNorm16Texture("RGB16_EXT", "RGB", "UNSIGNED_SHORT");
199 testNorm16Texture("RGBA16_EXT", "RGBA", "UNSIGNED_SHORT");
200 testNorm16Texture("R16_SNORM_EXT", "RED", "SHORT");
201 testNorm16Texture("RG16_SNORM_EXT", "RG", "SHORT");
202 testNorm16Texture("RGB16_SNORM_EXT", "RGB", "SHORT");
203 testNorm16Texture("RGBA16_SNORM_EXT", "RGBA", "SHORT");
205 testNorm16Texture("RGBA", "RGBA", "UNSIGNED_SHORT", "INVALID_OPERATION");
206 testNorm16Texture("RGBA", "RGBA", "SHORT", "INVALID_OPERATION");
209 debug("Texture renderability");
211 testNorm16Render(ext
.R16_EXT
, gl
.RED
, gl
.UNSIGNED_SHORT
, 8);
212 testNorm16Render(ext
.RG16_EXT
, gl
.RG
, gl
.UNSIGNED_SHORT
, 8);
213 testNorm16Render(ext
.RGBA16_EXT
, gl
.RGBA
, gl
.UNSIGNED_SHORT
, 8);
215 gl
.useProgram(program300
);
217 testNorm16Render(ext
.R16_EXT
, gl
.RED
, gl
.UNSIGNED_SHORT
, 0);
218 testNorm16Render(ext
.RG16_EXT
, gl
.RG
, gl
.UNSIGNED_SHORT
, 0);
219 testExtFormatUnrenderable("RGB16_EXT", gl
.RGB
, gl
.UNSIGNED_SHORT
);
220 testNorm16Render(ext
.RGBA16_EXT
, gl
.RGBA
, gl
.UNSIGNED_SHORT
, 0);
222 testExtFormatUnrenderable("R16_SNORM_EXT", gl
.RED
, gl
.SHORT
);
223 testExtFormatUnrenderable("RG16_SNORM_EXT", gl
.RG
, gl
.SHORT
);
224 testExtFormatUnrenderable("RGB16_SNORM_EXT", gl
.RGB
, gl
.SHORT
);
225 testExtFormatUnrenderable("RGBA16_SNORM_EXT", gl
.RGBA
, gl
.SHORT
);
230 testFailed("context does not exist");
232 testPassed("context exists");
234 ext
= gl
.getExtension("EXT_texture_norm16");
236 wtu
.runExtensionSupportedTest(gl
, "EXT_texture_norm16", ext
!== null);
239 runInternalFormatQueryTest();
242 testPassed("No EXT_texture_norm16 support -- this is legal");
249 var successfullyParsed
= true;
251 <script src=
"../../js/js-test-post.js"></script>