Backed out changeset 7272b7396c78 (bug 1932758) for causing fenix debug failures...
[gecko.git] / dom / canvas / test / webgl-conf / checkout / conformance2 / reading / read-pixels-into-pixel-pack-buffer.html
blob7d646a6ecdf20549657bdf96fd98f1558e6fbab4
1 <!--
2 Copyright (c) 2019 The Khronos Group Inc.
3 Use of this source code is governed by an MIT-style license that can be
4 found in the LICENSE.txt file.
5 -->
7 <!DOCTYPE html>
8 <html>
9 <head>
10 <meta charset="utf-8">
11 <title>WebGL 2 Conformance Test: ReadPixels Into Pixel Pack Buffer.</title>
12 <link rel="stylesheet" href="../../resources/js-test-style.css"/>
13 <script src="../../js/js-test-pre.js"></script>
14 <script src="../../js/webgl-test-utils.js"></script>
15 </head>
16 <body>
17 <canvas id="example" width="4" height="4"></canvas>
18 <div id="description"></div>
19 <div id="console"></div>
20 <script>
21 "use strict";
23 function checkFormatAndType()
25 debug("");
26 debug("check format / type");
27 var invalidFormat = [gl.DEPTH_COMPONENT, gl.DEPTH_STENCIL, gl.R8, gl.RGBA4, gl.LUMINANCE, gl.LUMINANCE_ALPHA];
28 var invalidType = [gl.UNSIGNED_INT_24_8];
29 for (var ff = 0; ff < invalidFormat.length; ++ff) {
30 var format = invalidFormat[ff];
31 gl.readPixels(0, 0, 1, 1, format, gl.UNSIGNED_BYTE, 0);
32 wtu.glErrorShouldBe(gl, gl.INVALID_ENUM, "Format should not be able to read as " + wtu.glEnumToString(gl, format));
34 for (var tt = 0; tt < invalidType.length; ++tt) {
35 var type = invalidType[tt];
36 gl.readPixels(0, 0, 1, 1, gl.RGBA, type, 0);
37 wtu.glErrorShouldBe(gl, gl.INVALID_ENUM, "Type should not be able to read as " + wtu.glEnumToString(gl, type));
40 debug("");
41 debug("check combinations of format and type");
42 var combinations = [
43 {format: gl.RGBA, type: gl.UNSIGNED_BYTE},
44 {format: gl.RGB, type: gl.UNSIGNED_BYTE},
45 {format: gl.RGB, type: gl.UNSIGNED_SHORT_5_6_5},
46 {format: gl.RGBA, type: gl.UNSIGNED_SHORT_5_5_5_1},
47 {format: gl.RGBA, type: gl.UNSIGNED_SHORT_4_4_4_4},
48 {format: gl.ALPHA, type: gl.UNSIGNED_BYTE},
49 {format: gl.RED, type: gl.UNSIGNED_BYTE},
50 {format: gl.RGBA_INTEGER, type: gl.UNSIGNED_INT},
51 {format: gl.RGBA_INTEGER, type: gl.INT}
54 var implFormat = gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_FORMAT);
55 var implType = gl.getParameter(gl.IMPLEMENTATION_COLOR_READ_TYPE);
56 for (var tt = 0; tt < combinations.length; ++ tt) {
57 var info = combinations[tt];
58 var format = info.format;
59 var type = info.type;
60 gl.readPixels(0, 0, 1, 1, format, type, 0);
61 // Only two format/type parameter pairs are accepted. GL_RGBA/GL_UNSIGNED_BYTE is always
62 // accepted on default readbuffer. The other acceptable pair can be discovered by querying
63 // GL_IMPLEMENTATION_COLOR_READ_FORMAT and GL_IMPLEMENTATION_COLOR_READ_TYPE.
64 if ((format == gl.RGBA && type == gl.UNSIGNED_BYTE) || (format == implFormat && type == implType)) {
65 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "The combination of format/type should be able to read as " +
66 wtu.glEnumToString(gl, format) + " / " + wtu.glEnumToString(gl, type));
67 } else {
68 wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "The combination of format/type should not be able to read as " +
69 wtu.glEnumToString(gl, format) + " / " + wtu.glEnumToString(gl, type));
74 function validatePixelPackBufferAndParameters(canvasWidth, canvasHeight)
76 debug("");
77 debug("Validate PIXEL_PACK buffer and readPixels' parameters");
78 gl.clearColor(0, 0, 0, 1);
79 gl.clear(gl.COLOR_BUFFER_BIT);
80 gl.pixelStorei(gl.PACK_ALIGNMENT, 1);
82 var size = canvasWidth * canvasHeight * 4;
83 var buffer = gl.createBuffer();
84 gl.bindBuffer(gl.PIXEL_PACK_BUFFER, buffer);
85 gl.bufferData(gl.PIXEL_PACK_BUFFER, size, gl.STATIC_DRAW);
86 var array = new Uint8Array(size);
88 debug("");
89 debug("PIXEL_PACK buffer is bound");
90 gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, array);
91 wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "should generate INVALID_OPERATION if pixel pack buffer is bound");
92 gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 0);
93 wtu.glErrorShouldBe(gl, gl.NO_ERROR);
95 debug("");
96 debug("Validate the offset of PIXEL_PACK buffer and buffer size");
97 gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, -1);
98 wtu.glErrorShouldBe(gl, gl.INVALID_VALUE, "offset < 0");
99 gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, size);
100 wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "offset > buffer size");
101 gl.readPixels(0, 0, canvasWidth + 1, canvasHeight, gl.RGBA, gl.UNSIGNED_BYTE, 0);
102 wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "pixel pack buffer is not large enough");
104 debug("");
105 debug("Validate the reading area of framebuffer");
106 gl.readPixels(-1, -2, canvasWidth, canvasHeight, gl.RGBA, gl.UNSIGNED_BYTE, 0);
107 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "reading pixels outside of the framebuffer should succeed.");
108 gl.readPixels(2, 1, canvasWidth, canvasHeight, gl.RGBA, gl.UNSIGNED_BYTE, 0);
109 wtu.glErrorShouldBe(gl, gl.NO_ERROR, "reading pixels outside of the framebuffer should succeed.");
110 gl.readPixels(2, 1, -1, -1, gl.RGBA, gl.UNSIGNED_BYTE, 0);
111 wtu.glErrorShouldBe(gl, gl.INVALID_VALUE,
112 "reading pixels with negative width / height should generate INVALID_VALUE.");
114 checkFormatAndType();
116 debug("");
117 debug("no PIXEL_PACK buffer bound");
118 gl.bindBuffer(gl.PIXEL_PACK_BUFFER, null);
119 gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, array);
120 wtu.glErrorShouldBe(gl, gl.NO_ERROR);
121 gl.readPixels(0, 0, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, 0);
122 wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "no pixel pack buffer bound");
124 gl.deleteBuffer(buffer);
127 debug("");
128 debug("Canvas.getContext");
130 var wtu = WebGLTestUtils;
131 var pixel = [0, 0, 0, 0];
132 var expectedColor = [255, 102, 0, 255];
134 var canvas = document.getElementById("example");
135 var gl = wtu.create3DContext(canvas, undefined, 2);
137 if (!gl) {
138 testFailed("context does not exist");
139 } else {
140 testPassed("context exists");
142 debug("");
143 description('ReadPixels into PIXEL_PACK buffer');
144 validatePixelPackBufferAndParameters(4, 4);
147 debug("");
148 var successfullyParsed = true;
149 </script>
150 <script src="../../js/js-test-post.js"></script>
151 </body>
152 </html>