UNPKG

dcp-client

Version:

Core libraries for accessing DCP network

114 lines (102 loc) 3.11 kB
/** * @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, }, }); } }); }, );