mmaxfield@apple.com | 9e39803 | 2016-11-15 02:42:32 +0000 | [diff] [blame] | 1 | <!DOCTYPE html> |
| 2 | <html> |
| 3 | <head> |
| 4 | <script src="../../../resources/js-test-pre.js"></script> |
| 5 | </head> |
| 6 | <body> |
| 7 | <canvas id="canvas" width="40" height="40"></canvas> |
| 8 | <script> |
| 9 | description("Test that glTexImage2D and glTexSubImage2D accept new WebGL 2 enum values"); |
| 10 | |
| 11 | if (window.internals) |
joepeck@webkit.org | 8065860 | 2017-01-21 02:23:47 +0000 | [diff] [blame] | 12 | internals.settings.setWebGL2Enabled(true); |
mmaxfield@apple.com | 9e39803 | 2016-11-15 02:42:32 +0000 | [diff] [blame] | 13 | |
| 14 | var canvas = document.getElementById("canvas"); |
| 15 | var width = canvas.width; |
| 16 | var height = canvas.height; |
| 17 | var gl = canvas.getContext("webgl2"); |
| 18 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 19 | |
| 20 | var texture = gl.createTexture(); |
| 21 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 22 | gl.bindTexture(gl.TEXTURE_2D, texture); |
| 23 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 24 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); |
| 25 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 26 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); |
| 27 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 28 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); |
| 29 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 30 | gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); |
| 31 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 32 | |
| 33 | var arrayBuffer = new Uint8Array(width * height * 1); |
| 34 | var count = 0; |
| 35 | for (var i = 0; i < height; ++i) { |
| 36 | for (var j = 0; j < width; ++j) { |
| 37 | arrayBuffer[(width * i + j) * 1 + 0] = count++; |
| 38 | } |
| 39 | } |
| 40 | gl.texImage2D(gl.TEXTURE_2D, 0, gl.R8, width, height, 0, gl.RED, gl.UNSIGNED_BYTE, arrayBuffer); |
| 41 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 42 | |
| 43 | var framebuffer = gl.createFramebuffer(); |
| 44 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 45 | gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer); |
| 46 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 47 | gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0); |
| 48 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 49 | shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE"); |
| 50 | |
| 51 | |
| 52 | var count; |
| 53 | var offset = 0; |
| 54 | var index; |
| 55 | var expected; |
| 56 | function test(uploadArrayFunction, downloadArrayFunction, components, internalFormat, format, uploadType, downloadType) { |
| 57 | var width = 4; |
| 58 | var height = 4; |
| 59 | arrayBuffer = new uploadArrayFunction(2 * width * height * components); |
| 60 | var count = 0; |
| 61 | for (var i = 0; i < height; ++i) { |
| 62 | for (var j = 0; j < width; ++j) { |
| 63 | for (var k = 0; k < components; ++k) { |
| 64 | arrayBuffer[(width * i + j) * components + k] = offset + count++; |
| 65 | } |
| 66 | } |
| 67 | } |
| 68 | gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, width, height, 0, format, uploadType, arrayBuffer); |
| 69 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 70 | gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, format, uploadType, arrayBuffer); |
| 71 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 72 | receiver = new downloadArrayFunction(2 * width * height * components); |
| 73 | gl.readPixels(0, 0, width, height, format, downloadType, receiver); |
| 74 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 75 | count = 0; |
| 76 | for (var i = 0; i < height; ++i) { |
| 77 | for (var j = 0; j < width; ++j) { |
| 78 | for (var k = 0; k < components; ++k) { |
| 79 | expected = offset + count++; |
| 80 | index = (width * i + j) * components + k; |
| 81 | shouldBe("receiver[index]", "expected"); |
| 82 | } |
| 83 | } |
| 84 | } |
| 85 | |
| 86 | if (offset == 0) |
| 87 | offset = 50; |
| 88 | else |
| 89 | offset = 0; |
| 90 | } |
| 91 | |
| 92 | // FIXME: Read from the textures in shaders |
| 93 | |
| 94 | test(Uint8Array, Uint8Array, 3, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE); |
| 95 | test(Uint8Array, Uint8Array, 4, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE); |
| 96 | //test(Uint8Array, Uint8Array, 2, gl.LUMINANCE_ALPHA, gl.LUMINANCE_ALPHA, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE); |
| 97 | //test(Uint8Array, Uint8Array, 1, gl.LUMINANCE, gl.LUMINANCE, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE); |
| 98 | //test(Uint8Array, Uint8Array, 1, gl.ALPHA, gl.ALPHA, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE); |
| 99 | |
| 100 | test(Uint8Array, Uint8Array, 1, gl.R8, gl.RED, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE); |
| 101 | test(Int8Array, Int8Array, 1, gl.R8_SNORM, gl.RED, gl.BYTE, gl.BYTE); |
| 102 | test(Float32Array, Float32Array, 1, gl.R16F, gl.RED, gl.FLOAT, gl.FLOAT); |
| 103 | test(Float32Array, Float32Array, 1, gl.R32F, gl.RED, gl.FLOAT, gl.FLOAT); |
| 104 | test(Uint8Array, Uint32Array, 1, gl.R8UI, gl.RED_INTEGER, gl.UNSIGNED_BYTE, gl.UNSIGNED_INT); |
| 105 | test(Int8Array, Int32Array, 1, gl.R8I, gl.RED_INTEGER, gl.BYTE, gl.INT); |
| 106 | test(Uint16Array, Uint32Array, 1, gl.R16UI, gl.RED_INTEGER, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT); |
| 107 | test(Int16Array, Int32Array, 1, gl.R16I, gl.RED_INTEGER, gl.SHORT, gl.INT); |
| 108 | test(Uint32Array, Uint32Array, 1, gl.R32UI, gl.RED_INTEGER, gl.UNSIGNED_INT, gl.UNSIGNED_INT); |
| 109 | test(Int32Array, Int32Array, 1, gl.R32I, gl.RED_INTEGER, gl.INT, gl.INT); |
| 110 | |
| 111 | test(Uint8Array, Uint8Array, 2, gl.RG8, gl.RG, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE); |
| 112 | test(Int8Array, Int8Array, 2, gl.RG8_SNORM, gl.RG, gl.BYTE, gl.BYTE); |
| 113 | test(Float32Array, Float32Array, 2, gl.RG16F, gl.RG, gl.FLOAT, gl.FLOAT); |
| 114 | test(Float32Array, Float32Array, 2, gl.RG32F, gl.RG, gl.FLOAT, gl.FLOAT); |
| 115 | test(Uint8Array, Uint32Array, 2, gl.RG8UI, gl.RG_INTEGER, gl.UNSIGNED_BYTE, gl.UNSIGNED_INT); |
| 116 | test(Int8Array, Int32Array, 2, gl.RG8I, gl.RG_INTEGER, gl.BYTE, gl.INT); |
| 117 | test(Uint16Array, Uint32Array, 2, gl.RG16UI, gl.RG_INTEGER, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT); |
| 118 | test(Int16Array, Int32Array, 2, gl.RG16I, gl.RG_INTEGER, gl.SHORT, gl.INT); |
| 119 | test(Uint32Array, Uint32Array, 2, gl.RG32UI, gl.RG_INTEGER, gl.UNSIGNED_INT, gl.UNSIGNED_INT); |
| 120 | test(Int32Array, Int32Array, 2, gl.RG32I, gl.RG_INTEGER, gl.INT, gl.INT); |
| 121 | |
| 122 | test(Uint8Array, Uint8Array, 3, gl.RGB8, gl.RGB, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE); |
| 123 | test(Uint8Array, Uint8Array, 3, gl.SRGB8, gl.RGB, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE); |
| 124 | test(Int8Array, Int8Array, 3, gl.RGB8_SNORM, gl.RGB, gl.BYTE, gl.BYTE); |
| 125 | test(Float32Array, Float32Array, 3, gl.RGB16F, gl.RGB, gl.FLOAT, gl.FLOAT); |
| 126 | test(Float32Array, Float32Array, 3, gl.RGB32F, gl.RGB, gl.FLOAT, gl.FLOAT); |
| 127 | test(Uint8Array, Uint32Array, 3, gl.RGB8UI, gl.RGB_INTEGER, gl.UNSIGNED_BYTE, gl.UNSIGNED_INT); |
| 128 | test(Int8Array, Int32Array, 3, gl.RGB8I, gl.RGB_INTEGER, gl.BYTE, gl.INT); |
| 129 | test(Uint16Array, Uint32Array, 3, gl.RGB16UI, gl.RGB_INTEGER, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT); |
| 130 | test(Int16Array, Int32Array, 3, gl.RGB16I, gl.RGB_INTEGER, gl.SHORT, gl.INT); |
| 131 | test(Uint32Array, Uint32Array, 3, gl.RGB32UI, gl.RGB_INTEGER, gl.UNSIGNED_INT, gl.UNSIGNED_INT); |
| 132 | test(Int32Array, Int32Array, 3, gl.RGB32I, gl.RGB_INTEGER, gl.INT, gl.INT); |
| 133 | |
| 134 | test(Uint8Array, Uint8Array, 4, gl.RGBA8, gl.RGBA, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE); |
| 135 | test(Uint8Array, Uint8Array, 3, gl.SRGB8_ALPHA8, gl.RGBA, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE); |
| 136 | test(Int8Array, Int8Array, 4, gl.RGBA8_SNORM, gl.RGBA, gl.BYTE, gl.BYTE); |
| 137 | test(Float32Array, Float32Array, 4, gl.RGBA16F, gl.RGBA, gl.FLOAT, gl.FLOAT); |
| 138 | test(Float32Array, Float32Array, 4, gl.RGBA32F, gl.RGBA, gl.FLOAT, gl.FLOAT); |
| 139 | test(Uint8Array, Uint32Array, 4, gl.RGBA8UI, gl.RGBA_INTEGER, gl.UNSIGNED_BYTE, gl.UNSIGNED_INT); |
| 140 | test(Int8Array, Int32Array, 4, gl.RGBA8I, gl.RGBA_INTEGER, gl.BYTE, gl.INT); |
| 141 | test(Uint16Array, Uint32Array, 4, gl.RGBA16UI, gl.RGBA_INTEGER, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT); |
| 142 | test(Int16Array, Int32Array, 4, gl.RGBA16I, gl.RGBA_INTEGER, gl.SHORT, gl.INT); |
| 143 | test(Uint32Array, Uint32Array, 4, gl.RGBA32UI, gl.RGBA_INTEGER, gl.UNSIGNED_INT, gl.UNSIGNED_INT); |
| 144 | test(Int32Array, Int32Array, 4, gl.RGBA32I, gl.RGBA_INTEGER, gl.INT, gl.INT); |
| 145 | |
| 146 | var i; |
| 147 | function test565() { |
| 148 | var width = 4; |
| 149 | var height = 4; |
| 150 | arrayBuffer = new Uint16Array(width * height); |
| 151 | for (var i = 0; i < height; ++i) { |
| 152 | for (var j = 0; j < width; ++j) { |
| 153 | arrayBuffer[width * i + j] = (i << 11) | ((i + j) << 5) | j; |
| 154 | } |
| 155 | } |
| 156 | gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB565, width, height, 0, gl.RGB, gl.UNSIGNED_SHORT_5_6_5, arrayBuffer); |
| 157 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 158 | receiver = new Uint16Array(width * height); |
| 159 | gl.readPixels(0, 0, width, height, gl.RGB, gl.UNSIGNED_SHORT_5_6_5, receiver); |
| 160 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 161 | |
| 162 | for (i = 0; i < width * height; ++i) { |
| 163 | shouldBe("arrayBuffer[i]", "receiver[i]"); |
| 164 | } |
| 165 | } |
| 166 | |
| 167 | function test5551() { |
| 168 | var width = 4; |
| 169 | var height = 4; |
| 170 | arrayBuffer = new Uint16Array(width * height); |
| 171 | for (var i = 0; i < height; ++i) { |
| 172 | for (var j = 0; j < width; ++j) { |
| 173 | arrayBuffer[width * i + j] = (i << 11) | ((i + j) << 6) | (j << 1); |
| 174 | } |
| 175 | } |
| 176 | gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB5_A1, width, height, 0, gl.RGBA, gl.UNSIGNED_SHORT_5_5_5_1, arrayBuffer); |
| 177 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 178 | receiver = new Uint16Array(width * height); |
| 179 | gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_SHORT_5_5_5_1, receiver); |
| 180 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 181 | |
| 182 | for (i = 0; i < width * height; ++i) { |
| 183 | shouldBe("arrayBuffer[i]", "receiver[i]"); |
| 184 | } |
| 185 | } |
| 186 | |
| 187 | function test4444() { |
| 188 | var width = 4; |
| 189 | var height = 4; |
| 190 | arrayBuffer = new Uint16Array(width * height); |
| 191 | for (var i = 0; i < height; ++i) { |
| 192 | for (var j = 0; j < width; ++j) { |
| 193 | arrayBuffer[width * i + j] = (i << 12) | ((i + j) << 8) | (j << 4); |
| 194 | } |
| 195 | } |
| 196 | gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA4, width, height, 0, gl.RGBA, gl.UNSIGNED_SHORT_4_4_4_4, arrayBuffer); |
| 197 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 198 | receiver = new Uint16Array(width * height); |
| 199 | gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_SHORT_4_4_4_4, receiver); |
| 200 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 201 | |
| 202 | for (i = 0; i < width * height; ++i) { |
| 203 | shouldBe("arrayBuffer[i]", "receiver[i]"); |
| 204 | } |
| 205 | } |
| 206 | |
| 207 | function test9995() { |
| 208 | var width = 4; |
| 209 | var height = 4; |
| 210 | arrayBuffer = new Uint32Array(width * height); |
| 211 | for (var i = 0; i < height; ++i) { |
| 212 | for (var j = 0; j < width; ++j) { |
| 213 | arrayBuffer[width * i + j] = (i << 23) | ((i + j) << 14) | (j << 5); |
| 214 | } |
| 215 | } |
| 216 | gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB9_E5, width, height, 0, gl.RGB, gl.UNSIGNED_INT_5_9_9_9_REV, arrayBuffer); |
| 217 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 218 | } |
| 219 | |
| 220 | function test1010102() { |
| 221 | var width = 4; |
| 222 | var height = 4; |
| 223 | arrayBuffer = new Uint32Array(width * height); |
| 224 | for (var i = 0; i < height; ++i) { |
| 225 | for (var j = 0; j < width; ++j) { |
| 226 | arrayBuffer[width * i + j] = (i << 22) | ((i + j) << 12) | (j << 2); |
| 227 | } |
| 228 | } |
| 229 | gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB10_A2, width, height, 0, gl.RGBA, gl.UNSIGNED_INT_2_10_10_10_REV, arrayBuffer); |
| 230 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 231 | receiver = new Uint32Array(width * height); |
| 232 | gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_INT_2_10_10_10_REV, receiver); |
| 233 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 234 | |
| 235 | for (i = 0; i < width * height; ++i) { |
| 236 | shouldBe("arrayBuffer[i]", "receiver[i]"); |
| 237 | } |
| 238 | } |
| 239 | |
| 240 | function test111110() { |
| 241 | var width = 4; |
| 242 | var height = 4; |
| 243 | arrayBuffer = new Uint32Array(width * height); |
| 244 | for (var i = 0; i < height; ++i) { |
| 245 | for (var j = 0; j < width; ++j) { |
| 246 | arrayBuffer[width * i + j] = (i << 21) | ((i + j) << 10) | j; |
| 247 | } |
| 248 | } |
| 249 | gl.texImage2D(gl.TEXTURE_2D, 0, gl.R11F_G11F_B10F, width, height, 0, gl.RGB, gl.UNSIGNED_INT_10F_11F_11F_REV, arrayBuffer); |
| 250 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 251 | receiver = new Uint32Array(width * height); |
| 252 | gl.readPixels(0, 0, width, height, gl.RGB, gl.UNSIGNED_INT_10F_11F_11F_REV, receiver); |
| 253 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 254 | |
| 255 | for (i = 0; i < width * height; ++i) { |
| 256 | shouldBe("arrayBuffer[i]", "receiver[i]"); |
| 257 | } |
| 258 | } |
| 259 | |
| 260 | function test1010102UI() { |
| 261 | var width = 4; |
| 262 | var height = 4; |
| 263 | arrayBuffer = new Uint32Array(width * height); |
| 264 | for (var i = 0; i < height; ++i) { |
| 265 | for (var j = 0; j < width; ++j) { |
| 266 | arrayBuffer[width * i + j] = (i << 22) | ((i + j) << 12) | (j << 2); |
| 267 | } |
| 268 | } |
| 269 | gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB10_A2UI, width, height, 0, gl.RGBA_INTEGER, gl.UNSIGNED_INT_2_10_10_10_REV, arrayBuffer); |
| 270 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 271 | receiver = new Uint32Array(width * height); |
| 272 | gl.readPixels(0, 0, width, height, gl.RGBA_INTEGER, gl.UNSIGNED_INT_2_10_10_10_REV, receiver); |
| 273 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 274 | |
| 275 | for (i = 0; i < width * height; ++i) { |
| 276 | shouldBe("arrayBuffer[i]", "receiver[i]"); |
| 277 | } |
| 278 | } |
| 279 | |
| 280 | test565(); |
| 281 | test5551(); |
| 282 | test4444(); |
| 283 | test9995(); |
| 284 | test1010102(); |
| 285 | test111110(); |
| 286 | test1010102UI() |
| 287 | |
| 288 | gl.deleteFramebuffer(framebuffer); |
| 289 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 290 | |
| 291 | gl.deleteTexture(texture); |
| 292 | shouldBe("gl.getError()", "gl.NO_ERROR"); |
| 293 | </script> |
| 294 | <script src="../../../resources/js-test-post.js"></script> |
| 295 | </body> |
| 296 | </html> |