<!--
Copyright (c) 2019 The Khronos Group Inc.
Use of this source code is governed by an MIT-style license that can be
found in the LICENSE.txt file.
-->

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WebGL texture2D GLSL conformance test.</title>
<link rel="stylesheet" href="../../../resources/js-test-style.css"/>
<link rel="stylesheet" href="../../../resources/glsl-feature-tests.css"/>
<script src="../../../js/js-test-pre.js"></script>
<script src="../../../js/webgl-test-utils.js"> </script>
</head>
<body>
<canvas id="example" width="256" height="256" style="width: 16px; height: 16px;"></canvas>
<div id="description"></div>
<div id="console"></div>
<script id="vshader2d" type="x-shader/x-vertex">
attribute vec4 vPosition;
attribute vec2 texCoord0;
varying vec2 texCoord;
void main() {
    gl_Position = vPosition;
    texCoord = texCoord0;
}
</script>
<script id="fshader2d" type="x-shader/x-fragment">
precision mediump float;
uniform sampler2D tex;
uniform float bias;
varying vec2 texCoord;
void main() {
    gl_FragData[0] = texture2D(tex, texCoord, bias);
}
</script>
<script>
"use strict";
description("tests GLSL texture2D function with bias");

var wtu = WebGLTestUtils;
var canvas = document.getElementById("example");

shouldBe("canvas.width", "256");
shouldBe("canvas.height", "256");

var gl = wtu.create3DContext(canvas);
var program = wtu.setupProgram(
    gl, ['vshader2d', 'fshader2d'], ['vPosition', 'texCoord0'], [0, 1]);
wtu.setupUnitQuad(gl, 0, 1);

var colors = [
  {name: 'red', color:[255, 0, 0, 255]},
  {name: 'green', color:[0, 255, 0, 255]},
  {name: 'blue', color:[0, 0, 255, 255]},
  {name: 'yellow', color:[255, 255, 0, 255]},
  {name: 'magenta', color:[255, 0, 255, 255]},
  {name: 'cyan', color:[0, 255, 255, 255]},
  {name: 'pink', color:[255, 128, 128, 255]},
  {name: 'gray', color:[128, 128, 128, 255]},
  {name: 'light green', color:[128, 255, 128, 255]},
];

shouldBe("colors.length", "9");

var tex = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, tex);
gl.texParameteri(
    gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);

for (var ii = 0; ii < colors.length; ++ii) {
  var color = colors[ii];
  var size = Math.pow(2, colors.length - ii - 1);
  wtu.fillTexture(gl, tex, size, size, color.color, ii);
}

var loc = gl.getUniformLocation(program, "bias");

for (var ii = 0; ii < colors.length; ++ii) {
  gl.uniform1f(loc, ii);
  var color = colors[ii];
  wtu.clearAndDrawUnitQuad(gl);
  wtu.checkCanvas(
      gl, color.color,
      "256x256 texture drawn to 256x256 dest with bias = " + ii +
      " should be " + color.name);
}
wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors.");

var successfullyParsed = true;

</script>
<script src="../../../js/js-test-post.js"></script>

</body>
</html>
