blob: 41f583a0c30e6f5be1d8e5d980d3df3d7df8abaf [file] [edit]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="resources/webgl_test_files/resources/js-test-style.css"/>
<script src="resources/webgl_test_files/js/js-test-pre.js"></script>
<script src="resources/webgl_test_files/js/webgl-test-utils.js"></script>
</head>
<body>
<div id="description"></div>
<div id="console"></div>
<script>
"use strict";
description("Test that readPixels with invalid PBO offsets are properly validated and don't cause crashes.");
var wtu = WebGLTestUtils;
var gl;
var expected = [51, 102, 204, 204];
var expectedNoAlpha = [51, 102, 204, 255];
var pixels;
function runTest(contextOptions) {
var canvas = document.createElement("canvas");
var gl = wtu.create3DContext(canvas, contextOptions, 2);
gl.clearColor(0.2, 0.4, 0.8, 0.8);
gl.clear(gl.COLOR_BUFFER_BIT);
var pbo = gl.createBuffer();
gl.bindBuffer(gl.PIXEL_PACK_BUFFER, pbo);
var bufferSize = 64 * 64 * 4;
gl.bufferData(gl.PIXEL_PACK_BUFFER, bufferSize, gl.DYNAMIC_READ);
gl.bindBuffer(gl.COPY_READ_BUFFER, pbo); // For verification getBufferSubData() calls below.
gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);
gl.readPixels(0, 0, 64, 64, gl.RGBA, gl.UNSIGNED_BYTE, 0);
wtu.glErrorShouldBe(gl, gl.NO_ERROR, "offset==0");
pixels = new Uint8Array(4);
gl.getBufferSubData(gl.COPY_READ_BUFFER, 0, pixels);
if (contextOptions.alpha)
shouldBe("pixels", "expected");
else
shouldBe("pixels", "expectedNoAlpha");
gl.bufferData(gl.COPY_READ_BUFFER, bufferSize, gl.DYNAMIC_READ);
gl.readPixels(0, 0, 32, 32, gl.RGBA, gl.UNSIGNED_BYTE, 256);
wtu.glErrorShouldBe(gl, gl.NO_ERROR, "32x32, offset=256");
pixels = new Uint8Array(4);
gl.getBufferSubData(gl.COPY_READ_BUFFER, 256, pixels);
if (contextOptions.alpha)
shouldBe("pixels", "expected");
else
shouldBe("pixels", "expectedNoAlpha");
pixels = new Uint8Array(4);
gl.getBufferSubData(gl.COPY_READ_BUFFER, 0, pixels);
shouldBe("pixels", "[0, 0, 0, 0]");
gl.readPixels(0, 0, 64, 64, gl.RGBA, gl.UNSIGNED_BYTE, -1);
wtu.glErrorShouldBe(gl, gl.INVALID_VALUE, "offset=-1");
gl.readPixels(0, 0, 64, 64, gl.RGBA, gl.UNSIGNED_BYTE, 4);
wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "offset==4");
gl.readPixels(0, 0, 64, 64, gl.RGBA, gl.UNSIGNED_BYTE, bufferSize);
wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "offset==bufferSize");
gl.readPixels(0, 0, 64, 64, gl.RGBA, gl.UNSIGNED_BYTE, bufferSize - 1);
wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "offset==bufferSize - 1");
gl.readPixels(0, 0, 64, 64, gl.RGBA, gl.UNSIGNED_BYTE, 0x7FFFFFFF);
wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "offset==0x7FFFFFFF");
gl.readPixels(0, 0, 64, 64, gl.RGBA, gl.UNSIGNED_BYTE, 0x7FFFFFFD);
wtu.glErrorShouldBe(gl, gl.INVALID_OPERATION, "offset==0x7FFFFFFD");
}
for (let alpha of [true, false]) {
for (let antialias of [true, false])
runTest({alpha, antialias});
}
finishTest();
</script>
</body>
</html>