// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
let oc;
let gl;
const sz = 256;
let canvas;
let ibrc;
let workerMode = false;
let worker;
//---------------------------------------------------------------------------
// Functions to be called either on the main thread or worker
function setupOffscreenCanvas(highPerformance) {
oc = new OffscreenCanvas(sz, sz);
let attribs = {};
if (highPerformance)
attribs['powerPreference'] = 'high-performance';
gl = oc.getContext('webgl', attribs);
}
function doRender() {
gl.clearColor(0.0, 1.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
let ib = oc.transferToImageBitmap();
if (workerMode) {
self.postMessage({frame: ib}, [ib]);
} else {
ibrc.transferFromImageBitmap(ib);
}
}
//---------------------------------------------------------------------------
// Functions to be called only on the main thread
function initialize(useWorker, selfURL) {
canvas = document.createElement('canvas');
canvas.style = 'position: absolute; top: 0px; left: 0px;';
canvas.width = 256;
canvas.height = 256;
document.body.appendChild(canvas);
ibrc = canvas.getContext('bitmaprenderer');
workerMode = useWorker;
if (workerMode) {
worker = new Worker(selfURL);
worker.onmessage = function(e) {
ibrc.transferFromImageBitmap(e.data.frame);
waitForFinish();
}
}
sendResult("READY");
}
function setup(highPerformance) {
if (workerMode) {
worker.postMessage({command: 'setup', highPerformance: highPerformance});
} else {
setupOffscreenCanvas(highPerformance);
}
}
function render() {
if (workerMode) {
worker.postMessage({command: 'render'});
} else {
doRender();
waitForFinish();
}
}
function logOutput(s) {
if (window.domAutomationController)
window.domAutomationController.log(s);
else
console.log(s);
}
function sendResult(status, detail) {
logOutput(status + ' ' + detail);
if (window.domAutomationController) {
window.domAutomationController.send(status);
}
}
function waitForFinish()
{
let numFramesBeforeEnd = 15;
function waitForFinishImpl() {
if (--numFramesBeforeEnd == 0) {
sendResult("SUCCESS", "Test complete");
} else {
window.requestAnimationFrame(waitForFinishImpl);
}
}
window.requestAnimationFrame(waitForFinishImpl);
}
//---------------------------------------------------------------------------
// Code to be executed only on the worker
if (this.document === undefined) {
workerMode = true;
// We're on a worker - set up postMessage handler.
self.onmessage = function(e) {
switch (e.data.command) {
case 'setup':
setupOffscreenCanvas(e.data.highPerformance);
break;
case 'render':
doRender();
break;
}
}
}