dcp-client
Version:
Core libraries for accessing DCP network
114 lines (102 loc) • 3.11 kB
JavaScript
/**
* @file worker/evaluator-lib/calculate-capabilities.js
* Copyright (c) 2020-2022, Distributive. All Rights Reserved.
*
* This file provides a message handler for handling capabilities requests.
*
* @author Ryan Rossiter, ryan@kingsds.network
* @date Sept 2020
*/
/* global WebGPUWindow GPU */
// @ts-nocheck
self.wrapScriptLoading({ scriptName: 'calculate-capabilities' }, function calculateCapabilities$$fn(protectedStorage, ring2PostMessage)
{
async function getCapabilities() {
let offscreenCanvas = false;
let webgpu = false;
let useStrict = true;
let fdlibmFlag = true;
const inputFdlibm = [
7.330382858376182753090688493103,
9.424777960769379347993890405633,
14.660765716752370835251895186957,
16.755160819145565653798257699236,
7.33038285837618,
];
const outputFdlibm = [
1525.965888988748247356852516531944,
12391.64780791669181780889630317688,
2328571.89435723237693309783935546875,
18909231.8632431328296661376953125,
1525.965888988744154630694538354874,
];
let testCode = `
"use strict";
(function testFun(a) {
a=a+1;
return arguments[0];
});`
await protectedStorage.webGPUInitialization();
if (!protectedStorage.forceDisableWebGPU)
webgpu = Boolean(globalThis.navigator?.gpu);
if (webgpu) {
try {
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
device.destroy();
} catch (err) {
// if glfw fails or the symbols exist but webgpu hasn't been
// properly enabled (mozilla)
webgpu = false;
}
}
offscreenCanvas = !!(
typeof OffscreenCanvas !== 'undefined' && new OffscreenCanvas(1, 1)
);
try {
for (let i = 0; i < inputFdlibm.length; i++) {
if (
Math.exp(inputFdlibm[i]).toFixed(30) !== outputFdlibm[i].toFixed(30)
) {
fdlibmFlag = false;
break;
}
}
} catch (err) {
fdlibmFlag = false;
}
if(eval(testCode)(1) !== 1)
useStrict = false;
return {
environment: {
webgpu,
offscreenCanvas,
fdlibm: fdlibmFlag,
},
useStrict, // strict-mode in the work function
};
}
addEventListener('message', async (event) => {
try {
if (event.request === 'describe') {
const worktimes = protectedStorage.worktimes.getWorktimeList();
const capabilities = await getCapabilities();
ring2PostMessage({
capabilities,
worktimes,
request: 'describe',
});
}
} catch (error) {
ring2PostMessage({
request: 'error',
error: {
name: error.name,
message: error.message,
stack: error.stack,
},
});
}
});
},
);