UNPKG

gpu.js

Version:

GPU Accelerated JavaScript

85 lines (82 loc) 2.46 kB
const { utils } = require('./utils'); /** * Makes kernels easier for mortals (including me) * @param kernel * @returns {function()} */ function kernelRunShortcut(kernel) { let run = function() { kernel.build.apply(kernel, arguments); run = function() { let result = kernel.run.apply(kernel, arguments); if (kernel.switchingKernels) { const reasons = kernel.resetSwitchingKernels(); const newKernel = kernel.onRequestSwitchKernel(reasons, arguments, kernel); shortcut.kernel = kernel = newKernel; result = newKernel.run.apply(newKernel, arguments); } if (kernel.renderKernels) { return kernel.renderKernels(); } else if (kernel.renderOutput) { return kernel.renderOutput(); } else { return result; } }; return run.apply(kernel, arguments); }; const shortcut = function() { return run.apply(kernel, arguments); }; /** * Run kernel in async mode * @returns {Promise<KernelOutput>} */ shortcut.exec = function() { return new Promise((accept, reject) => { try { accept(run.apply(this, arguments)); } catch (e) { reject(e); } }); }; shortcut.replaceKernel = function(replacementKernel) { kernel = replacementKernel; bindKernelToShortcut(kernel, shortcut); }; bindKernelToShortcut(kernel, shortcut); return shortcut; } function bindKernelToShortcut(kernel, shortcut) { if (shortcut.kernel) { shortcut.kernel = kernel; return; } const properties = utils.allPropertiesOf(kernel); for (let i = 0; i < properties.length; i++) { const property = properties[i]; if (property[0] === '_' && property[1] === '_') continue; if (typeof kernel[property] === 'function') { if (property.substring(0, 3) === 'add' || property.substring(0, 3) === 'set') { shortcut[property] = function() { shortcut.kernel[property].apply(shortcut.kernel, arguments); return shortcut; }; } else { shortcut[property] = function() { return shortcut.kernel[property].apply(shortcut.kernel, arguments); }; } } else { shortcut.__defineGetter__(property, () => shortcut.kernel[property]); shortcut.__defineSetter__(property, (value) => { shortcut.kernel[property] = value; }); } } shortcut.kernel = kernel; } module.exports = { kernelRunShortcut };