<!--

/*
** Copyright (c) 2013 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 out of bounds uniform array access.</title>
<link rel="stylesheet" href="../../resources/js-test-style.css"/>
<script src="../../resources/js-test-pre.js"></script>
<script src="../resources/webgl-test-utils.js"> </script>
</head>
<body>
<div id="description"></div>
<canvas id="example" width="128" height="128" style="background: black;">
</canvas>
<div id="console"></div>
<script id="vshader" type="x-shader/x-vertex">
attribute vec4 vPosition;
varying vec4 v_color;
uniform float lineWidth;
uniform int elemMult;
uniform vec4 colorArray[6];
void main()
{
    vec2 texcoord = vec2(vPosition.xy * 0.5 + vec2(0.5, 0.5));
    int index = int(texcoord.x + texcoord.y * lineWidth) * elemMult;
    v_color = colorArray[index];
    gl_Position = vPosition;
    gl_PointSize = 1.0;
}
</script>

<script id="fshader" type="x-shader/x-fragment">
precision mediump float;
varying vec4 v_color;
void main()
{
  gl_FragColor = v_color;
}
</script>
<script>
"use strict";
debug("Tests a WebGL program that accesses out of bounds uniform array elements");

var gl;
var gridRes = 127;
var lineWidthLoc;
var elemMultLoc;
var width = 128;
var height = 128;
var pixels = new Uint8Array(width * height * 4);

var lineWidth = 0;
var elemMult = 0;

var knownColors = [
  1.0, 0.0, 0.0, 1.0,  // Red
  0.0, 1.0, 0.0, 1.0,  // Green
  0.0, 0.0, 1.0, 1.0,  // Blue
  0.0, 1.0, 1.0, 1.0,  // Cyan
  1.0, 0.0, 1.0, 1.0,  // Magenta
  1.0, 1.0, 0.0, 1.0   // Yellow
];

function main() {
  var wtu = WebGLTestUtils;
  gl = wtu.create3DContext("example");
  var program = wtu.setupProgram(
      gl,
      ['vshader', 'fshader'],
      ['vPosition'], [0]);

  // setupQuad produces the geometry we want for a gridRes x gridRes grid
  // of points. No interpolation will be performed across the points, so
  // according to the WebGL specification for out-of-bounds array accesses,
  // we will get exactly the input colors from the uniform colorArray, or
  // zero, for each pixel on the canvas.
  wtu.setupIndexedQuad(gl, gridRes, 0);
  var colorArrayLoc = gl.getUniformLocation(program, "colorArray[0]");
  assertMsg(colorArrayLoc != null, "color array uniform should be found");
  var colors = new Float32Array(knownColors);
  gl.uniform4fv(colorArrayLoc, colors);
  lineWidthLoc = gl.getUniformLocation(program, "lineWidth");
  elemMultLoc = gl.getUniformLocation(program, "elemMult");
  assertMsg(gl.getError() == gl.NO_ERROR, "Should be no errors from setup.");
  runOneIteration();
}

function withinEpsilon(val1, val2) {
  return Math.abs(val1 - val2) < 0.0001;
}

function isKnownColor(r, g, b) {
  if (r == 0 && g == 0 && b == 0)
    return true;
  for (var ii = 0; ii < knownColors.length; ii += 4) {
    if (withinEpsilon(r / 255.0, knownColors[ii + 0]) &&
	withinEpsilon(g / 255.0, knownColors[ii + 1]) &&
	withinEpsilon(b / 255.0, knownColors[ii + 2]))
      return true;
  }
  return false;
}

function runOneIteration() {
  if (elemMult < 2048) {
    var ok = true;
    var startingLineWidth = lineWidth;
    var firstFailingPixel = null;
    var firstFailingValue = null;
    for (; lineWidth < 2540; lineWidth += 31) {
      // Draw
      gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
      gl.uniform1f(lineWidthLoc, lineWidth);
      gl.uniform1i(elemMultLoc, elemMult);
      gl.drawArrays(gl.POINTS, 0, gridRes * gridRes);
      
      // Read back
      gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels);

      // Verify
      for (var y = 0; y < height; ++y) {
        for (var x = 0; x < width; ++x) {
	  if (!isKnownColor(pixels[4 * (width * y + x) + 0],
			    pixels[4 * (width * y + x) + 1],
			    pixels[4 * (width * y + x) + 2])) {
            ok = false;
            if (firstFailingPixel == null) {
	      firstFailingPixel = [x, y];
	      firstFailingValue = [pixels[4 * (width * y + x) + 0],
				   pixels[4 * (width * y + x) + 1],
				   pixels[4 * (width * y + x) + 2]];
            }
          }
        }
      }
    }
    var endingLineWidth = lineWidth - 31;
    lineWidth -= 2540;
    if (ok) {
      testPassed("Good rendering results for lineWidths " +
		 startingLineWidth + "..." + endingLineWidth +
		 " at elemMult=" + elemMult);
    } else {
      testFailed("for lineWidth=" + lineWidth + ", elemMult=" + elemMult +
                 ": first failing pixel (" + firstFailingPixel[0] + ", " + firstFailingPixel[1] + ") was (" +
		 firstFailingValue[0] + ", " +
		 firstFailingValue[1] + ", " +
		 firstFailingValue[2] + "), should be (0, 0, 0) or one of known colors");
    }
    elemMult += 73;
    setTimeout(runOneIteration, 1);
  } else {
    finishTest();
  }
}

main();

var successfullyParsed = true;

</script>
</body>
</html>
