<!--
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 Delayed Drawing 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>
</head>
<body>
<canvas id="example" width="4" height="4" style="width: 40px; height: 30px;"></canvas>
<div id="description"></div>
<div id="console"></div>
<script>
"use strict";
enableJSTestPreVerboseLogging();
description(document.title);
var wtu = WebGLTestUtils;
var gl = wtu.create3DContext("example");
var program = wtu.setupTexturedQuad(gl);

wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors from setup.");

var tex = gl.createTexture();
wtu.fillTexture(gl, tex, 5, 3, [0, 192, 128, 255]);

var loc = gl.getUniformLocation(program, "tex");
gl.uniform1i(loc, 0);

gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);


drawAndCheck();

setTimeout(step2, 1000);

function step2() {
  drawAndCheck();
  finishTest();
}

function drawAndCheck() {
  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors before drawing.");
  wtu.clearAndDrawUnitQuad(gl);
  wtu.glErrorShouldBe(gl, gl.NO_ERROR, "Should be no errors from drawing.");
  wtu.checkCanvas(
      gl, [0, 192, 128, 255],
      "draw should be 0, 192, 128, 255");
}

var successfullyParsed = true;
</script>
</body>
</html>

