blob: 0ed09e8af3ce4b5974a274c513f28bc32193d0fc [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../../resources/js-test-pre.js"></script>
</head>
<body>
<canvas id="canvas" width="40" height="40"></canvas>
<script>
description("Test that glTexImage2D and glTexSubImage2D accept new WebGL 2 enum values");
if (window.internals)
internals.settings.setWebGL2Enabled(true);
var canvas = document.getElementById("canvas");
var width = canvas.width;
var height = canvas.height;
var gl = canvas.getContext("webgl2");
shouldBe("gl.getError()", "gl.NO_ERROR");
var texture = gl.createTexture();
shouldBe("gl.getError()", "gl.NO_ERROR");
gl.bindTexture(gl.TEXTURE_2D, texture);
shouldBe("gl.getError()", "gl.NO_ERROR");
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
shouldBe("gl.getError()", "gl.NO_ERROR");
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
shouldBe("gl.getError()", "gl.NO_ERROR");
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
shouldBe("gl.getError()", "gl.NO_ERROR");
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
shouldBe("gl.getError()", "gl.NO_ERROR");
var arrayBuffer = new Uint8Array(width * height * 1);
var count = 0;
for (var i = 0; i < height; ++i) {
for (var j = 0; j < width; ++j) {
arrayBuffer[(width * i + j) * 1 + 0] = count++;
}
}
gl.texImage2D(gl.TEXTURE_2D, 0, gl.R8, width, height, 0, gl.RED, gl.UNSIGNED_BYTE, arrayBuffer);
shouldBe("gl.getError()", "gl.NO_ERROR");
var framebuffer = gl.createFramebuffer();
shouldBe("gl.getError()", "gl.NO_ERROR");
gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
shouldBe("gl.getError()", "gl.NO_ERROR");
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
shouldBe("gl.getError()", "gl.NO_ERROR");
shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE");
var count;
var offset = 0;
var index;
var expected;
function test(uploadArrayFunction, downloadArrayFunction, components, internalFormat, format, uploadType, downloadType) {
var width = 4;
var height = 4;
arrayBuffer = new uploadArrayFunction(2 * width * height * components);
var count = 0;
for (var i = 0; i < height; ++i) {
for (var j = 0; j < width; ++j) {
for (var k = 0; k < components; ++k) {
arrayBuffer[(width * i + j) * components + k] = offset + count++;
}
}
}
gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, width, height, 0, format, uploadType, arrayBuffer);
shouldBe("gl.getError()", "gl.NO_ERROR");
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, format, uploadType, arrayBuffer);
shouldBe("gl.getError()", "gl.NO_ERROR");
receiver = new downloadArrayFunction(2 * width * height * components);
gl.readPixels(0, 0, width, height, format, downloadType, receiver);
shouldBe("gl.getError()", "gl.NO_ERROR");
count = 0;
for (var i = 0; i < height; ++i) {
for (var j = 0; j < width; ++j) {
for (var k = 0; k < components; ++k) {
expected = offset + count++;
index = (width * i + j) * components + k;
shouldBe("receiver[index]", "expected");
}
}
}
if (offset == 0)
offset = 50;
else
offset = 0;
}
// FIXME: Read from the textures in shaders
test(Uint8Array, Uint8Array, 3, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
test(Uint8Array, Uint8Array, 4, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
//test(Uint8Array, Uint8Array, 2, gl.LUMINANCE_ALPHA, gl.LUMINANCE_ALPHA, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
//test(Uint8Array, Uint8Array, 1, gl.LUMINANCE, gl.LUMINANCE, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
//test(Uint8Array, Uint8Array, 1, gl.ALPHA, gl.ALPHA, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
test(Uint8Array, Uint8Array, 1, gl.R8, gl.RED, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
test(Int8Array, Int8Array, 1, gl.R8_SNORM, gl.RED, gl.BYTE, gl.BYTE);
test(Float32Array, Float32Array, 1, gl.R16F, gl.RED, gl.FLOAT, gl.FLOAT);
test(Float32Array, Float32Array, 1, gl.R32F, gl.RED, gl.FLOAT, gl.FLOAT);
test(Uint8Array, Uint32Array, 1, gl.R8UI, gl.RED_INTEGER, gl.UNSIGNED_BYTE, gl.UNSIGNED_INT);
test(Int8Array, Int32Array, 1, gl.R8I, gl.RED_INTEGER, gl.BYTE, gl.INT);
test(Uint16Array, Uint32Array, 1, gl.R16UI, gl.RED_INTEGER, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT);
test(Int16Array, Int32Array, 1, gl.R16I, gl.RED_INTEGER, gl.SHORT, gl.INT);
test(Uint32Array, Uint32Array, 1, gl.R32UI, gl.RED_INTEGER, gl.UNSIGNED_INT, gl.UNSIGNED_INT);
test(Int32Array, Int32Array, 1, gl.R32I, gl.RED_INTEGER, gl.INT, gl.INT);
test(Uint8Array, Uint8Array, 2, gl.RG8, gl.RG, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
test(Int8Array, Int8Array, 2, gl.RG8_SNORM, gl.RG, gl.BYTE, gl.BYTE);
test(Float32Array, Float32Array, 2, gl.RG16F, gl.RG, gl.FLOAT, gl.FLOAT);
test(Float32Array, Float32Array, 2, gl.RG32F, gl.RG, gl.FLOAT, gl.FLOAT);
test(Uint8Array, Uint32Array, 2, gl.RG8UI, gl.RG_INTEGER, gl.UNSIGNED_BYTE, gl.UNSIGNED_INT);
test(Int8Array, Int32Array, 2, gl.RG8I, gl.RG_INTEGER, gl.BYTE, gl.INT);
test(Uint16Array, Uint32Array, 2, gl.RG16UI, gl.RG_INTEGER, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT);
test(Int16Array, Int32Array, 2, gl.RG16I, gl.RG_INTEGER, gl.SHORT, gl.INT);
test(Uint32Array, Uint32Array, 2, gl.RG32UI, gl.RG_INTEGER, gl.UNSIGNED_INT, gl.UNSIGNED_INT);
test(Int32Array, Int32Array, 2, gl.RG32I, gl.RG_INTEGER, gl.INT, gl.INT);
test(Uint8Array, Uint8Array, 3, gl.RGB8, gl.RGB, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
test(Uint8Array, Uint8Array, 3, gl.SRGB8, gl.RGB, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
test(Int8Array, Int8Array, 3, gl.RGB8_SNORM, gl.RGB, gl.BYTE, gl.BYTE);
test(Float32Array, Float32Array, 3, gl.RGB16F, gl.RGB, gl.FLOAT, gl.FLOAT);
test(Float32Array, Float32Array, 3, gl.RGB32F, gl.RGB, gl.FLOAT, gl.FLOAT);
test(Uint8Array, Uint32Array, 3, gl.RGB8UI, gl.RGB_INTEGER, gl.UNSIGNED_BYTE, gl.UNSIGNED_INT);
test(Int8Array, Int32Array, 3, gl.RGB8I, gl.RGB_INTEGER, gl.BYTE, gl.INT);
test(Uint16Array, Uint32Array, 3, gl.RGB16UI, gl.RGB_INTEGER, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT);
test(Int16Array, Int32Array, 3, gl.RGB16I, gl.RGB_INTEGER, gl.SHORT, gl.INT);
test(Uint32Array, Uint32Array, 3, gl.RGB32UI, gl.RGB_INTEGER, gl.UNSIGNED_INT, gl.UNSIGNED_INT);
test(Int32Array, Int32Array, 3, gl.RGB32I, gl.RGB_INTEGER, gl.INT, gl.INT);
test(Uint8Array, Uint8Array, 4, gl.RGBA8, gl.RGBA, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
test(Uint8Array, Uint8Array, 3, gl.SRGB8_ALPHA8, gl.RGBA, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
test(Int8Array, Int8Array, 4, gl.RGBA8_SNORM, gl.RGBA, gl.BYTE, gl.BYTE);
test(Float32Array, Float32Array, 4, gl.RGBA16F, gl.RGBA, gl.FLOAT, gl.FLOAT);
test(Float32Array, Float32Array, 4, gl.RGBA32F, gl.RGBA, gl.FLOAT, gl.FLOAT);
test(Uint8Array, Uint32Array, 4, gl.RGBA8UI, gl.RGBA_INTEGER, gl.UNSIGNED_BYTE, gl.UNSIGNED_INT);
test(Int8Array, Int32Array, 4, gl.RGBA8I, gl.RGBA_INTEGER, gl.BYTE, gl.INT);
test(Uint16Array, Uint32Array, 4, gl.RGBA16UI, gl.RGBA_INTEGER, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT);
test(Int16Array, Int32Array, 4, gl.RGBA16I, gl.RGBA_INTEGER, gl.SHORT, gl.INT);
test(Uint32Array, Uint32Array, 4, gl.RGBA32UI, gl.RGBA_INTEGER, gl.UNSIGNED_INT, gl.UNSIGNED_INT);
test(Int32Array, Int32Array, 4, gl.RGBA32I, gl.RGBA_INTEGER, gl.INT, gl.INT);
var i;
function test565() {
var width = 4;
var height = 4;
arrayBuffer = new Uint16Array(width * height);
for (var i = 0; i < height; ++i) {
for (var j = 0; j < width; ++j) {
arrayBuffer[width * i + j] = (i << 11) | ((i + j) << 5) | j;
}
}
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB565, width, height, 0, gl.RGB, gl.UNSIGNED_SHORT_5_6_5, arrayBuffer);
shouldBe("gl.getError()", "gl.NO_ERROR");
receiver = new Uint16Array(width * height);
gl.readPixels(0, 0, width, height, gl.RGB, gl.UNSIGNED_SHORT_5_6_5, receiver);
shouldBe("gl.getError()", "gl.NO_ERROR");
for (i = 0; i < width * height; ++i) {
shouldBe("arrayBuffer[i]", "receiver[i]");
}
}
function test5551() {
var width = 4;
var height = 4;
arrayBuffer = new Uint16Array(width * height);
for (var i = 0; i < height; ++i) {
for (var j = 0; j < width; ++j) {
arrayBuffer[width * i + j] = (i << 11) | ((i + j) << 6) | (j << 1);
}
}
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB5_A1, width, height, 0, gl.RGBA, gl.UNSIGNED_SHORT_5_5_5_1, arrayBuffer);
shouldBe("gl.getError()", "gl.NO_ERROR");
receiver = new Uint16Array(width * height);
gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_SHORT_5_5_5_1, receiver);
shouldBe("gl.getError()", "gl.NO_ERROR");
for (i = 0; i < width * height; ++i) {
shouldBe("arrayBuffer[i]", "receiver[i]");
}
}
function test4444() {
var width = 4;
var height = 4;
arrayBuffer = new Uint16Array(width * height);
for (var i = 0; i < height; ++i) {
for (var j = 0; j < width; ++j) {
arrayBuffer[width * i + j] = (i << 12) | ((i + j) << 8) | (j << 4);
}
}
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA4, width, height, 0, gl.RGBA, gl.UNSIGNED_SHORT_4_4_4_4, arrayBuffer);
shouldBe("gl.getError()", "gl.NO_ERROR");
receiver = new Uint16Array(width * height);
gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_SHORT_4_4_4_4, receiver);
shouldBe("gl.getError()", "gl.NO_ERROR");
for (i = 0; i < width * height; ++i) {
shouldBe("arrayBuffer[i]", "receiver[i]");
}
}
function test9995() {
var width = 4;
var height = 4;
arrayBuffer = new Uint32Array(width * height);
for (var i = 0; i < height; ++i) {
for (var j = 0; j < width; ++j) {
arrayBuffer[width * i + j] = (i << 23) | ((i + j) << 14) | (j << 5);
}
}
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB9_E5, width, height, 0, gl.RGB, gl.UNSIGNED_INT_5_9_9_9_REV, arrayBuffer);
shouldBe("gl.getError()", "gl.NO_ERROR");
}
function test1010102() {
var width = 4;
var height = 4;
arrayBuffer = new Uint32Array(width * height);
for (var i = 0; i < height; ++i) {
for (var j = 0; j < width; ++j) {
arrayBuffer[width * i + j] = (i << 22) | ((i + j) << 12) | (j << 2);
}
}
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB10_A2, width, height, 0, gl.RGBA, gl.UNSIGNED_INT_2_10_10_10_REV, arrayBuffer);
shouldBe("gl.getError()", "gl.NO_ERROR");
receiver = new Uint32Array(width * height);
gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_INT_2_10_10_10_REV, receiver);
shouldBe("gl.getError()", "gl.NO_ERROR");
for (i = 0; i < width * height; ++i) {
shouldBe("arrayBuffer[i]", "receiver[i]");
}
}
function test111110() {
var width = 4;
var height = 4;
arrayBuffer = new Uint32Array(width * height);
for (var i = 0; i < height; ++i) {
for (var j = 0; j < width; ++j) {
arrayBuffer[width * i + j] = (i << 21) | ((i + j) << 10) | j;
}
}
gl.texImage2D(gl.TEXTURE_2D, 0, gl.R11F_G11F_B10F, width, height, 0, gl.RGB, gl.UNSIGNED_INT_10F_11F_11F_REV, arrayBuffer);
shouldBe("gl.getError()", "gl.NO_ERROR");
receiver = new Uint32Array(width * height);
gl.readPixels(0, 0, width, height, gl.RGB, gl.UNSIGNED_INT_10F_11F_11F_REV, receiver);
shouldBe("gl.getError()", "gl.NO_ERROR");
for (i = 0; i < width * height; ++i) {
shouldBe("arrayBuffer[i]", "receiver[i]");
}
}
function test1010102UI() {
var width = 4;
var height = 4;
arrayBuffer = new Uint32Array(width * height);
for (var i = 0; i < height; ++i) {
for (var j = 0; j < width; ++j) {
arrayBuffer[width * i + j] = (i << 22) | ((i + j) << 12) | (j << 2);
}
}
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB10_A2UI, width, height, 0, gl.RGBA_INTEGER, gl.UNSIGNED_INT_2_10_10_10_REV, arrayBuffer);
shouldBe("gl.getError()", "gl.NO_ERROR");
receiver = new Uint32Array(width * height);
gl.readPixels(0, 0, width, height, gl.RGBA_INTEGER, gl.UNSIGNED_INT_2_10_10_10_REV, receiver);
shouldBe("gl.getError()", "gl.NO_ERROR");
for (i = 0; i < width * height; ++i) {
shouldBe("arrayBuffer[i]", "receiver[i]");
}
}
test565();
test5551();
test4444();
test9995();
test1010102();
test111110();
test1010102UI()
gl.deleteFramebuffer(framebuffer);
shouldBe("gl.getError()", "gl.NO_ERROR");
gl.deleteTexture(texture);
shouldBe("gl.getError()", "gl.NO_ERROR");
</script>
<script src="../../../resources/js-test-post.js"></script>
</body>
</html>