<!--

/*
** Copyright (c) 2012 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 ActiveTexture BindTexture conformance test #2</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>
<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="fshader2d" type="x-shader/x-fragment">
precision mediump float;

uniform sampler2D tex2d;
varying vec2 texCoord;
void main()
{
  gl_FragColor = texture2D(tex2d, texCoord);
}
</script>
<script id="fshaderCube" type="x-shader/x-fragment">
precision mediump float;

uniform samplerCube texCube;
void main()
{
  gl_FragColor = textureCube(texCube, vec3(0,1,0));
}
</script>

<script>
"use strict";
function init()
{
  description(
      "Tests that binding both TEXTURE_2D and TEXTURE_CUBE_MAP to the same " +
      "active texture unit works as long as they are not used " +
      "simultaneously in the same shader program.");

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

  var wtu = WebGLTestUtils;
  var gl = wtu.create3DContext("example");
  var program = wtu.setupProgram(
      gl, ["vshader", "fshader2d"], ["vPosition", "texCoord0"]);

  var program2d = program;
  var programCube = wtu.setupProgram(
      gl, ["vshader", "fshaderCube"], ["vPosition", "texCoord0"]);

  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);

  // Make texture unit 1 active.
  gl.activeTexture(gl.TEXTURE1);

  // Make a 2d texture
  var tex2d = gl.createTexture();
  gl.bindTexture(gl.TEXTURE_2D, tex2d);
  ctx2d.fillStyle = "rgba(0, 0, 255, 255)";
  ctx2d.fillRect(0, 0, 1, 1);
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas2d);

  // make a cube texture
  var texCube = gl.createTexture();
  gl.bindTexture(gl.TEXTURE_CUBE_MAP, texCube);
  ctx2d.fillStyle = "rgba(255, 0, 255, 255)";
  ctx2d.fillRect(0, 0, 1, 1);
  var targets = [
    gl.TEXTURE_CUBE_MAP_POSITIVE_X,
    gl.TEXTURE_CUBE_MAP_NEGATIVE_X,
    gl.TEXTURE_CUBE_MAP_POSITIVE_Y,
    gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,
    gl.TEXTURE_CUBE_MAP_POSITIVE_Z,
    gl.TEXTURE_CUBE_MAP_NEGATIVE_Z];
  for (var ii = 0; ii < targets.length; ++ii) {
    gl.texImage2D(targets[ii], 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas2d);
  }

  // Setup program2d and programCube
  var tex2dLoc = gl.getUniformLocation(program2d, "tex2d");
  var world2dLoc = gl.getUniformLocation(program2d, "world");
  var texCubeLoc = gl.getUniformLocation(programCube, "texCube");
  var worldCubeLoc = gl.getUniformLocation(programCube, "world");

  gl.useProgram(program2d);
  gl.uniform1i(tex2dLoc, 1);
  gl.useProgram(programCube);
  gl.uniform1i(texCubeLoc, 1);

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

  var programs = [program2d, programCube];
  var worldLocs = [world2dLoc, worldCubeLoc];
  for (var ii = 0; ii < 4; ++ii) {
    var x = ii % 2;
    var y = Math.floor(ii / 2);
    gl.useProgram(programs[x]);
    gl.uniformMatrix4fv(
        worldLocs[x], 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);
  }

  var colors = [
      [0,0,255,255],
      [255,0,255,255],
      [0,0,255,255],
      [255,0,255,255]];

  for (var ii = 0; ii < colors.length; ++ii) {
    var c = colors[ii];
    var x = ii % 2;
    var y = Math.floor(ii / 2);
    wtu.checkCanvasRect(gl, x, y, 1, 1, c);
  }

  // Test that binding to one target does not affect the other
  debug("");
  debug("Testing texture target binding/unbinding");

  var worldMatrix = [
      1, 0, 0, 0,
      0, 1, 0, 0,
      0, 0, 1, 0,
      0, 0, 0, 1];

  gl.activeTexture(gl.TEXTURE2);

  // Unbinding the TEXTURE_CUBE_MAP target should not affect the TEXTURE_2D target
  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

  gl.bindTexture(gl.TEXTURE_2D, tex2d);
  gl.bindTexture(gl.TEXTURE_CUBE_MAP, texCube);
  gl.bindTexture(gl.TEXTURE_CUBE_MAP, null);

  gl.useProgram(program2d);
  gl.uniform1i(tex2dLoc, 2);
  gl.uniformMatrix4fv(world2dLoc, false, worldMatrix);
  gl.drawArrays(gl.TRIANGLES, 0, 6);

  wtu.checkCanvasRect(gl, 0, 0, 2, 2, [0,0,255,255]);

  // Unbinding the TEXTURE_2D target should not affect the TEXTURE_CUBE_MAP target
  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

  gl.bindTexture(gl.TEXTURE_CUBE_MAP, texCube);
  gl.bindTexture(gl.TEXTURE_2D, tex2d);
  gl.bindTexture(gl.TEXTURE_2D, null);

  gl.useProgram(programCube);
  gl.uniform1i(texCubeLoc, 2);
  gl.uniformMatrix4fv(worldCubeLoc, false, worldMatrix);
  gl.drawArrays(gl.TRIANGLES, 0, 6);

  wtu.checkCanvasRect(gl, 0, 0, 2, 2, [255,0,255,255]);
}

init();
var successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>

</body>
</html>

