138 lines
6.1 KiB
JavaScript
138 lines
6.1 KiB
JavaScript
"use strict";
|
|
description("This test ensures WebGL implementations correctly implement querying for compressed textures when extensions are disabled.");
|
|
|
|
debug("");
|
|
|
|
const wtu = WebGLTestUtils;
|
|
const gl = wtu.create3DContext(null, undefined, contextVersion);
|
|
|
|
const COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 0x8C00;
|
|
const COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 0x8C02;
|
|
|
|
let formats = null;
|
|
let ext;
|
|
|
|
if (!gl) {
|
|
testFailed("context does not exist");
|
|
} else {
|
|
testPassed("context exists");
|
|
|
|
var tex = gl.createTexture();
|
|
gl.bindTexture(gl.TEXTURE_2D, tex);
|
|
wtu.shouldGenerateGLError(gl, [gl.INVALID_ENUM, gl.INVALID_OPERATION],
|
|
"gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 10, 10, COMPRESSED_RGB_PVRTC_4BPPV1_IMG, new Uint8Array(8));");
|
|
|
|
wtu.shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.compressedTexImage2D(gl.TEXTURE_2D, 0, COMPRESSED_RGB_PVRTC_4BPPV1_IMG, 8, 8, 0, new Uint8Array(8))");
|
|
wtu.shouldGenerateGLError(gl, gl.INVALID_ENUM, "gl.compressedTexImage2D(gl.TEXTURE_2D, 0, COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, 8, 8, 0, new Uint8Array(8))");
|
|
|
|
wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "formats = gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS)");
|
|
shouldBeNonNull("formats");
|
|
shouldBe("formats.length", "0");
|
|
|
|
wtu.shouldGenerateGLError(gl, gl.NO_ERROR, "gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 4, 4, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array(4*4*4));");
|
|
wtu.shouldGenerateGLError(gl, gl.INVALID_ENUM,
|
|
"gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 4, 4, COMPRESSED_RGB_PVRTC_4BPPV1_IMG, new Uint8Array(8));");
|
|
|
|
// Check too-many and too-few args.
|
|
|
|
wtu.shouldThrow(gl, false, "too many args", function() {
|
|
gl.compressedTexImage2D(gl.TEXTURE_2D, 0, COMPRESSED_RGB_PVRTC_4BPPV1_IMG, 4, 4, 0, new Uint8Array(8), null);
|
|
});
|
|
wtu.shouldThrow(gl, TypeError, "too few args", function() {
|
|
gl.compressedTexImage2D(gl.TEXTURE_2D, 0, COMPRESSED_RGB_PVRTC_4BPPV1_IMG, 4, 4, 0);
|
|
});
|
|
|
|
wtu.shouldThrow(gl, false, "too many args", function() {
|
|
gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 4, 4, COMPRESSED_RGB_PVRTC_4BPPV1_IMG, new Uint8Array(8), null);
|
|
});
|
|
wtu.shouldThrow(gl, TypeError, "too few args", function() {
|
|
gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 4, 4, COMPRESSED_RGB_PVRTC_4BPPV1_IMG);
|
|
});
|
|
|
|
// -
|
|
|
|
let pbo;
|
|
// WebGL 2.0 specific
|
|
if (gl.PIXEL_UNPACK_BUFFER) {
|
|
pbo = gl.createBuffer();
|
|
}
|
|
|
|
gl.bindTexture(gl.TEXTURE_2D, tex);
|
|
|
|
function validateExt(extName, enumName, blockSize, blockByteSize, expectedSubImageError) {
|
|
debug('\n---------------------------');
|
|
debug('\n' + extName);
|
|
ext = gl.getExtension(extName);
|
|
if (!ext) {
|
|
testPassed(`Optional ext ${extName} MAY be unsupported.`);
|
|
return;
|
|
}
|
|
testPassed(`Optional ext ${extName} is supported.`);
|
|
|
|
const data = new Uint8Array(blockByteSize);
|
|
|
|
const views = [
|
|
data,
|
|
new Uint8ClampedArray(data.buffer),
|
|
new Int8Array(data.buffer),
|
|
new Uint16Array(data.buffer),
|
|
new Int16Array(data.buffer),
|
|
new Uint32Array(data.buffer),
|
|
new Int32Array(data.buffer),
|
|
new Float32Array(data.buffer),
|
|
new DataView(data.buffer),
|
|
];
|
|
if (window.SharedArrayBuffer) {
|
|
const sharedBuffer = new SharedArrayBuffer(blockByteSize);
|
|
views.push(
|
|
new Uint8Array(sharedBuffer),
|
|
new Uint8ClampedArray(sharedBuffer),
|
|
new DataView(sharedBuffer)
|
|
);
|
|
}
|
|
|
|
for (const view of views) {
|
|
window.g_view = view;
|
|
debug(`\nfrom ${view.constructor.name} of ${view.buffer.constructor.name}`);
|
|
wtu.shouldGenerateGLError(gl, gl.NO_ERROR,
|
|
`gl.compressedTexImage2D(gl.TEXTURE_2D, 0, ext.${enumName}, ${blockSize},${blockSize}, 0, g_view)`);
|
|
|
|
wtu.shouldGenerateGLError(gl, expectedSubImageError,
|
|
`gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0,0, ${blockSize},${blockSize}, ext.${enumName}, g_view)`);
|
|
}
|
|
|
|
if (pbo) {
|
|
debug('\nfrom PBO');
|
|
gl.bindBuffer(gl.PIXEL_UNPACK_BUFFER, pbo);
|
|
wtu.shouldGenerateGLError(gl, gl.NO_ERROR,
|
|
`gl.bufferData(gl.PIXEL_UNPACK_BUFFER, ${blockByteSize}*2, gl.STATIC_DRAW)`);
|
|
|
|
wtu.shouldGenerateGLError(gl, gl.NO_ERROR,
|
|
`gl.compressedTexImage2D(gl.TEXTURE_2D, 0, ext.${enumName}, ${blockSize},${blockSize}, 0, ${blockByteSize}, 0)`);
|
|
wtu.shouldGenerateGLError(gl, gl.NO_ERROR,
|
|
`gl.compressedTexImage2D(gl.TEXTURE_2D, 0, ext.${enumName}, ${blockSize},${blockSize}, 0, ${blockByteSize}, 1)`);
|
|
wtu.shouldGenerateGLError(gl, gl.NO_ERROR,
|
|
`gl.compressedTexImage2D(gl.TEXTURE_2D, 0, ext.${enumName}, ${blockSize},${blockSize}, 0, ${blockByteSize}, ${blockByteSize})`);
|
|
wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION,
|
|
`gl.compressedTexImage2D(gl.TEXTURE_2D, 0, ext.${enumName}, ${blockSize},${blockSize}, 0, ${blockByteSize}, ${blockByteSize+1})`);
|
|
|
|
wtu.shouldGenerateGLError(gl, expectedSubImageError,
|
|
`gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0,0, ${blockSize},${blockSize}, ext.${enumName}, ${blockByteSize}, 0)`);
|
|
wtu.shouldGenerateGLError(gl, expectedSubImageError,
|
|
`gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0,0, ${blockSize},${blockSize}, ext.${enumName}, ${blockByteSize}, 1)`);
|
|
wtu.shouldGenerateGLError(gl, expectedSubImageError,
|
|
`gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0,0, ${blockSize},${blockSize}, ext.${enumName}, ${blockByteSize}, ${blockByteSize})`);
|
|
wtu.shouldGenerateGLError(gl, gl.INVALID_OPERATION,
|
|
`gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, 0,0, ${blockSize},${blockSize}, ext.${enumName}, ${blockByteSize}, ${blockByteSize+1})`);
|
|
|
|
gl.bindBuffer(gl.PIXEL_UNPACK_BUFFER, null);
|
|
}
|
|
}
|
|
|
|
validateExt('WEBGL_compressed_texture_s3tc', 'COMPRESSED_RGBA_S3TC_DXT5_EXT', 4, 16, gl.NO_ERROR);
|
|
validateExt('WEBGL_compressed_texture_etc1', 'COMPRESSED_RGB_ETC1_WEBGL', 4, 8, gl.INVALID_OPERATION);
|
|
validateExt('WEBGL_compressed_texture_etc', 'COMPRESSED_RGBA8_ETC2_EAC', 4, 16, gl.NO_ERROR);
|
|
validateExt('WEBGL_compressed_texture_astc', 'COMPRESSED_RGBA_ASTC_4x4_KHR', 4, 16, gl.NO_ERROR);
|
|
}
|
|
|
|
var successfullyParsed = true;
|