From 2a041305e91545c4483f56ed77ebd6d0f755f038 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Wed, 13 Jan 2021 09:35:31 -0500 Subject: [PATCH] added humangl custom backend --- demo/browser.js | 3 ++- src/human.js | 10 +++---- src/tfjs/backend.js | 64 +++++++++++++++++++++++++++++++++------------ wiki | 2 +- 4 files changed, 56 insertions(+), 23 deletions(-) diff --git a/demo/browser.js b/demo/browser.js index 7e829a1e..3d53b3f4 100644 --- a/demo/browser.js +++ b/demo/browser.js @@ -3,10 +3,11 @@ import draw from './draw.js'; import Menu from './menu.js'; import GLBench from './gl-bench.js'; -const userConfig = {}; // add any user configuration overrides +const userConfig = { backend: 'humangl' }; // add any user configuration overrides /* const userConfig = { + backend: 'humangl', face: { enabled: false, iris: { enabled: false } }, body: { enabled: false }, hand: { enabled: false }, diff --git a/src/human.js b/src/human.js index 64284c09..eaed2ecf 100644 --- a/src/human.js +++ b/src/human.js @@ -182,12 +182,12 @@ class Human { if (!simd) log('warning: wasm simd support is not enabled'); } - if (this.config.backend === 'humangl') { - log('registering humangl backend'); - backend.register(); + if (this.config.backend === 'humangl') backend.register(); + try { + await tf.setBackend(this.config.backend); + } catch (err) { + log('error: cannot set backend:', this.config.backend, err); } - - await tf.setBackend(this.config.backend); tf.enableProdMode(); /* debug mode is really too mcuh tf.enableDebugMode(); diff --git a/src/tfjs/backend.js b/src/tfjs/backend.js index f9919043..704b9d68 100644 --- a/src/tfjs/backend.js +++ b/src/tfjs/backend.js @@ -1,9 +1,11 @@ +import { log } from '../log.js'; import * as tf from '../../dist/tfjs.esm.js'; export const config = { name: 'humangl', priority: 99, canvas: null, + gl: null, width: 1024, height: 1024, webGLattr: { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.2 @@ -20,21 +22,51 @@ export const config = { export function register() { if (!tf.findBackend(config.name)) { - // @ts-ignore - config.canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(config.width, config.height) : document.createElement('canvas'); - // @ts-ignore - const gl = config.canvas.getContext('webgl2', config.webGLattr); - tf.setWebGLContext(2, gl); - const ctx = new tf.GPGPUContext(gl); - tf.registerBackend(config.name, () => new tf.MathBackendWebGL(ctx), config.priority); - const kernels = tf.getKernelsForBackend('webgl'); - kernels.forEach((kernelConfig) => { - const newKernelConfig = { ...kernelConfig, backendName: config.name }; - tf.registerKernel(newKernelConfig); - }); - tf.ENV.set('WEBGL_VERSION', 2); - tf.ENV.set('WEBGL_MAX_TEXTURE_SIZE', gl.getParameter(gl.MAX_TEXTURE_SIZE)); - tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true); - tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true); + log('backend registration:', config.name); + try { + config.canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(config.width, config.height) : document.createElement('canvas'); + } catch (err) { + log('error: cannot create canvas:', err); + return; + } + try { + config.gl = config.canvas.getContext('webgl2', config.webGLattr); + } catch (err) { + log('error: cannot get WebGL2 context:', err); + return; + } + try { + tf.setWebGLContext(2, config.gl); + } catch (err) { + log('error: cannot set WebGL2 context:', err); + return; + } + try { + const ctx = new tf.GPGPUContext(config.gl); + tf.registerBackend(config.name, () => new tf.MathBackendWebGL(ctx), config.priority); + } catch (err) { + log('error: cannot register WebGL backend:', err); + return; + } + try { + const kernels = tf.getKernelsForBackend('webgl'); + kernels.forEach((kernelConfig) => { + const newKernelConfig = { ...kernelConfig, backendName: config.name }; + tf.registerKernel(newKernelConfig); + }); + } catch (err) { + log('error: cannot update WebGL backend registration:', err); + return; + } + try { + tf.ENV.set('WEBGL_VERSION', 2); + tf.ENV.set('WEBGL_MAX_TEXTURE_SIZE', config.gl.getParameter(config.gl.MAX_TEXTURE_SIZE)); + tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true); + tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true); + } catch (err) { + log('error: cannot set WebGL backend flags:', err); + return; + } + log('backend registered:', config.name); } } diff --git a/wiki b/wiki index 0ce580ce..c83eeeb1 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit 0ce580ced2bdf5f2f231dfae6c3d3f90053af6f6 +Subproject commit c83eeeb158f2183d963500d9a767f04851497d2f