<!DOCTYPE html>
<html>
  <head>
    <title>WebGL ActiveTexture BindTexture conformance test.</title>
    <script src="../../../resources/js-test.js"></script>
    <script src="resources/webgl-test.js"> </script>
</head>
<body>
<canvas id="example" width="2" height="2" style="width: 40px; height: 40px;"></canvas>
<canvas id="canvas2d" width="1" height="1" style="width: 40px; height: 40px;"></canvas>
<div id="description"></div>
<div id="console"></div>
<script id="vshader" type="x-shader/x-vertex">
uniform mat4 world;
attribute vec3 vPosition;
attribute vec2 texCoord0;
varying vec2 texCoord;
void main()
{
  gl_Position = world * vec4(vPosition, 1);
  texCoord = texCoord0;
}
</script>

<script id="fshader" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
uniform sampler2D tex;
varying vec2 texCoord;
void main()
{
  gl_FragColor = texture2D(tex, texCoord);
}
</script>

<script>
function init()
{
  if (window.initNonKhronosFramework) {
    window.initNonKhronosFramework(false);
  }

  debug("Tests that glActiveTexture and glBindTexture work as expected");
  debug("Specifically texture targets are per active texture unit.");
  debug("");

  var canvas2d = document.getElementById("canvas2d");
  var ctx2d = canvas2d.getContext("2d");

  gl = initWebGL("example", "vshader", "fshader", [ "vPosition", "texCoord0"],
                 [ 0, 0, 0, 1 ], 1);

  gl.disable(gl.DEPTH_TEST);
  gl.disable(gl.BLEND);

  var vertexObject = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
  gl.bufferData(
      gl.ARRAY_BUFFER,
      new Float32Array([-1, 1,0, 1,1,0, -1,-1,0,
                        -1,-1,0, 1,1,0,  1,-1,0]),
      gl.STATIC_DRAW);
  gl.enableVertexAttribArray(0);
  gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);

  var vertexObject = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
  gl.bufferData(
      gl.ARRAY_BUFFER,
      new Float32Array([ 0,0, 1,0, 0,1,
                         0,1, 1,0, 1,1]),
      gl.STATIC_DRAW);
  gl.enableVertexAttribArray(1);
  gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);
  shouldBe("gl.getError()", "gl.NO_ERROR");

  var colors = [
      [0,192,128,255],
      [128,64,255,255],
      [192,255,64,255],
      [200,0,255,255]];

  // Make 4 textures by using 4 active texture units.
  var textures = [];
  for (var ii = 0; ii < colors.length; ++ii) {
    var tex = gl.createTexture();
    gl.activeTexture(gl.TEXTURE0 + ii);
    gl.bindTexture(gl.TEXTURE_2D, tex);
    textures[ii] = tex;
  }
  shouldBe("gl.getError()", "gl.NO_ERROR");

  // now use each texture unit to write into the textures,
  for (var ii = 0; ii < colors.length; ++ii) {
    var c = colors[ii];
    ctx2d.fillStyle =
        "rgba(" + c[0] + "," + c[1] + "," + c[2] + "," + c[3] + ")";
    ctx2d.fillRect(0, 0, 1, 1);
    gl.activeTexture(gl.TEXTURE0 + ii);
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas2d);
  }
  shouldBe("gl.getError()", "gl.NO_ERROR");

  var textureLoc = gl.getUniformLocation(gl.program, "tex");
  var worldLoc = gl.getUniformLocation(gl.program, "world");
  shouldBe("gl.getError()", "gl.NO_ERROR");

  gl.clearColor(1,0,0,1);
  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

  for (var ii = 0; ii < colors.length; ++ii) {
    var x = ii % 2;
    var y = Math.floor(ii / 2);
    gl.uniform1i(textureLoc, ii);
    gl.uniformMatrix4fv(
        worldLoc, false,
        [0.5, 0, 0, 0,
         0, 0.5, 0, 0,
         0, 0, 1, 0,
         -0.5 + x, -0.5 + y, 0, 1]);
    gl.drawArrays(gl.TRIANGLES, 0, 6);
  }
  shouldBe("gl.getError()", "gl.NO_ERROR");

  for (var ii = 0; ii < colors.length; ++ii) {
    var c = colors[ii];
    var x = ii % 2;
    var y = Math.floor(ii / 2);
    var buf = new Uint8Array(4);
    gl.readPixels(x, y, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, buf);
    var msg = 'expected:' +
        c[0] + ', ' + c[1] + ', ' + c[2] + ', ' + c[3] + ' found: ' +
        buf[0] + ', ' +
        buf[1] + ', ' +
        buf[2] + ', ' +
        buf[3];
    if (buf[0] != c[0] ||
        buf[1] != c[1] ||
        buf[2] != c[2] ||
        buf[3] != c[3])
      testFailed(msg);
    else
      testPassed(msg);
  }
}

init();
</script>
</body>
</html>

