<!--
Copyright (c) 2019 The Khronos Group Inc.
Use of this source code is governed by an MIT-style license that can be
found in the LICENSE.txt file.
-->

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="../../resources/js-test-style.css"/>
<script src="../../js/js-test-pre.js"></script>
<script src="../../js/webgl-test-utils.js"></script>
</head>
<body>
<canvas id="testbed" width="400" height="400" style="width: 40px; height: 40px;"></canvas>
<div id="description"></div>
<div id="console"></div>
<script>
"use strict";
var wtu = WebGLTestUtils;
description('Verify renderbuffers are initialized to 0 before being read in WebGL');

var gl = wtu.create3DContext("testbed");
if (!gl) {
    testFailed('canvas.getContext() failed');
} else {
    // Set the clear color to green. It should never show up.
    gl.clearColor(0, 1, 0, 1);

    runTest(gl, gl.canvas.width, gl.canvas.height, 0);
    runTest(gl, gl.canvas.width, gl.canvas.height, 1);
    runTest(gl, gl.canvas.width, gl.canvas.height, 0);
    runTest(gl, gl.canvas.width, gl.canvas.height, 1);

    // Testing buffer clearing won't change the clear values.
    var clearColor = gl.getParameter(gl.COLOR_CLEAR_VALUE);
    shouldBe("clearColor", "[0, 1, 0, 1]");
    wtu.glErrorShouldBe(gl, gl.NO_ERROR, 'should be no errors');
}

function runTest(gl, width, height, order)
{
    wtu.checkCanvasRect(gl, 0, 0, width, height, [0,0,0,0],
                        "internal buffers have been initialized to 0");

    // fill the back buffer so we know that reading below happens from
    // the renderbuffer.
    gl.clear(gl.COLOR_BUFFER_BIT);

    var fbo = gl.createFramebuffer();
    gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
    var colorbuffer = gl.createRenderbuffer();
    gl.bindRenderbuffer(gl.RENDERBUFFER, colorbuffer);
    switch (order) {
      case 0:
        allocStorage(width, height);
        attachBuffer(colorbuffer);
        break;
      case 1:
        attachBuffer(colorbuffer);
        allocStorage(width, height);
        break;
    }

    function allocStorage(width, height) {
      gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA4, width, height);
      wtu.glErrorShouldBe(gl, gl.NO_ERROR, 'should be no error after renderbufferStorage(internalformat = RGBA4).');
    }

    function attachBuffer(colorbuffer) {
      gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, colorbuffer);
    }

    if (gl.checkFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE) {
        testFailed('Framebuffer incomplete.');
        return;
    }

    wtu.checkCanvasRect(gl, 0, 0, width, height, [0,0,0,0],
                        "user buffers have been initialized to 0");

    gl.deleteFramebuffer(fbo);
    gl.deleteRenderbuffer(colorbuffer);

    // this clear should not matter we are about to resize
    gl.clear(gl.COLOR_BUFFER_BIT);

    gl.canvas.width += 1;
    gl.canvas.height += 1;

    debug('');
}

var successfullyParsed = true;
</script>
<script src="../../js/js-test-post.js"></script>
</body>
</html>
