added humangl custom backend

pull/293/head
Vladimir Mandic 2021-01-13 09:35:31 -05:00
parent 0bac1e11de
commit 13094b337a
4 changed files with 56 additions and 23 deletions

View File

@ -3,10 +3,11 @@ import draw from './draw.js';
import Menu from './menu.js'; import Menu from './menu.js';
import GLBench from './gl-bench.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 = { const userConfig = {
backend: 'humangl',
face: { enabled: false, iris: { enabled: false } }, face: { enabled: false, iris: { enabled: false } },
body: { enabled: false }, body: { enabled: false },
hand: { enabled: false }, hand: { enabled: false },

View File

@ -182,12 +182,12 @@ class Human {
if (!simd) log('warning: wasm simd support is not enabled'); if (!simd) log('warning: wasm simd support is not enabled');
} }
if (this.config.backend === 'humangl') { if (this.config.backend === 'humangl') backend.register();
log('registering humangl backend'); try {
backend.register(); 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(); tf.enableProdMode();
/* debug mode is really too mcuh /* debug mode is really too mcuh
tf.enableDebugMode(); tf.enableDebugMode();

View File

@ -1,9 +1,11 @@
import { log } from '../log.js';
import * as tf from '../../dist/tfjs.esm.js'; import * as tf from '../../dist/tfjs.esm.js';
export const config = { export const config = {
name: 'humangl', name: 'humangl',
priority: 99, priority: 99,
canvas: null, canvas: null,
gl: null,
width: 1024, width: 1024,
height: 1024, height: 1024,
webGLattr: { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.2 webGLattr: { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.2
@ -20,21 +22,51 @@ export const config = {
export function register() { export function register() {
if (!tf.findBackend(config.name)) { if (!tf.findBackend(config.name)) {
// @ts-ignore log('backend registration:', config.name);
config.canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(config.width, config.height) : document.createElement('canvas'); try {
// @ts-ignore config.canvas = (typeof OffscreenCanvas !== 'undefined') ? new OffscreenCanvas(config.width, config.height) : document.createElement('canvas');
const gl = config.canvas.getContext('webgl2', config.webGLattr); } catch (err) {
tf.setWebGLContext(2, gl); log('error: cannot create canvas:', err);
const ctx = new tf.GPGPUContext(gl); return;
tf.registerBackend(config.name, () => new tf.MathBackendWebGL(ctx), config.priority); }
const kernels = tf.getKernelsForBackend('webgl'); try {
kernels.forEach((kernelConfig) => { config.gl = config.canvas.getContext('webgl2', config.webGLattr);
const newKernelConfig = { ...kernelConfig, backendName: config.name }; } catch (err) {
tf.registerKernel(newKernelConfig); log('error: cannot get WebGL2 context:', err);
}); return;
tf.ENV.set('WEBGL_VERSION', 2); }
tf.ENV.set('WEBGL_MAX_TEXTURE_SIZE', gl.getParameter(gl.MAX_TEXTURE_SIZE)); try {
tf.ENV.set('WEBGL_FORCE_F16_TEXTURES', true); tf.setWebGLContext(2, config.gl);
tf.ENV.set('WEBGL_PACK_DEPTHWISECONV', true); } 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);
} }
} }

2
wiki

@ -1 +1 @@
Subproject commit 0ce580ced2bdf5f2f231dfae6c3d3f90053af6f6 Subproject commit c83eeeb158f2183d963500d9a767f04851497d2f