UNPKG

molstar

Version:

A comprehensive macromolecular library.

170 lines (169 loc) 6.52 kB
"use strict"; /** * 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;