blob: 0ed09e8af3ce4b5974a274c513f28bc32193d0fc [file] [log] [blame]
mmaxfield@apple.com9e398032016-11-15 02:42:32 +00001<!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>
9description("Test that glTexImage2D and glTexSubImage2D accept new WebGL 2 enum values");
10
11if (window.internals)
joepeck@webkit.org80658602017-01-21 02:23:47 +000012 internals.settings.setWebGL2Enabled(true);
mmaxfield@apple.com9e398032016-11-15 02:42:32 +000013
14var canvas = document.getElementById("canvas");
15var width = canvas.width;
16var height = canvas.height;
17var gl = canvas.getContext("webgl2");
18shouldBe("gl.getError()", "gl.NO_ERROR");
19
20var texture = gl.createTexture();
21shouldBe("gl.getError()", "gl.NO_ERROR");
22gl.bindTexture(gl.TEXTURE_2D, texture);
23shouldBe("gl.getError()", "gl.NO_ERROR");
24gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
25shouldBe("gl.getError()", "gl.NO_ERROR");
26gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
27shouldBe("gl.getError()", "gl.NO_ERROR");
28gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
29shouldBe("gl.getError()", "gl.NO_ERROR");
30gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
31shouldBe("gl.getError()", "gl.NO_ERROR");
32
33var arrayBuffer = new Uint8Array(width * height * 1);
34var count = 0;
35for (var i = 0; i < height; ++i) {
36 for (var j = 0; j < width; ++j) {
37 arrayBuffer[(width * i + j) * 1 + 0] = count++;
38 }
39}
40gl.texImage2D(gl.TEXTURE_2D, 0, gl.R8, width, height, 0, gl.RED, gl.UNSIGNED_BYTE, arrayBuffer);
41shouldBe("gl.getError()", "gl.NO_ERROR");
42
43var framebuffer = gl.createFramebuffer();
44shouldBe("gl.getError()", "gl.NO_ERROR");
45gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer);
46shouldBe("gl.getError()", "gl.NO_ERROR");
47gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
48shouldBe("gl.getError()", "gl.NO_ERROR");
49shouldBe("gl.checkFramebufferStatus(gl.FRAMEBUFFER)", "gl.FRAMEBUFFER_COMPLETE");
50
51
52var count;
53var offset = 0;
54var index;
55var expected;
56function 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
94test(Uint8Array, Uint8Array, 3, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
95test(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
100test(Uint8Array, Uint8Array, 1, gl.R8, gl.RED, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
101test(Int8Array, Int8Array, 1, gl.R8_SNORM, gl.RED, gl.BYTE, gl.BYTE);
102test(Float32Array, Float32Array, 1, gl.R16F, gl.RED, gl.FLOAT, gl.FLOAT);
103test(Float32Array, Float32Array, 1, gl.R32F, gl.RED, gl.FLOAT, gl.FLOAT);
104test(Uint8Array, Uint32Array, 1, gl.R8UI, gl.RED_INTEGER, gl.UNSIGNED_BYTE, gl.UNSIGNED_INT);
105test(Int8Array, Int32Array, 1, gl.R8I, gl.RED_INTEGER, gl.BYTE, gl.INT);
106test(Uint16Array, Uint32Array, 1, gl.R16UI, gl.RED_INTEGER, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT);
107test(Int16Array, Int32Array, 1, gl.R16I, gl.RED_INTEGER, gl.SHORT, gl.INT);
108test(Uint32Array, Uint32Array, 1, gl.R32UI, gl.RED_INTEGER, gl.UNSIGNED_INT, gl.UNSIGNED_INT);
109test(Int32Array, Int32Array, 1, gl.R32I, gl.RED_INTEGER, gl.INT, gl.INT);
110
111test(Uint8Array, Uint8Array, 2, gl.RG8, gl.RG, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
112test(Int8Array, Int8Array, 2, gl.RG8_SNORM, gl.RG, gl.BYTE, gl.BYTE);
113test(Float32Array, Float32Array, 2, gl.RG16F, gl.RG, gl.FLOAT, gl.FLOAT);
114test(Float32Array, Float32Array, 2, gl.RG32F, gl.RG, gl.FLOAT, gl.FLOAT);
115test(Uint8Array, Uint32Array, 2, gl.RG8UI, gl.RG_INTEGER, gl.UNSIGNED_BYTE, gl.UNSIGNED_INT);
116test(Int8Array, Int32Array, 2, gl.RG8I, gl.RG_INTEGER, gl.BYTE, gl.INT);
117test(Uint16Array, Uint32Array, 2, gl.RG16UI, gl.RG_INTEGER, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT);
118test(Int16Array, Int32Array, 2, gl.RG16I, gl.RG_INTEGER, gl.SHORT, gl.INT);
119test(Uint32Array, Uint32Array, 2, gl.RG32UI, gl.RG_INTEGER, gl.UNSIGNED_INT, gl.UNSIGNED_INT);
120test(Int32Array, Int32Array, 2, gl.RG32I, gl.RG_INTEGER, gl.INT, gl.INT);
121
122test(Uint8Array, Uint8Array, 3, gl.RGB8, gl.RGB, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
123test(Uint8Array, Uint8Array, 3, gl.SRGB8, gl.RGB, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
124test(Int8Array, Int8Array, 3, gl.RGB8_SNORM, gl.RGB, gl.BYTE, gl.BYTE);
125test(Float32Array, Float32Array, 3, gl.RGB16F, gl.RGB, gl.FLOAT, gl.FLOAT);
126test(Float32Array, Float32Array, 3, gl.RGB32F, gl.RGB, gl.FLOAT, gl.FLOAT);
127test(Uint8Array, Uint32Array, 3, gl.RGB8UI, gl.RGB_INTEGER, gl.UNSIGNED_BYTE, gl.UNSIGNED_INT);
128test(Int8Array, Int32Array, 3, gl.RGB8I, gl.RGB_INTEGER, gl.BYTE, gl.INT);
129test(Uint16Array, Uint32Array, 3, gl.RGB16UI, gl.RGB_INTEGER, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT);
130test(Int16Array, Int32Array, 3, gl.RGB16I, gl.RGB_INTEGER, gl.SHORT, gl.INT);
131test(Uint32Array, Uint32Array, 3, gl.RGB32UI, gl.RGB_INTEGER, gl.UNSIGNED_INT, gl.UNSIGNED_INT);
132test(Int32Array, Int32Array, 3, gl.RGB32I, gl.RGB_INTEGER, gl.INT, gl.INT);
133
134test(Uint8Array, Uint8Array, 4, gl.RGBA8, gl.RGBA, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
135test(Uint8Array, Uint8Array, 3, gl.SRGB8_ALPHA8, gl.RGBA, gl.UNSIGNED_BYTE, gl.UNSIGNED_BYTE);
136test(Int8Array, Int8Array, 4, gl.RGBA8_SNORM, gl.RGBA, gl.BYTE, gl.BYTE);
137test(Float32Array, Float32Array, 4, gl.RGBA16F, gl.RGBA, gl.FLOAT, gl.FLOAT);
138test(Float32Array, Float32Array, 4, gl.RGBA32F, gl.RGBA, gl.FLOAT, gl.FLOAT);
139test(Uint8Array, Uint32Array, 4, gl.RGBA8UI, gl.RGBA_INTEGER, gl.UNSIGNED_BYTE, gl.UNSIGNED_INT);
140test(Int8Array, Int32Array, 4, gl.RGBA8I, gl.RGBA_INTEGER, gl.BYTE, gl.INT);
141test(Uint16Array, Uint32Array, 4, gl.RGBA16UI, gl.RGBA_INTEGER, gl.UNSIGNED_SHORT, gl.UNSIGNED_INT);
142test(Int16Array, Int32Array, 4, gl.RGBA16I, gl.RGBA_INTEGER, gl.SHORT, gl.INT);
143test(Uint32Array, Uint32Array, 4, gl.RGBA32UI, gl.RGBA_INTEGER, gl.UNSIGNED_INT, gl.UNSIGNED_INT);
144test(Int32Array, Int32Array, 4, gl.RGBA32I, gl.RGBA_INTEGER, gl.INT, gl.INT);
145
146var i;
147function 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
167function 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
187function 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
207function 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
220function 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
240function 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
260function 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
280test565();
281test5551();
282test4444();
283test9995();
284test1010102();
285test111110();
286test1010102UI()
287
288gl.deleteFramebuffer(framebuffer);
289shouldBe("gl.getError()", "gl.NO_ERROR");
290
291gl.deleteTexture(texture);
292shouldBe("gl.getError()", "gl.NO_ERROR");
293</script>
294<script src="../../../resources/js-test-post.js"></script>
295</body>
296</html>