<!--
Copyright (c) 2022 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">
<link rel="stylesheet" href="../../../../webgl_test_files/resources/js-test-style.css"/>
<script src="../../../../webgl_test_files/js/js-test-pre.js"></script>
<script src="../../../../webgl_test_files/js/webgl-test-utils.js"></script>
<script>
"use strict";
var wtu = WebGLTestUtils;
var gl = null;
var textureLoc = null;
var successfullyParsed = false;
var blue = [0, 0, 248];
var yellow = [255, 255, 0];
var black = [0, 0, 0];
initTestingHarness();

function init()
{
    description('Verify optimization of repeated uploads of HTMLVideoElement to a texture');

    const canvas = document.getElementById("example");
    gl = wtu.create3DContext(canvas, { antialias: false, depth: false });
    const program = wtu.setupTexturedQuad(gl);
    gl.clearColor(0,0,0,1);
    gl.clearDepth(1);
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    const textureLoc = gl.getUniformLocation(program, "tex");
    gl.uniform1i(textureLoc, 0);
    gl.viewport(0, 0, canvas.width, canvas.height);

    const video1 = document.getElementById("video1");
    const video2 = document.getElementById("video2");
    wtu.startPlayingAndWaitForVideo(video1, (video) => {
        wtu.startPlayingAndWaitForVideo(video2, (video) => {
            runTest(video1, video2);
        });
    });
}

function checkFramebufferHasVideo2(gl)
{
    const leftColor = blue;
    const rightColor = yellow;
    const tolerance = 5;
    debug("Checking mid left border");
    wtu.checkCanvasRect(gl, 4, 20, 2, 2, leftColor, "shouldBe " + leftColor, tolerance);
    debug("Checking mid right border");
    wtu.checkCanvasRect(gl, gl.canvas.width - 4, gl.canvas.height - 20, 2, 2, rightColor, "shouldBe " + rightColor, tolerance);
}

function testTwoTexturesBug1(video1, video2)
{
    debug("Testing uploading same video to two different textures does not skip the latter upload")
    const textures = [gl.createTexture(), gl.createTexture()];
    // Initialize texture[0] to some specific content that fails the test.
    // Initialization is done with video to exercise the video content identification
    // algorithm.
    gl.bindTexture(gl.TEXTURE_2D, textures[0]);
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video1);

    // Try to fool the video content identification algorithm by first uploading
    // the passing content to some other, untested texture.
    gl.bindTexture(gl.TEXTURE_2D, textures[1]);
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video2);

    // Update texture[0] to some content that passes the test.
    gl.bindTexture(gl.TEXTURE_2D, textures[0]);
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video2);

    // Verify that the texture[0] received the new content.
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
    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);

    wtu.clearAndDrawUnitQuad(gl, [255, 0, 0, 255]);
    checkFramebufferHasVideo2(gl);
}

function runTest(video1, video2)
{
    testTwoTexturesBug1(video1, video2);
    wtu.glErrorShouldBe(gl, gl.NO_ERROR, "should be no errors");
    finishTest();
}
</script>
</head>
<body onload="init()">
<canvas id="example" width="64" height="48"></canvas>
<div id="description"></div>
<div id="console"></div>
<video id="video1" >
  <source src="../../../../webgl_test_files/resources/red-green.mp4"  type='video/mp4; codecs="avc1.42E01E"' />
  <source src="../../../../webgl_test_files/resources/red-green.webmvp8.webm" type='video/webm; codecs="vp8"' />
  <source src="../../../../webgl_test_files/resources/red-green.theora.ogv"  type='video/ogg; codecs="theora"' />
</video>
<video id="video2" >
    <source src="../../../../webgl_test_files/resources/video-rotation-0.mp4"  type='video/mp4; codecs="avc1.42E01E"' />
  </video>
</body>
</html>
