<!--

/*
** Copyright (c) 2015 The Khronos Group Inc.
**
** Permission is hereby granted, free of charge, to any person obtaining a
** copy of this software and/or associated documentation files (the
** "Materials"), to deal in the Materials without restriction, including
** without limitation the rights to use, copy, modify, merge, publish,
** distribute, sublicense, and/or sell copies of the Materials, and to
** permit persons to whom the Materials are furnished to do so, subject to
** the following conditions:
**
** The above copyright notice and this permission notice shall be included
** in all copies or substantial portions of the Materials.
**
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
*/

-->

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WebGL cube map out of order upload test.</title>
<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>
<div id="description"></div>
<div id="console"></div>
<canvas id="example" width="64" height="64">
</canvas>
<script>
"use strict";
description("Test out of order cube map uploads.");
debug("Regression test for crbug.com/473739 / Apple Radar 20444072.");

<!-- Thanks to Gregg Tavares for the original report and test case. -->

var wtu = WebGLTestUtils;

var canvas = document.getElementById("example");
canvas.addEventListener('webglcontextlost', contextLost, false);

var contextWasLost = false;

function contextLost(e) {
  e.preventDefault();
  contextWasLost = true;
  debug("***context lost -- should not happen***");
}

var dataWidth = 256;
var dataHeight = 256;
var gl = wtu.create3DContext(canvas);
var tex = gl.createTexture();
// start with 1x1 pixel cubemap
gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);
var color = new Uint8Array([128, 192, 255, 255]);
for (var ii = 0; ii < 6; ++ii) {
    gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + ii, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, color);
}
gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);
gl.generateMipmap(gl.TEXTURE_CUBE_MAP); // there's no need to call this but the code doesn't check the size.

var textureData = new Uint8Array(dataWidth * dataHeight * 4);

// The first texture has downloaded
var first = 1;
gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);
gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + first, 0, gl.RGBA, dataWidth, dataHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, textureData);

// Now because the first face downloaded doesn't match the other 5 faces upload the same image to the other 5
// 1x1 faces
for (var ii = 0; ii < 6; ++ii) {
    if (ii !== first) {
        gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);
        gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + ii, 0, gl.RGBA, dataWidth, dataHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, textureData);
    }
}
gl.generateMipmap(gl.TEXTURE_CUBE_MAP);

// Now as each new face comes in add it
for (var ii = 0; ii < 6; ++ii) {
    if (ii !== first) {
        gl.bindTexture(gl.TEXTURE_CUBE_MAP, tex);
        gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X + ii, 0, gl.RGBA, dataWidth, dataHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, textureData);
        gl.generateMipmap(gl.TEXTURE_CUBE_MAP);
    }
}

gl.flush();

setTimeout(function() {
  shouldBe("contextWasLost", "false");
  finishTest();
}, 1000);

var successfullyParsed = true;
</script>
</body>
</html>
