onnxruntime-web
Version:
A Javascript library for running ONNX models on browsers
110 lines (109 loc) • 3.73 kB
JavaScript
;
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
Object.defineProperty(exports, '__esModule', { value: true });
exports.TopologicalSortGlslRoutines =
exports.GlslLibRoutineNode =
exports.GlslLibRoutine =
exports.GlslLib =
exports.GlslContext =
exports.FunctionType =
void 0;
/* eslint-disable @typescript-eslint/naming-convention */
var FunctionType;
(function (FunctionType) {
FunctionType[(FunctionType['ValueBased'] = 0)] = 'ValueBased';
FunctionType[(FunctionType['Positional'] = 1)] = 'Positional';
})(FunctionType || (exports.FunctionType = FunctionType = {}));
class GlslContext {
constructor(glContext, programInfo, inputTextureLayouts, outputTextureLayout) {
this.glContext = glContext;
this.programInfo = programInfo;
this.inputTextureLayouts = inputTextureLayouts;
this.outputTextureLayout = outputTextureLayout;
}
}
exports.GlslContext = GlslContext;
class GlslLib {
constructor(context) {
this.context = context;
}
}
exports.GlslLib = GlslLib;
// abstraction to represent a GLSL library routine and it's dependencies
class GlslLibRoutine {
constructor(routineBody, dependencies) {
this.routineBody = routineBody;
this.dependencies = dependencies;
}
}
exports.GlslLibRoutine = GlslLibRoutine;
// abstraction to represent a GLSL library routine and it's dependencies AS GRAPH Nodes
// this level of abstraction is used to topologically sort routines before fragment shade inclusion
class GlslLibRoutineNode {
constructor(name, routineBody, dependencies) {
this.name = name;
if (dependencies) {
this.dependencies = dependencies;
} else {
this.dependencies = [];
}
if (routineBody) {
this.routineBody = routineBody;
}
}
addDependency(node) {
if (node) {
this.dependencies.push(node);
}
}
}
exports.GlslLibRoutineNode = GlslLibRoutineNode;
// topologically sort GLSL library routines (graph nodes abstraction) before shader script inclusion
class TopologicalSortGlslRoutines {
static returnOrderedNodes(nodes) {
if (!nodes || nodes.length === 0) {
return [];
}
if (nodes.length === 1) {
return nodes;
}
const cycleCheck = new Set();
const alreadyTraversed = new Set();
const result = new Array();
this.createOrderedNodes(nodes, cycleCheck, alreadyTraversed, result);
return result;
}
static createOrderedNodes(graphNodes, cycleCheck, alreadyTraversed, result) {
for (let i = 0; i < graphNodes.length; ++i) {
this.dfsTraverse(graphNodes[i], cycleCheck, alreadyTraversed, result);
}
}
static dfsTraverse(root, cycleCheck, alreadyTraversed, result) {
// if this root has already been traversed return
if (!root || alreadyTraversed.has(root.name)) {
return;
}
// cyclic dependency has been detected
if (cycleCheck.has(root.name)) {
throw new Error("Cyclic dependency detected. Can't topologically sort routines needed for shader.");
}
// hold this node to detect cycles if any
cycleCheck.add(root.name);
// traverse children in a dfs fashion
const dependencies = root.dependencies;
if (dependencies && dependencies.length > 0) {
for (let i = 0; i < dependencies.length; ++i) {
this.dfsTraverse(dependencies[i], cycleCheck, alreadyTraversed, result);
}
}
// add to result holder
result.push(root);
// mark this node as traversed so that we don't traverse from this again
alreadyTraversed.add(root.name);
// release the hold
cycleCheck.delete(root.name);
}
}
exports.TopologicalSortGlslRoutines = TopologicalSortGlslRoutines;
//# sourceMappingURL=glsl-definitions.js.map