<!DOCTYPE html>
<html>
<body>
<script src="../resources/runner.js"></script>
<script>
var canvas2D = document.createElement("canvas");
var ctx2D = canvas2D.getContext("2d");
var canvas3D = document.createElement('canvas');
var gl = canvas3D.getContext('experimental-webgl');
if (!gl)
    PerfTestRunner.log("\nWebGL is not supported or enabled on this platform!\n");
var MEASURE_DRAW_TIMES = 100;
var MAX_COUNT = 60000;
var count = 0;

function setSize(canvas2DWidth, canvas2DHeight, webglWidth, webglHeight) {
    canvas2D.width = canvas2DWidth;
    canvas2D.height = canvas2DHeight;
    canvas3D.width = webglWidth;
    canvas3D.height = webglHeight;
}

function rand(range) {
    return Math.floor(Math.random() * range);
}

function renderWebGL(gl) {
    gl.disable(gl.SCISSOR_TEST);
    gl.clear(gl.COLOR_BUFER_BIT);
    gl.enable(gl.SCISSOR_TEST);
    gl.scissor(rand(1024), rand(1024), rand(1024), rand(1024));
    gl.clearColor(Math.random(), Math.random(), Math.random(), 1);
    gl.clear(gl.COLOR_BUFFER_BIT);
}

function drawWebGLToCanvas2D() {
    if (gl) {
        var start = PerfTestRunner.now();
        for (var i = 0; i < MEASURE_DRAW_TIMES; i++) {
            renderWebGL(gl);
            // draw dynamic WebGL
            ctx2D.drawImage(canvas3D, 0, 0);
        }
        // Calling getImageData() is just to flush out the content when
        // accelerated 2D canvas is in use. The cost of reading 1x1 pixels is low.
        ctx2D.getImageData(0, 0, 1, 1);
        count++;

        var elapsedTime = PerfTestRunner.now() - start;
        PerfTestRunner.measureValueAsync(MEASURE_DRAW_TIMES * 1000 / elapsedTime);
    } else
        PerfTestRunner.measureValueAsync(0);
    if (count < MAX_COUNT)
        requestAnimationFrame(drawWebGLToCanvas2D);
}

function onCompletedRun() {
    count = MAX_COUNT;
}

window.onload = function () {
    PerfTestRunner.prepareToMeasureValuesAsync({done: onCompletedRun, unit: 'runs/s',
        description: "This bench test checks the speed on drawing dynamic WebGL(1024x1024) to HW accelerated Canvas2D(1024x1024)."});
    // It should use setMinimumAccelerated2dCanvasSize() to enable accelerated Canvas for a specified size
    // but this API is not available in JS or WebPage. Assume the threshold size is 256x257
    // and the dest canvas is HW accelerated Canvas when setting its size to 1024x1024.
    setSize(1024, 1024, 1024, 1024);
    if (gl)
        renderWebGL(gl);
    drawWebGLToCanvas2D();
}

</script>
</body>
</html>
