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.
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>
17 <canvas id=
"example" width=
"4" height=
"4"></canvas>
18 <div id=
"description"></div>
19 <div id=
"console"></div>
23 function checkFormatAndType()
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
));
41 debug("check combinations of format and type");
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
;
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
));
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
)
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
);
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
);
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");
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();
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
);
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);
138 testFailed("context does not exist");
140 testPassed("context exists");
143 description('ReadPixels into PIXEL_PACK buffer');
144 validatePixelPackBufferAndParameters(4, 4);
148 var successfullyParsed
= true;
150 <script src=
"../../js/js-test-post.js"></script>