@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.
@@ -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;AAqClC;;;;;;;;;;;;;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;IA8Cf,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,QAAQ;CAOjB"}
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 more one or more frames for results to become available.
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
- if (!this._extension.isResultAvailable(root.query)) {
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 activeQuery = this._queryStack[this._queryStack.length - 1];
143
- this._extension.beginQuery(activeQuery.query);
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;AAqClC;;;;;;;;;;;;;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;IA8Cf,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,QAAQ;CAOjB"}
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 more one or more frames for results to become available.
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
- if (!this._extension.isResultAvailable(root.query)) {
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 activeQuery = this._queryStack[this._queryStack.length - 1];
140
- this._extension.beginQuery(activeQuery.query);
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"]}