296 lines
12 KiB
HTML
296 lines
12 KiB
HTML
<!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> |