human/src/tfjs/backend.ts

93 lines
2.5 KiB
TypeScript
Raw Normal View History

2021-05-25 14:58:20 +02:00
/**
* Custom TFJS backend for Human based on WebGL
* Not used by default
*/
2021-03-21 12:49:55 +01:00
import { log } from '../helpers';
2020-12-13 00:34:30 +01:00
import * as tf from '../../dist/tfjs.esm.js';
export const config = {
name: 'humangl',
priority: 99,
2021-04-09 16:02:40 +02:00
canvas: <null | OffscreenCanvas | HTMLCanvasElement>null,
2021-06-11 22:12:24 +02:00
gl: <null | WebGL2RenderingContext>null,
2020-12-13 00:34:30 +01:00
width: 1024,
height: 1024,
2021-06-11 22:12:24 +02:00
extensions: <string[]> [],
2020-12-13 00:34:30 +01:00
webGLattr: { // https://www.khronos.org/registry/webgl/specs/latest/1.0/#5.2
alpha: false,
antialias: false,
premultipliedAlpha: false,
preserveDrawingBuffer: false,
depth: false,
stencil: false,
failIfMajorPerformanceCaveat: false,
desynchronized: true,
},
};
2021-06-11 22:12:24 +02:00
function extensions(): void {
/*
https://www.khronos.org/registry/webgl/extensions/
https://webglreport.com/?v=2
*/
const gl = config.gl;
if (!gl) return;
config.extensions = gl.getSupportedExtensions() as string[];
// gl.getExtension('KHR_parallel_shader_compile');
}
/**
* Registers custom WebGL2 backend to be used by Human library
*
* @returns void
*/
2021-03-18 01:16:40 +01:00
export function register(): void {
2020-12-13 00:34:30 +01:00
if (!tf.findBackend(config.name)) {
2021-06-11 22:12:24 +02:00
// log('backend registration:', config.name);
2021-01-13 15:35:31 +01:00
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 {
2021-06-11 22:12:24 +02:00
config.gl = config.canvas.getContext('webgl2', config.webGLattr) as WebGL2RenderingContext;
2021-01-13 15:35:31 +01:00
} 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);
} catch (err) {
log('error: cannot set WebGL backend flags:', err);
return;
}
2021-06-11 22:12:24 +02:00
extensions();
2021-01-13 15:35:31 +01:00
log('backend registered:', config.name);
2020-12-13 00:34:30 +01:00
}
}