<!--

/*
** 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>
<script src="../js/glsl-conformance-test.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 downlaoded
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>
