| <!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> |