@itwin/core-frontend 4.5.0-dev.29 → 4.5.0-dev.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/render/webgl/GLTimer.d.ts.map +1 -1
- package/lib/cjs/render/webgl/GLTimer.js +24 -4
- package/lib/cjs/render/webgl/GLTimer.js.map +1 -1
- package/lib/esm/render/webgl/GLTimer.d.ts.map +1 -1
- package/lib/esm/render/webgl/GLTimer.js +24 -4
- package/lib/esm/render/webgl/GLTimer.js.map +1 -1
- package/lib/public/scripts/parse-imdl-worker.js +1 -1
- package/lib/workers/webpack/parse-imdl-worker.js +1 -1
- package/package.json +18 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GLTimer.d.ts","sourceRoot":"","sources":["../../../../src/render/webgl/GLTimer.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiB,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"GLTimer.d.ts","sourceRoot":"","sources":["../../../../src/render/webgl/GLTimer.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiB,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAsClC;;;;;;;;;;;;;GAaG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,gBAAgB,CAAC,CAAwB;IAEjD,OAAO;WAQO,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI7C,IAAW,WAAW,IAAI,OAAO,CAAwC;IAEzE,IAAW,eAAe,CAAC,QAAQ,EAAE,qBAAqB,GAAG,SAAS,EAKrE;IAEM,cAAc,CAAC,KAAK,EAAE,MAAM;IAO5B,YAAY;IASZ,UAAU;IAWV,QAAQ;IA0Df,OAAO,CAAC,yBAAyB;IAajC,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,QAAQ;CAYjB"}
|
|
@@ -93,9 +93,11 @@ class GLTimer {
|
|
|
93
93
|
this.cleanupAfterDisjointEvent(root);
|
|
94
94
|
return;
|
|
95
95
|
}
|
|
96
|
-
// It takes
|
|
96
|
+
// It takes one or more frames for results to become available.
|
|
97
97
|
// Only checking time for root since it will always be the last query completed.
|
|
98
|
-
|
|
98
|
+
// If there are any sibling queries then we will just check the last one.
|
|
99
|
+
const finalQuery = (undefined === root.siblingQueries ? root.query : root.siblingQueries[root.siblingQueries.length - 1]);
|
|
100
|
+
if (!this._extension.isResultAvailable(finalQuery)) {
|
|
99
101
|
setTimeout(queryCallback, 0);
|
|
100
102
|
return;
|
|
101
103
|
}
|
|
@@ -103,6 +105,14 @@ class GLTimer {
|
|
|
103
105
|
const time = this._extension.getResult(queryEntry.query);
|
|
104
106
|
this._extension.deleteQuery(queryEntry.query);
|
|
105
107
|
const result = { label: queryEntry.label, nanoseconds: time };
|
|
108
|
+
if (undefined !== queryEntry.siblingQueries) {
|
|
109
|
+
for (const sib of queryEntry.siblingQueries) {
|
|
110
|
+
const sibTime = this._extension.getResult(sib);
|
|
111
|
+
this._extension.deleteQuery(sib);
|
|
112
|
+
result.nanoseconds += sibTime;
|
|
113
|
+
}
|
|
114
|
+
queryEntry.siblingQueries = undefined;
|
|
115
|
+
}
|
|
106
116
|
if (queryEntry.children === undefined)
|
|
107
117
|
return result;
|
|
108
118
|
result.children = [];
|
|
@@ -119,6 +129,11 @@ class GLTimer {
|
|
|
119
129
|
}
|
|
120
130
|
cleanupAfterDisjointEvent(queryEntry) {
|
|
121
131
|
this._extension.deleteQuery(queryEntry.query);
|
|
132
|
+
if (undefined !== queryEntry.siblingQueries) {
|
|
133
|
+
for (const sib of queryEntry.siblingQueries)
|
|
134
|
+
this._extension.deleteQuery(sib);
|
|
135
|
+
queryEntry.siblingQueries = undefined;
|
|
136
|
+
}
|
|
122
137
|
if (!queryEntry.children)
|
|
123
138
|
return;
|
|
124
139
|
for (const child of queryEntry.children)
|
|
@@ -139,8 +154,13 @@ class GLTimer {
|
|
|
139
154
|
popQuery() {
|
|
140
155
|
this._extension.endQuery();
|
|
141
156
|
this._queryStack.pop();
|
|
142
|
-
const
|
|
143
|
-
this.
|
|
157
|
+
const lastStackIndex = this._queryStack.length - 1;
|
|
158
|
+
const activeQuery = this._queryStack[lastStackIndex];
|
|
159
|
+
if (undefined === activeQuery.siblingQueries)
|
|
160
|
+
activeQuery.siblingQueries = [];
|
|
161
|
+
const newQuery = this._extension.createQuery();
|
|
162
|
+
activeQuery.siblingQueries.push(newQuery);
|
|
163
|
+
this._extension.beginQuery(newQuery);
|
|
144
164
|
}
|
|
145
165
|
}
|
|
146
166
|
exports.GLTimer = GLTimer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GLTimer.js","sourceRoot":"","sources":["../../../../src/render/webgl/GLTimer.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { BentleyStatus } from \"@itwin/core-bentley\";\nimport { IModelError } from \"@itwin/core-common\";\nimport { GLTimerResult, GLTimerResultCallback } from \"../RenderSystem\";\nimport { System } from \"./System\";\n\nclass DisjointTimerExtension {\n private _e: any; // EXT_disjoint_timer_query, not available in lib.dom.d.ts\n private _context: WebGL2RenderingContext;\n\n public constructor(system: System) {\n this._e = system.disjointTimerQuery;\n this._context = system.context;\n }\n\n public get isSupported(): boolean { return this._e !== undefined; }\n\n public didDisjointEventHappen(): boolean {\n return this._context.getParameter(this._e.GPU_DISJOINT_EXT);\n }\n\n public createQuery(): WebGLQuery { return this._context.createQuery() as WebGLQuery; }\n public deleteQuery(q: WebGLQuery) { this._context.deleteQuery(q); }\n\n public beginQuery(q: WebGLQuery) { this._context.beginQuery(this._e.TIME_ELAPSED_EXT, q); }\n public endQuery() { this._context.endQuery(this._e.TIME_ELAPSED_EXT); }\n\n public isResultAvailable(q: WebGLQuery): boolean {\n return this._context.getQueryParameter(q, this._context.QUERY_RESULT_AVAILABLE);\n }\n public getResult(q: WebGLQuery): number {\n return this._context.getQueryParameter(q, this._context.QUERY_RESULT);\n }\n}\n\ninterface QueryEntry {\n label: string;\n query: WebGLQuery;\n children?: QueryEntry[];\n}\n\n/** Record GPU hardware queries to profile independent of CPU.\n *\n * This is a wrapper around EXT_disjoint_timer_query. The extension should be available in the following browsers:\n * * Chrome 67 and later\n * * Chromium-based Edge\n * * Firefox (with webgl.enable-privileged-extensions set to true in about:config)\n *\n * EXT_disjoint_timer_query only supports one active query per context without nesting. This wrapper keeps an internal stack to make\n * nesting work.\n *\n * The extension API makes timestamps look like a better solution than disjoint timers, but they are not actually supported.\n * See https://bugs.chromium.org/p/chromium/issues/detail?id=595172\n * @internal\n */\nexport class GLTimer {\n private _extension: DisjointTimerExtension;\n private _queryStack: QueryEntry[];\n private _resultsCallback?: GLTimerResultCallback;\n\n private constructor(system: System) {\n this._extension = new DisjointTimerExtension(system);\n this._queryStack = [];\n this._resultsCallback = undefined;\n }\n\n // This class is necessarily a singleton per context because of the underlying extension it wraps.\n // System is expected to call create in its constructor.\n public static create(system: System): GLTimer {\n return new GLTimer(system);\n }\n\n public get isSupported(): boolean { return this._extension.isSupported; }\n\n public set resultsCallback(callback: GLTimerResultCallback | undefined) {\n if (this._queryStack.length !== 0)\n throw new IModelError(BentleyStatus.ERROR, \"Do not set resultsCallback when a frame is already being drawn\");\n\n this._resultsCallback = callback;\n }\n\n public beginOperation(label: string) {\n if (!this._resultsCallback)\n return;\n\n this.pushQuery(label);\n }\n\n public endOperation() {\n if (!this._resultsCallback)\n return;\n if (this._queryStack.length === 0)\n throw new IModelError(BentleyStatus.ERROR, \"Mismatched calls to beginOperation/endOperation\");\n\n this.popQuery();\n }\n\n public beginFrame() {\n if (!this._resultsCallback)\n return;\n if (this._queryStack.length !== 0)\n throw new IModelError(BentleyStatus.ERROR, \"Already recording timing for a frame\");\n\n const query = this._extension.createQuery();\n this._extension.beginQuery(query);\n this._queryStack.push({ label: \"Total\", query, children: [] });\n }\n\n public endFrame() {\n if (!this._resultsCallback)\n return;\n if (this._queryStack.length !== 1)\n throw new IModelError(BentleyStatus.ERROR, \"Missing at least one endOperation call\");\n\n this._extension.endQuery();\n const root = this._queryStack.pop()!;\n const userCallback = this._resultsCallback;\n\n const queryCallback = () => {\n if (this._extension.didDisjointEventHappen()) {\n // Have to throw away results for this frame after disjoint event occurs.\n this.cleanupAfterDisjointEvent(root);\n return;\n }\n\n // It takes more one or more frames for results to become available.\n // Only checking time for root since it will always be the last query completed.\n if (!this._extension.isResultAvailable(root.query)) {\n setTimeout(queryCallback, 0);\n return;\n }\n\n const processQueryEntry = (queryEntry: QueryEntry): GLTimerResult => {\n const time = this._extension.getResult(queryEntry.query);\n this._extension.deleteQuery(queryEntry.query);\n\n const result: GLTimerResult = { label: queryEntry.label, nanoseconds: time };\n if (queryEntry.children === undefined)\n return result;\n\n result.children = [];\n for (const child of queryEntry.children) {\n const childResult = processQueryEntry(child);\n result.children.push(childResult);\n result.nanoseconds += childResult.nanoseconds;\n }\n return result;\n };\n\n userCallback(processQueryEntry(root));\n };\n setTimeout(queryCallback, 0);\n }\n\n private cleanupAfterDisjointEvent(queryEntry: QueryEntry) {\n this._extension.deleteQuery(queryEntry.query);\n if (!queryEntry.children)\n return;\n for (const child of queryEntry.children)\n this.cleanupAfterDisjointEvent(child);\n }\n\n private pushQuery(label: string) {\n this._extension.endQuery();\n\n const query = this._extension.createQuery();\n this._extension.beginQuery(query);\n\n const activeQuery = this._queryStack[this._queryStack.length - 1];\n const queryEntry: QueryEntry = { label, query };\n this._queryStack.push(queryEntry);\n\n if (activeQuery.children === undefined)\n activeQuery.children = [queryEntry];\n else\n activeQuery.children.push(queryEntry);\n }\n\n private popQuery() {\n this._extension.endQuery();\n this._queryStack.pop();\n\n const activeQuery = this._queryStack[this._queryStack.length - 1];\n this._extension.beginQuery(activeQuery.query);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"GLTimer.js","sourceRoot":"","sources":["../../../../src/render/webgl/GLTimer.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { BentleyStatus } from \"@itwin/core-bentley\";\nimport { IModelError } from \"@itwin/core-common\";\nimport { GLTimerResult, GLTimerResultCallback } from \"../RenderSystem\";\nimport { System } from \"./System\";\n\nclass DisjointTimerExtension {\n private _e: any; // EXT_disjoint_timer_query, not available in lib.dom.d.ts\n private _context: WebGL2RenderingContext;\n\n public constructor(system: System) {\n this._e = system.disjointTimerQuery;\n this._context = system.context;\n }\n\n public get isSupported(): boolean { return this._e !== undefined; }\n\n public didDisjointEventHappen(): boolean {\n return this._context.getParameter(this._e.GPU_DISJOINT_EXT);\n }\n\n public createQuery(): WebGLQuery { return this._context.createQuery() as WebGLQuery; }\n public deleteQuery(q: WebGLQuery) { this._context.deleteQuery(q); }\n\n public beginQuery(q: WebGLQuery) { this._context.beginQuery(this._e.TIME_ELAPSED_EXT, q); }\n public endQuery() { this._context.endQuery(this._e.TIME_ELAPSED_EXT); }\n\n public isResultAvailable(q: WebGLQuery): boolean {\n return this._context.getQueryParameter(q, this._context.QUERY_RESULT_AVAILABLE);\n }\n public getResult(q: WebGLQuery): number {\n return this._context.getQueryParameter(q, this._context.QUERY_RESULT);\n }\n}\n\ninterface QueryEntry {\n label: string;\n query: WebGLQuery;\n siblingQueries?: WebGLQuery[]; // For when the main query is broken up into pieces by intermittent child queries.\n children?: QueryEntry[];\n}\n\n/** Record GPU hardware queries to profile independent of CPU.\n *\n * This is a wrapper around EXT_disjoint_timer_query. The extension should be available in the following browsers:\n * * Chrome 67 and later\n * * Chromium-based Edge\n * * Firefox (with webgl.enable-privileged-extensions set to true in about:config)\n *\n * EXT_disjoint_timer_query only supports one active query per context without nesting. This wrapper keeps an internal stack to make\n * nesting work.\n *\n * The extension API makes timestamps look like a better solution than disjoint timers, but they are not actually supported.\n * See https://bugs.chromium.org/p/chromium/issues/detail?id=595172\n * @internal\n */\nexport class GLTimer {\n private _extension: DisjointTimerExtension;\n private _queryStack: QueryEntry[];\n private _resultsCallback?: GLTimerResultCallback;\n\n private constructor(system: System) {\n this._extension = new DisjointTimerExtension(system);\n this._queryStack = [];\n this._resultsCallback = undefined;\n }\n\n // This class is necessarily a singleton per context because of the underlying extension it wraps.\n // System is expected to call create in its constructor.\n public static create(system: System): GLTimer {\n return new GLTimer(system);\n }\n\n public get isSupported(): boolean { return this._extension.isSupported; }\n\n public set resultsCallback(callback: GLTimerResultCallback | undefined) {\n if (this._queryStack.length !== 0)\n throw new IModelError(BentleyStatus.ERROR, \"Do not set resultsCallback when a frame is already being drawn\");\n\n this._resultsCallback = callback;\n }\n\n public beginOperation(label: string) {\n if (!this._resultsCallback)\n return;\n\n this.pushQuery(label);\n }\n\n public endOperation() {\n if (!this._resultsCallback)\n return;\n if (this._queryStack.length === 0)\n throw new IModelError(BentleyStatus.ERROR, \"Mismatched calls to beginOperation/endOperation\");\n\n this.popQuery();\n }\n\n public beginFrame() {\n if (!this._resultsCallback)\n return;\n if (this._queryStack.length !== 0)\n throw new IModelError(BentleyStatus.ERROR, \"Already recording timing for a frame\");\n\n const query = this._extension.createQuery();\n this._extension.beginQuery(query);\n this._queryStack.push({ label: \"Total\", query, children: [] });\n }\n\n public endFrame() {\n if (!this._resultsCallback)\n return;\n if (this._queryStack.length !== 1)\n throw new IModelError(BentleyStatus.ERROR, \"Missing at least one endOperation call\");\n\n this._extension.endQuery();\n const root = this._queryStack.pop()!;\n const userCallback = this._resultsCallback;\n\n const queryCallback = () => {\n if (this._extension.didDisjointEventHappen()) {\n // Have to throw away results for this frame after disjoint event occurs.\n this.cleanupAfterDisjointEvent(root);\n return;\n }\n\n // It takes one or more frames for results to become available.\n // Only checking time for root since it will always be the last query completed.\n // If there are any sibling queries then we will just check the last one.\n const finalQuery = (undefined === root.siblingQueries ? root.query : root.siblingQueries[root.siblingQueries.length-1]);\n if (!this._extension.isResultAvailable(finalQuery)) {\n setTimeout(queryCallback, 0);\n return;\n }\n\n const processQueryEntry = (queryEntry: QueryEntry): GLTimerResult => {\n const time = this._extension.getResult(queryEntry.query);\n this._extension.deleteQuery(queryEntry.query);\n\n const result: GLTimerResult = { label: queryEntry.label, nanoseconds: time };\n\n if (undefined !== queryEntry.siblingQueries) {\n for (const sib of queryEntry.siblingQueries) {\n const sibTime = this._extension.getResult(sib);\n this._extension.deleteQuery(sib);\n result.nanoseconds += sibTime;\n }\n queryEntry.siblingQueries = undefined;\n }\n\n if (queryEntry.children === undefined)\n return result;\n\n result.children = [];\n for (const child of queryEntry.children) {\n const childResult = processQueryEntry(child);\n result.children.push(childResult);\n result.nanoseconds += childResult.nanoseconds;\n }\n return result;\n };\n\n userCallback(processQueryEntry(root));\n };\n setTimeout(queryCallback, 0);\n }\n\n private cleanupAfterDisjointEvent(queryEntry: QueryEntry) {\n this._extension.deleteQuery(queryEntry.query);\n if (undefined !== queryEntry.siblingQueries) {\n for (const sib of queryEntry.siblingQueries)\n this._extension.deleteQuery(sib);\n queryEntry.siblingQueries = undefined;\n }\n if (!queryEntry.children)\n return;\n for (const child of queryEntry.children)\n this.cleanupAfterDisjointEvent(child);\n }\n\n private pushQuery(label: string) {\n this._extension.endQuery();\n\n const query = this._extension.createQuery();\n this._extension.beginQuery(query);\n\n const activeQuery = this._queryStack[this._queryStack.length - 1];\n const queryEntry: QueryEntry = { label, query };\n this._queryStack.push(queryEntry);\n\n if (activeQuery.children === undefined)\n activeQuery.children = [queryEntry];\n else\n activeQuery.children.push(queryEntry);\n }\n\n private popQuery() {\n this._extension.endQuery();\n this._queryStack.pop();\n\n const lastStackIndex = this._queryStack.length - 1;\n const activeQuery = this._queryStack[lastStackIndex];\n if (undefined === activeQuery.siblingQueries)\n activeQuery.siblingQueries = [];\n const newQuery = this._extension.createQuery();\n activeQuery.siblingQueries.push(newQuery);\n this._extension.beginQuery(newQuery);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GLTimer.d.ts","sourceRoot":"","sources":["../../../../src/render/webgl/GLTimer.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiB,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"GLTimer.d.ts","sourceRoot":"","sources":["../../../../src/render/webgl/GLTimer.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiB,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAsClC;;;;;;;;;;;;;GAaG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,gBAAgB,CAAC,CAAwB;IAEjD,OAAO;WAQO,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI7C,IAAW,WAAW,IAAI,OAAO,CAAwC;IAEzE,IAAW,eAAe,CAAC,QAAQ,EAAE,qBAAqB,GAAG,SAAS,EAKrE;IAEM,cAAc,CAAC,KAAK,EAAE,MAAM;IAO5B,YAAY;IASZ,UAAU;IAWV,QAAQ;IA0Df,OAAO,CAAC,yBAAyB;IAajC,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,QAAQ;CAYjB"}
|
|
@@ -90,9 +90,11 @@ export class GLTimer {
|
|
|
90
90
|
this.cleanupAfterDisjointEvent(root);
|
|
91
91
|
return;
|
|
92
92
|
}
|
|
93
|
-
// It takes
|
|
93
|
+
// It takes one or more frames for results to become available.
|
|
94
94
|
// Only checking time for root since it will always be the last query completed.
|
|
95
|
-
|
|
95
|
+
// If there are any sibling queries then we will just check the last one.
|
|
96
|
+
const finalQuery = (undefined === root.siblingQueries ? root.query : root.siblingQueries[root.siblingQueries.length - 1]);
|
|
97
|
+
if (!this._extension.isResultAvailable(finalQuery)) {
|
|
96
98
|
setTimeout(queryCallback, 0);
|
|
97
99
|
return;
|
|
98
100
|
}
|
|
@@ -100,6 +102,14 @@ export class GLTimer {
|
|
|
100
102
|
const time = this._extension.getResult(queryEntry.query);
|
|
101
103
|
this._extension.deleteQuery(queryEntry.query);
|
|
102
104
|
const result = { label: queryEntry.label, nanoseconds: time };
|
|
105
|
+
if (undefined !== queryEntry.siblingQueries) {
|
|
106
|
+
for (const sib of queryEntry.siblingQueries) {
|
|
107
|
+
const sibTime = this._extension.getResult(sib);
|
|
108
|
+
this._extension.deleteQuery(sib);
|
|
109
|
+
result.nanoseconds += sibTime;
|
|
110
|
+
}
|
|
111
|
+
queryEntry.siblingQueries = undefined;
|
|
112
|
+
}
|
|
103
113
|
if (queryEntry.children === undefined)
|
|
104
114
|
return result;
|
|
105
115
|
result.children = [];
|
|
@@ -116,6 +126,11 @@ export class GLTimer {
|
|
|
116
126
|
}
|
|
117
127
|
cleanupAfterDisjointEvent(queryEntry) {
|
|
118
128
|
this._extension.deleteQuery(queryEntry.query);
|
|
129
|
+
if (undefined !== queryEntry.siblingQueries) {
|
|
130
|
+
for (const sib of queryEntry.siblingQueries)
|
|
131
|
+
this._extension.deleteQuery(sib);
|
|
132
|
+
queryEntry.siblingQueries = undefined;
|
|
133
|
+
}
|
|
119
134
|
if (!queryEntry.children)
|
|
120
135
|
return;
|
|
121
136
|
for (const child of queryEntry.children)
|
|
@@ -136,8 +151,13 @@ export class GLTimer {
|
|
|
136
151
|
popQuery() {
|
|
137
152
|
this._extension.endQuery();
|
|
138
153
|
this._queryStack.pop();
|
|
139
|
-
const
|
|
140
|
-
this.
|
|
154
|
+
const lastStackIndex = this._queryStack.length - 1;
|
|
155
|
+
const activeQuery = this._queryStack[lastStackIndex];
|
|
156
|
+
if (undefined === activeQuery.siblingQueries)
|
|
157
|
+
activeQuery.siblingQueries = [];
|
|
158
|
+
const newQuery = this._extension.createQuery();
|
|
159
|
+
activeQuery.siblingQueries.push(newQuery);
|
|
160
|
+
this._extension.beginQuery(newQuery);
|
|
141
161
|
}
|
|
142
162
|
}
|
|
143
163
|
//# sourceMappingURL=GLTimer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GLTimer.js","sourceRoot":"","sources":["../../../../src/render/webgl/GLTimer.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { BentleyStatus } from \"@itwin/core-bentley\";\nimport { IModelError } from \"@itwin/core-common\";\nimport { GLTimerResult, GLTimerResultCallback } from \"../RenderSystem\";\nimport { System } from \"./System\";\n\nclass DisjointTimerExtension {\n private _e: any; // EXT_disjoint_timer_query, not available in lib.dom.d.ts\n private _context: WebGL2RenderingContext;\n\n public constructor(system: System) {\n this._e = system.disjointTimerQuery;\n this._context = system.context;\n }\n\n public get isSupported(): boolean { return this._e !== undefined; }\n\n public didDisjointEventHappen(): boolean {\n return this._context.getParameter(this._e.GPU_DISJOINT_EXT);\n }\n\n public createQuery(): WebGLQuery { return this._context.createQuery() as WebGLQuery; }\n public deleteQuery(q: WebGLQuery) { this._context.deleteQuery(q); }\n\n public beginQuery(q: WebGLQuery) { this._context.beginQuery(this._e.TIME_ELAPSED_EXT, q); }\n public endQuery() { this._context.endQuery(this._e.TIME_ELAPSED_EXT); }\n\n public isResultAvailable(q: WebGLQuery): boolean {\n return this._context.getQueryParameter(q, this._context.QUERY_RESULT_AVAILABLE);\n }\n public getResult(q: WebGLQuery): number {\n return this._context.getQueryParameter(q, this._context.QUERY_RESULT);\n }\n}\n\ninterface QueryEntry {\n label: string;\n query: WebGLQuery;\n children?: QueryEntry[];\n}\n\n/** Record GPU hardware queries to profile independent of CPU.\n *\n * This is a wrapper around EXT_disjoint_timer_query. The extension should be available in the following browsers:\n * * Chrome 67 and later\n * * Chromium-based Edge\n * * Firefox (with webgl.enable-privileged-extensions set to true in about:config)\n *\n * EXT_disjoint_timer_query only supports one active query per context without nesting. This wrapper keeps an internal stack to make\n * nesting work.\n *\n * The extension API makes timestamps look like a better solution than disjoint timers, but they are not actually supported.\n * See https://bugs.chromium.org/p/chromium/issues/detail?id=595172\n * @internal\n */\nexport class GLTimer {\n private _extension: DisjointTimerExtension;\n private _queryStack: QueryEntry[];\n private _resultsCallback?: GLTimerResultCallback;\n\n private constructor(system: System) {\n this._extension = new DisjointTimerExtension(system);\n this._queryStack = [];\n this._resultsCallback = undefined;\n }\n\n // This class is necessarily a singleton per context because of the underlying extension it wraps.\n // System is expected to call create in its constructor.\n public static create(system: System): GLTimer {\n return new GLTimer(system);\n }\n\n public get isSupported(): boolean { return this._extension.isSupported; }\n\n public set resultsCallback(callback: GLTimerResultCallback | undefined) {\n if (this._queryStack.length !== 0)\n throw new IModelError(BentleyStatus.ERROR, \"Do not set resultsCallback when a frame is already being drawn\");\n\n this._resultsCallback = callback;\n }\n\n public beginOperation(label: string) {\n if (!this._resultsCallback)\n return;\n\n this.pushQuery(label);\n }\n\n public endOperation() {\n if (!this._resultsCallback)\n return;\n if (this._queryStack.length === 0)\n throw new IModelError(BentleyStatus.ERROR, \"Mismatched calls to beginOperation/endOperation\");\n\n this.popQuery();\n }\n\n public beginFrame() {\n if (!this._resultsCallback)\n return;\n if (this._queryStack.length !== 0)\n throw new IModelError(BentleyStatus.ERROR, \"Already recording timing for a frame\");\n\n const query = this._extension.createQuery();\n this._extension.beginQuery(query);\n this._queryStack.push({ label: \"Total\", query, children: [] });\n }\n\n public endFrame() {\n if (!this._resultsCallback)\n return;\n if (this._queryStack.length !== 1)\n throw new IModelError(BentleyStatus.ERROR, \"Missing at least one endOperation call\");\n\n this._extension.endQuery();\n const root = this._queryStack.pop()!;\n const userCallback = this._resultsCallback;\n\n const queryCallback = () => {\n if (this._extension.didDisjointEventHappen()) {\n // Have to throw away results for this frame after disjoint event occurs.\n this.cleanupAfterDisjointEvent(root);\n return;\n }\n\n // It takes more one or more frames for results to become available.\n // Only checking time for root since it will always be the last query completed.\n if (!this._extension.isResultAvailable(root.query)) {\n setTimeout(queryCallback, 0);\n return;\n }\n\n const processQueryEntry = (queryEntry: QueryEntry): GLTimerResult => {\n const time = this._extension.getResult(queryEntry.query);\n this._extension.deleteQuery(queryEntry.query);\n\n const result: GLTimerResult = { label: queryEntry.label, nanoseconds: time };\n if (queryEntry.children === undefined)\n return result;\n\n result.children = [];\n for (const child of queryEntry.children) {\n const childResult = processQueryEntry(child);\n result.children.push(childResult);\n result.nanoseconds += childResult.nanoseconds;\n }\n return result;\n };\n\n userCallback(processQueryEntry(root));\n };\n setTimeout(queryCallback, 0);\n }\n\n private cleanupAfterDisjointEvent(queryEntry: QueryEntry) {\n this._extension.deleteQuery(queryEntry.query);\n if (!queryEntry.children)\n return;\n for (const child of queryEntry.children)\n this.cleanupAfterDisjointEvent(child);\n }\n\n private pushQuery(label: string) {\n this._extension.endQuery();\n\n const query = this._extension.createQuery();\n this._extension.beginQuery(query);\n\n const activeQuery = this._queryStack[this._queryStack.length - 1];\n const queryEntry: QueryEntry = { label, query };\n this._queryStack.push(queryEntry);\n\n if (activeQuery.children === undefined)\n activeQuery.children = [queryEntry];\n else\n activeQuery.children.push(queryEntry);\n }\n\n private popQuery() {\n this._extension.endQuery();\n this._queryStack.pop();\n\n const activeQuery = this._queryStack[this._queryStack.length - 1];\n this._extension.beginQuery(activeQuery.query);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"GLTimer.js","sourceRoot":"","sources":["../../../../src/render/webgl/GLTimer.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { BentleyStatus } from \"@itwin/core-bentley\";\nimport { IModelError } from \"@itwin/core-common\";\nimport { GLTimerResult, GLTimerResultCallback } from \"../RenderSystem\";\nimport { System } from \"./System\";\n\nclass DisjointTimerExtension {\n private _e: any; // EXT_disjoint_timer_query, not available in lib.dom.d.ts\n private _context: WebGL2RenderingContext;\n\n public constructor(system: System) {\n this._e = system.disjointTimerQuery;\n this._context = system.context;\n }\n\n public get isSupported(): boolean { return this._e !== undefined; }\n\n public didDisjointEventHappen(): boolean {\n return this._context.getParameter(this._e.GPU_DISJOINT_EXT);\n }\n\n public createQuery(): WebGLQuery { return this._context.createQuery() as WebGLQuery; }\n public deleteQuery(q: WebGLQuery) { this._context.deleteQuery(q); }\n\n public beginQuery(q: WebGLQuery) { this._context.beginQuery(this._e.TIME_ELAPSED_EXT, q); }\n public endQuery() { this._context.endQuery(this._e.TIME_ELAPSED_EXT); }\n\n public isResultAvailable(q: WebGLQuery): boolean {\n return this._context.getQueryParameter(q, this._context.QUERY_RESULT_AVAILABLE);\n }\n public getResult(q: WebGLQuery): number {\n return this._context.getQueryParameter(q, this._context.QUERY_RESULT);\n }\n}\n\ninterface QueryEntry {\n label: string;\n query: WebGLQuery;\n siblingQueries?: WebGLQuery[]; // For when the main query is broken up into pieces by intermittent child queries.\n children?: QueryEntry[];\n}\n\n/** Record GPU hardware queries to profile independent of CPU.\n *\n * This is a wrapper around EXT_disjoint_timer_query. The extension should be available in the following browsers:\n * * Chrome 67 and later\n * * Chromium-based Edge\n * * Firefox (with webgl.enable-privileged-extensions set to true in about:config)\n *\n * EXT_disjoint_timer_query only supports one active query per context without nesting. This wrapper keeps an internal stack to make\n * nesting work.\n *\n * The extension API makes timestamps look like a better solution than disjoint timers, but they are not actually supported.\n * See https://bugs.chromium.org/p/chromium/issues/detail?id=595172\n * @internal\n */\nexport class GLTimer {\n private _extension: DisjointTimerExtension;\n private _queryStack: QueryEntry[];\n private _resultsCallback?: GLTimerResultCallback;\n\n private constructor(system: System) {\n this._extension = new DisjointTimerExtension(system);\n this._queryStack = [];\n this._resultsCallback = undefined;\n }\n\n // This class is necessarily a singleton per context because of the underlying extension it wraps.\n // System is expected to call create in its constructor.\n public static create(system: System): GLTimer {\n return new GLTimer(system);\n }\n\n public get isSupported(): boolean { return this._extension.isSupported; }\n\n public set resultsCallback(callback: GLTimerResultCallback | undefined) {\n if (this._queryStack.length !== 0)\n throw new IModelError(BentleyStatus.ERROR, \"Do not set resultsCallback when a frame is already being drawn\");\n\n this._resultsCallback = callback;\n }\n\n public beginOperation(label: string) {\n if (!this._resultsCallback)\n return;\n\n this.pushQuery(label);\n }\n\n public endOperation() {\n if (!this._resultsCallback)\n return;\n if (this._queryStack.length === 0)\n throw new IModelError(BentleyStatus.ERROR, \"Mismatched calls to beginOperation/endOperation\");\n\n this.popQuery();\n }\n\n public beginFrame() {\n if (!this._resultsCallback)\n return;\n if (this._queryStack.length !== 0)\n throw new IModelError(BentleyStatus.ERROR, \"Already recording timing for a frame\");\n\n const query = this._extension.createQuery();\n this._extension.beginQuery(query);\n this._queryStack.push({ label: \"Total\", query, children: [] });\n }\n\n public endFrame() {\n if (!this._resultsCallback)\n return;\n if (this._queryStack.length !== 1)\n throw new IModelError(BentleyStatus.ERROR, \"Missing at least one endOperation call\");\n\n this._extension.endQuery();\n const root = this._queryStack.pop()!;\n const userCallback = this._resultsCallback;\n\n const queryCallback = () => {\n if (this._extension.didDisjointEventHappen()) {\n // Have to throw away results for this frame after disjoint event occurs.\n this.cleanupAfterDisjointEvent(root);\n return;\n }\n\n // It takes one or more frames for results to become available.\n // Only checking time for root since it will always be the last query completed.\n // If there are any sibling queries then we will just check the last one.\n const finalQuery = (undefined === root.siblingQueries ? root.query : root.siblingQueries[root.siblingQueries.length-1]);\n if (!this._extension.isResultAvailable(finalQuery)) {\n setTimeout(queryCallback, 0);\n return;\n }\n\n const processQueryEntry = (queryEntry: QueryEntry): GLTimerResult => {\n const time = this._extension.getResult(queryEntry.query);\n this._extension.deleteQuery(queryEntry.query);\n\n const result: GLTimerResult = { label: queryEntry.label, nanoseconds: time };\n\n if (undefined !== queryEntry.siblingQueries) {\n for (const sib of queryEntry.siblingQueries) {\n const sibTime = this._extension.getResult(sib);\n this._extension.deleteQuery(sib);\n result.nanoseconds += sibTime;\n }\n queryEntry.siblingQueries = undefined;\n }\n\n if (queryEntry.children === undefined)\n return result;\n\n result.children = [];\n for (const child of queryEntry.children) {\n const childResult = processQueryEntry(child);\n result.children.push(childResult);\n result.nanoseconds += childResult.nanoseconds;\n }\n return result;\n };\n\n userCallback(processQueryEntry(root));\n };\n setTimeout(queryCallback, 0);\n }\n\n private cleanupAfterDisjointEvent(queryEntry: QueryEntry) {\n this._extension.deleteQuery(queryEntry.query);\n if (undefined !== queryEntry.siblingQueries) {\n for (const sib of queryEntry.siblingQueries)\n this._extension.deleteQuery(sib);\n queryEntry.siblingQueries = undefined;\n }\n if (!queryEntry.children)\n return;\n for (const child of queryEntry.children)\n this.cleanupAfterDisjointEvent(child);\n }\n\n private pushQuery(label: string) {\n this._extension.endQuery();\n\n const query = this._extension.createQuery();\n this._extension.beginQuery(query);\n\n const activeQuery = this._queryStack[this._queryStack.length - 1];\n const queryEntry: QueryEntry = { label, query };\n this._queryStack.push(queryEntry);\n\n if (activeQuery.children === undefined)\n activeQuery.children = [queryEntry];\n else\n activeQuery.children.push(queryEntry);\n }\n\n private popQuery() {\n this._extension.endQuery();\n this._queryStack.pop();\n\n const lastStackIndex = this._queryStack.length - 1;\n const activeQuery = this._queryStack[lastStackIndex];\n if (undefined === activeQuery.siblingQueries)\n activeQuery.siblingQueries = [];\n const newQuery = this._extension.createQuery();\n activeQuery.siblingQueries.push(newQuery);\n this._extension.beginQuery(newQuery);\n }\n}\n"]}
|