molstar
Version:
A comprehensive macromolecular library.
170 lines (169 loc) • 6.52 kB
JavaScript
/**
* Copyright (c) 2022 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author Alexander Rose <alexander.rose@weirdbyte.de>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.printTimerResults = exports.createTimer = void 0;
function getQuery(extensions) {
return extensions.disjointTimerQuery ? extensions.disjointTimerQuery.createQuery() : null;
}
function createTimer(gl, extensions) {
var dtq = extensions.disjointTimerQuery;
var queries = new Map();
var pending = new Map();
var stack = [];
var measures = [];
var current = null;
var clear = function () {
if (!dtq)
return;
queries.forEach(function (_, query) {
dtq.deleteQuery(query);
});
pending.clear();
measures = [];
current = null;
};
var add = function () {
if (!dtq)
return;
var query = getQuery(extensions);
if (!query)
return;
dtq.beginQuery(dtq.TIME_ELAPSED, query);
pending.forEach(function (measure, _) {
measure.queries.push(query);
});
queries.set(query, { refCount: pending.size });
current = query;
};
return {
resolve: function () {
var results = [];
if (!dtq || !measures.length)
return results;
// console.log('resolve');
queries.forEach(function (result, query) {
if (result.timeElapsed !== undefined)
return;
var available = dtq.getQueryParameter(query, dtq.QUERY_RESULT_AVAILABLE);
var disjoint = gl.getParameter(dtq.GPU_DISJOINT);
if (available && !disjoint) {
var timeElapsed = dtq.getQueryParameter(query, dtq.QUERY_RESULT);
result.timeElapsed = timeElapsed;
// console.log('timeElapsed', result.timeElapsed);
}
if (available || disjoint) {
dtq.deleteQuery(query);
}
});
var unresolved = [];
var _loop_1 = function (measure) {
if (measure.queries.every(function (q) { var _a; return ((_a = queries.get(q)) === null || _a === void 0 ? void 0 : _a.timeElapsed) !== undefined; })) {
var timeElapsed = 0;
for (var _a = 0, _b = measure.queries; _a < _b.length; _a++) {
var query = _b[_a];
var result = queries.get(query);
timeElapsed += result.timeElapsed;
result.refCount -= 1;
}
measure.timeElapsed = timeElapsed;
if (measure.root) {
var children = [];
var add_1 = function (measures, children) {
for (var _i = 0, measures_2 = measures; _i < measures_2.length; _i++) {
var measure_1 = measures_2[_i];
var result = {
label: measure_1.label,
timeElapsed: measure_1.timeElapsed,
children: []
};
children.push(result);
add_1(measure_1.children, result.children);
}
};
add_1(measure.children, children);
results.push({ label: measure.label, timeElapsed: timeElapsed, children: children });
}
}
else {
unresolved.push(measure);
}
};
for (var _i = 0, measures_1 = measures; _i < measures_1.length; _i++) {
var measure = measures_1[_i];
_loop_1(measure);
}
measures = unresolved;
queries.forEach(function (result, query) {
if (result.refCount === 0) {
queries.delete(query);
}
});
return results;
},
mark: function (label) {
if (!dtq)
return;
if (pending.has(label)) {
throw new Error("Timer mark for '".concat(label, "' already exists"));
}
if (current !== null) {
dtq.endQuery(dtq.TIME_ELAPSED);
}
var measure = { label: label, queries: [], children: [], root: current === null };
pending.set(label, measure);
if (stack.length) {
stack[stack.length - 1].children.push(measure);
}
stack.push(measure);
add();
},
markEnd: function (label) {
var _a;
if (!dtq)
return;
var measure = pending.get(label);
if (!measure) {
throw new Error("Timer mark for '".concat(label, "' does not exist"));
}
if (((_a = stack.pop()) === null || _a === void 0 ? void 0 : _a.label) !== label) {
throw new Error("Timer mark for '".concat(label, "' has pending nested mark"));
}
dtq.endQuery(dtq.TIME_ELAPSED);
pending.delete(label);
measures.push(measure);
if (pending.size > 0) {
add();
}
else {
current = null;
}
},
clear: clear,
destroy: function () {
clear();
}
};
}
exports.createTimer = createTimer;
function formatTimerResult(result) {
var timeElapsed = result.timeElapsed / 1000 / 1000;
return "".concat(result.label, " ").concat(timeElapsed.toFixed(2), "ms");
}
function printTimerResults(results) {
return results.map(function (r) {
var f = formatTimerResult(r);
if (r.children.length) {
console.groupCollapsed(f);
printTimerResults(r.children);
console.groupEnd();
}
else {
console.log(f);
}
});
}
exports.printTimerResults = printTimerResults;
;