<html>
<head>
<script src="../../../resources/js-test.js"></script>
<script src="resources/webgl-test.js"></script>
<script>
function runTest(gl, width, height)
{

    debug('Test whether the WebGL internal buffers have been initialized to 0.');
    var totalBytes = width * height * 4;
    var buf = new Uint8Array(totalBytes);
    gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, buf);
    if (gl.getError() != gl.NO_ERROR) {
        testFailed('GL error detected after readPixels().');
        return false;
    }
    for (var i = 0; i < totalBytes; ++i) {
        if (buf[i] != 0) {
            testFailed('WebGL internal buffers are dirty.');
            return false;
        }
    }
    testPassed('Buffers have been initialized to 0.');

    debug('Test whether user created buffers have been initialized to 0.');
    var fbo = gl.createFramebuffer();
    gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    var colorbuffer = gl.createRenderbuffer();
    gl.bindRenderbuffer(gl.RENDERBUFFER, colorbuffer);
    gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, width, height);
    if (gl.getError() != gl.NO_ERROR) {
        testFailed('GL error detected after renderbufferStorage(internalformat = RGBA4).');
        return false;
    }
    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorbuffer);
    if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE) {
        testFailed('Framebuffer incomplete.');
        return false;
    }
    gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, buf);
    if (gl.getError() != gl.NO_ERROR) {
        testFailed('GL error detected after readPixels().');
        return false;
    }
    for (var i = 0; i < totalBytes; ++i) {
        if (buf[i] != 0) {
            testFailed('User created buffers are dirty.');
            return false;
        }
    }

    testPassed('Buffers have been initialized to 0.');
    return true;
}
</script>
</head>
<body>
<canvas id="testbed" width="400px" height="400px"></canvas>
<div id="description"></div>
<div id="console"></div>
<script>

description('Verify renderbuffers are initialized to 0 before being read in WebGL');

var canvas = document.getElementById("testbed");
var gl = canvas.getContext("experimental-webgl");
if (gl) {
    runTest(gl, canvas.width, canvas.height);

    // Testing that canvas resizing will clear the buffers with 0 instead of the current clear values.
    gl.clearColor(1, 0, 0, 1);
    canvas.width += 1;
    canvas.height += 1;
    runTest(gl, canvas.width, canvas.height);

    // Testing buffer clearing won't change the clear values.
    var clearColor = gl.getParameter(gl.COLOR_CLEAR_VALUE);
    shouldBe("clearColor", "[1, 0, 0, 1]");
} else
    testFailed('canvas.getContext() failed');
</script>
</body>
</html>
