summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-conf/checkout/js/tests/compressed-texture-utils.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--dom/canvas/test/webgl-conf/checkout/js/tests/compressed-texture-utils.js258
1 files changed, 258 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-conf/checkout/js/tests/compressed-texture-utils.js b/dom/canvas/test/webgl-conf/checkout/js/tests/compressed-texture-utils.js
new file mode 100644
index 0000000000..46d155f5f1
--- /dev/null
+++ b/dom/canvas/test/webgl-conf/checkout/js/tests/compressed-texture-utils.js
@@ -0,0 +1,258 @@
+/*
+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.
+*/
+
+"use strict";
+
+let CompressedTextureUtils = (function() {
+
+let formatToString = function(ext, format) {
+ for (let p in ext) {
+ if (ext[p] == format) {
+ return p;
+ }
+ }
+ return "0x" + format.toString(16);
+};
+
+/**
+ * Make an image element from Uint8Array bitmap data.
+ * @param {number} imageHeight Height of the data in pixels.
+ * @param {number} imageWidth Width of the data in pixels.
+ * @param {number} dataWidth Width of each row in the data buffer, in pixels.
+ * @param {Uint8Array} data Image data buffer to display. Each pixel takes up 4 bytes in the array regardless of the alpha parameter.
+ * @param {boolean} alpha True if alpha data should be taken from data. Otherwise alpha channel is set to 255.
+ * @return {HTMLImageElement} The image element.
+ */
+let makeScaledImage = function(imageWidth, imageHeight, dataWidth, data, alpha, opt_scale) {
+ let scale = opt_scale ? opt_scale : 8;
+ let c = document.createElement("canvas");
+ c.width = imageWidth * scale;
+ c.height = imageHeight * scale;
+ let ctx = c.getContext("2d");
+ for (let yy = 0; yy < imageHeight; ++yy) {
+ for (let xx = 0; xx < imageWidth; ++xx) {
+ let offset = (yy * dataWidth + xx) * 4;
+ ctx.fillStyle = "rgba(" +
+ data[offset + 0] + "," +
+ data[offset + 1] + "," +
+ data[offset + 2] + "," +
+ (alpha ? data[offset + 3] / 255 : 1) + ")";
+ ctx.fillRect(xx * scale, yy * scale, scale, scale);
+ }
+ }
+ return wtu.makeImageFromCanvas(c);
+};
+
+let insertCaptionedImg = function(parent, caption, img) {
+ let div = document.createElement("div");
+ div.appendChild(img);
+ let label = document.createElement("div");
+ label.appendChild(document.createTextNode(caption));
+ div.appendChild(label);
+ parent.appendChild(div);
+};
+
+/**
+ * @param {WebGLRenderingContextBase} gl
+ * @param {Object} compressedFormats Mapping from format names to format enum values.
+ * @param expectedByteLength A function that takes in width, height and format and returns the expected buffer size in bytes.
+ */
+let testCompressedFormatsUnavailableWhenExtensionDisabled = function(gl, compressedFormats, expectedByteLength, testSize) {
+ let tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+ for (let name in compressedFormats) {
+ if (compressedFormats.hasOwnProperty(name)) {
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, compressedFormats[name], testSize, testSize, 0, new Uint8Array(expectedByteLength(testSize, testSize, compressedFormats[name])));
+ wtu.glErrorShouldBe(gl, gl.INVALID_ENUM, "Trying to use format " + name + " with extension disabled.");
+ }
+ }
+ gl.bindTexture(gl.TEXTURE_2D, null);
+ gl.deleteTexture(tex);
+};
+
+/**
+ * @param {WebGLRenderingContextBase} gl
+ * @param {Object} expectedFormats Mapping from format names to format enum values.
+ */
+let testCompressedFormatsListed = function(gl, expectedFormats) {
+ debug("");
+ debug("Testing that every format is listed by the compressed texture formats query");
+
+ let supportedFormats = gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS);
+
+ let failed;
+ let count = 0;
+ for (let name in expectedFormats) {
+ if (expectedFormats.hasOwnProperty(name)) {
+ ++count;
+ let format = expectedFormats[name];
+ failed = true;
+ for (let ii = 0; ii < supportedFormats.length; ++ii) {
+ if (format == supportedFormats[ii]) {
+ testPassed("supported format " + name + " exists");
+ failed = false;
+ break;
+ }
+ }
+ if (failed) {
+ testFailed("supported format " + name + " does not exist");
+ }
+ }
+ }
+ if (supportedFormats.length != count) {
+ testFailed("Incorrect number of supported formats, was " + supportedFormats.length + " should be " + count);
+ }
+};
+
+/**
+ * @param {Object} ext Compressed texture extension object.
+ * @param {Object} expectedFormats Mapping from format names to format enum values.
+ */
+let testCorrectEnumValuesInExt = function(ext, expectedFormats) {
+ debug("");
+ debug("Testing that format enum values in the extension object are correct");
+
+ for (name in expectedFormats) {
+ if (expectedFormats.hasOwnProperty(name)) {
+ if (isResultCorrect(ext[name], expectedFormats[name])) {
+ testPassed("Enum value for " + name + " matches 0x" + ext[name].toString(16));
+ } else {
+ testFailed("Enum value for " + name + " mismatch: 0x" + ext[name].toString(16) + " should be 0x" + expectedFormats[name].toString(16));
+ }
+ }
+ }
+};
+
+/**
+ * @param {WebGLRenderingContextBase} gl
+ * @param {Object} validFormats Mapping from format names to format enum values.
+ * @param expectedByteLength A function that takes in width, height and format and returns the expected buffer size in bytes.
+ * @param getBlockDimensions A function that takes in a format and returns block size in pixels.
+ */
+let testFormatRestrictionsOnBufferSize = function(gl, validFormats, expectedByteLength, getBlockDimensions) {
+ debug("");
+ debug("Testing format restrictions on texture upload buffer size");
+
+ let tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+ for (let formatId in validFormats) {
+ if (validFormats.hasOwnProperty(formatId)) {
+ let format = validFormats[formatId];
+ let blockSize = getBlockDimensions(format);
+ let expectedSize = expectedByteLength(blockSize.width * 4, blockSize.height * 4, format);
+ let data = new Uint8Array(expectedSize);
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, blockSize.width * 3, blockSize.height * 4, 0, data);
+ wtu.glErrorShouldBe(gl, gl.INVALID_VALUE, formatId + " data size does not match dimensions (too small width)");
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, blockSize.width * 5, blockSize.height * 4, 0, data);
+ wtu.glErrorShouldBe(gl, gl.INVALID_VALUE, formatId + " data size does not match dimensions (too large width)");
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, blockSize.width * 4, blockSize.height * 3, 0, data);
+ wtu.glErrorShouldBe(gl, gl.INVALID_VALUE, formatId + " data size does not match dimensions (too small height)");
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, blockSize.width * 4, blockSize.height * 5, 0, data);
+ wtu.glErrorShouldBe(gl, gl.INVALID_VALUE, formatId + " data size does not match dimensions (too large height)");
+ }
+ }
+};
+
+/**
+ * @param {WebGLRenderingContextBase} gl
+ * @param {Object} validFormats Mapping from format names to format enum values.
+ * @param expectedByteLength A function that takes in width, height and format and returns the expected buffer size in bytes.
+ * @param getBlockDimensions A function that takes in a format and returns block size in pixels.
+ * @param {number} width Width of the image in pixels.
+ * @param {number} height Height of the image in pixels.
+ * @param {Object} subImageConfigs configs for compressedTexSubImage calls
+ */
+let testTexSubImageDimensions = function(gl, ext, validFormats, expectedByteLength, getBlockDimensions, width, height, subImageConfigs) {
+ let tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+
+ for (let formatId in validFormats) {
+ if (validFormats.hasOwnProperty(formatId)) {
+ let format = validFormats[formatId];
+ let blockSize = getBlockDimensions(format);
+ debug("testing " + ctu.formatToString(ext, format));
+ let expectedSize = expectedByteLength(width, height, format);
+ let data = new Uint8Array(expectedSize);
+
+ gl.compressedTexImage2D(gl.TEXTURE_2D, 0, format, width, height, 0, data);
+ wtu.glErrorShouldBe(gl, gl.NO_ERROR, "setting up compressed texture");
+
+ for (let i = 0, len = subImageConfigs.length; i < len; ++i) {
+ let c = subImageConfigs[i];
+ let subData = new Uint8Array(expectedByteLength(c.width, c.height, format));
+ gl.compressedTexSubImage2D(gl.TEXTURE_2D, 0, c.xoffset, c.yoffset, c.width, c.height, format, subData);
+ wtu.glErrorShouldBe(gl, c.expectation, c.message);
+ }
+ }
+ }
+
+ gl.bindTexture(gl.TEXTURE_2D, null);
+ gl.deleteTexture(tex);
+};
+
+let testTexImageLevelDimensions = function(gl, ext, validFormats, expectedByteLength, getBlockDimensions, imageConfigs) {
+ let tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+
+ for (let formatId in validFormats) {
+ if (validFormats.hasOwnProperty(formatId)) {
+ let format = validFormats[formatId];
+ let blockSize = getBlockDimensions(format);
+ debug("testing " + ctu.formatToString(ext, format));
+
+ for (let i = 0, len = imageConfigs.length; i < len; ++i) {
+ let c = imageConfigs[i];
+ let data = new Uint8Array(expectedByteLength(c.width, c.height, format));
+ gl.compressedTexImage2D(gl.TEXTURE_2D, c.level, format, c.width, c.height, 0, data);
+ wtu.glErrorShouldBe(gl, c.expectation, c.message);
+ }
+ }
+ }
+
+ gl.bindTexture(gl.TEXTURE_2D, null);
+ gl.deleteTexture(tex);
+}
+
+let testTexStorageLevelDimensions = function(gl, ext, validFormats, expectedByteLength, getBlockDimensions, imageConfigs) {
+ for (let formatId in validFormats) {
+ let tex = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, tex);
+
+ if (validFormats.hasOwnProperty(formatId)) {
+ let format = validFormats[formatId];
+ let blockSize = getBlockDimensions(format);
+ debug("testing " + ctu.formatToString(ext, format));
+
+ for (let i = 0, len = imageConfigs.length; i < len; ++i) {
+ let c = imageConfigs[i];
+ let data = new Uint8Array(expectedByteLength(c.width, c.height, format));
+ if (i == 0) {
+ gl.texStorage2D(gl.TEXTURE_2D, imageConfigs.length, format, c.width, c.height);
+ wtu.glErrorShouldBe(gl, c.expectation, c.message);
+ }
+ gl.compressedTexSubImage2D(gl.TEXTURE_2D, i, 0, 0, c.width, c.height, format, data);
+ wtu.glErrorShouldBe(gl, c.expectation, c.message);
+ }
+ }
+ gl.bindTexture(gl.TEXTURE_2D, null);
+ gl.deleteTexture(tex);
+ }
+}
+
+return {
+ formatToString: formatToString,
+ insertCaptionedImg: insertCaptionedImg,
+ makeScaledImage: makeScaledImage,
+ testCompressedFormatsListed: testCompressedFormatsListed,
+ testCompressedFormatsUnavailableWhenExtensionDisabled: testCompressedFormatsUnavailableWhenExtensionDisabled,
+ testCorrectEnumValuesInExt: testCorrectEnumValuesInExt,
+ testFormatRestrictionsOnBufferSize: testFormatRestrictionsOnBufferSize,
+ testTexSubImageDimensions: testTexSubImageDimensions,
+ testTexImageLevelDimensions: testTexImageLevelDimensions,
+ testTexStorageLevelDimensions: testTexStorageLevelDimensions,
+};
+
+})(); \ No newline at end of file