Fix on Chrome, which doesn't support WebGL queries

This commit is contained in:
Patrick Walton 2018-03-20 19:40:28 -07:00
parent 96d2f909ea
commit 5e5148df54
3 changed files with 36 additions and 16 deletions

View File

@ -17,7 +17,7 @@ import {TileInfo} from './aa-strategy';
import {NoAAStrategy, StemDarkeningMode, SubpixelAAType} from './aa-strategy';
import {AAOptions} from './app-controller';
import PathfinderBufferTexture from "./buffer-texture";
import {UniformMap} from './gl-utils';
import {UniformMap, WebGLQuery} from './gl-utils';
import {PathfinderPackedMeshBuffers, PathfinderPackedMeshes} from "./meshes";
import {ShaderMap} from './shader-loader';
import {FLOAT32_SIZE, Range, UINT16_SIZE, UINT32_SIZE, unwrapNull, unwrapUndef} from './utils';
@ -146,7 +146,9 @@ export abstract class Renderer {
this.clearDestFramebuffer();
// Start timing rendering.
if (this.timerQueryPollInterval == null) {
if (this.timerQueryPollInterval == null &&
renderContext.timerQueryExt != null &&
renderContext.atlasRenderingTimerQuery != null) {
renderContext.timerQueryExt.beginQueryEXT(renderContext.timerQueryExt.TIME_ELAPSED_EXT,
renderContext.atlasRenderingTimerQuery);
}
@ -180,13 +182,16 @@ export abstract class Renderer {
// End the timer, and start a new one.
// FIXME(pcwalton): This is kinda bogus for multipass.
if (this.timerQueryPollInterval == null && objectIndex === objectCount - 1 &&
pass === passCount - 1) {
if (this.timerQueryPollInterval == null &&
objectIndex === objectCount - 1 &&
pass === passCount - 1 &&
renderContext.timerQueryExt != null &&
renderContext.compositingTimerQuery != null) {
renderContext.timerQueryExt
.endQueryEXT(renderContext.timerQueryExt.TIME_ELAPSED_EXT);
renderContext.timerQueryExt
.beginQueryEXT(renderContext.timerQueryExt.TIME_ELAPSED_EXT,
renderContext.compositingTimerQuery);
renderContext.compositingTimerQuery);
}
// Perform post-antialiasing tasks.
@ -590,16 +595,26 @@ export abstract class Renderer {
private finishTiming(): void {
const renderContext = this.renderContext;
if (this.timerQueryPollInterval != null)
if (this.timerQueryPollInterval != null ||
renderContext.timerQueryExt == null ||
renderContext.atlasRenderingTimerQuery == null ||
renderContext.compositingTimerQuery == null) {
return;
}
renderContext.timerQueryExt.endQueryEXT(renderContext.timerQueryExt.TIME_ELAPSED_EXT);
this.timerQueryPollInterval = window.setInterval(() => {
if (renderContext.timerQueryExt == null ||
renderContext.atlasRenderingTimerQuery == null ||
renderContext.compositingTimerQuery == null) {
return;
}
for (const queryName of ['atlasRenderingTimerQuery', 'compositingTimerQuery'] as
Array<'atlasRenderingTimerQuery' | 'compositingTimerQuery'>) {
if (renderContext.timerQueryExt
.getQueryObjectEXT(renderContext[queryName],
.getQueryObjectEXT(renderContext[queryName] as WebGLQuery,
renderContext.timerQueryExt
.QUERY_RESULT_AVAILABLE_EXT) ===
0) {

View File

@ -148,15 +148,15 @@ export abstract class DemoView extends PathfinderView implements RenderContext {
instancedArraysExt!: ANGLE_instanced_arrays;
textureHalfFloatExt!: OESTextureHalfFloat;
timerQueryExt!: EXTDisjointTimerQuery;
timerQueryExt!: EXTDisjointTimerQuery | null;
vertexArrayObjectExt!: OESVertexArrayObject;
quadPositionsBuffer!: WebGLBuffer;
quadTexCoordsBuffer!: WebGLBuffer;
quadElementsBuffer!: WebGLBuffer;
atlasRenderingTimerQuery!: WebGLQuery;
compositingTimerQuery!: WebGLQuery;
atlasRenderingTimerQuery!: WebGLQuery | null;
compositingTimerQuery!: WebGLQuery | null;
meshes: PathfinderPackedMeshBuffers[];
meshData: PathfinderPackedMeshes[];
@ -295,8 +295,13 @@ export abstract class DemoView extends PathfinderView implements RenderContext {
this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, QUAD_ELEMENTS, this.gl.STATIC_DRAW);
// Set up our timer queries for profiling.
this.atlasRenderingTimerQuery = this.timerQueryExt.createQueryEXT();
this.compositingTimerQuery = this.timerQueryExt.createQueryEXT();
if (this.timerQueryExt != null) {
this.atlasRenderingTimerQuery = this.timerQueryExt.createQueryEXT();
this.compositingTimerQuery = this.timerQueryExt.createQueryEXT();
} else {
this.atlasRenderingTimerQuery = null;
this.compositingTimerQuery = null;
}
}
protected renderingFinished(): void {}
@ -369,7 +374,7 @@ export interface RenderContext {
readonly instancedArraysExt: ANGLEInstancedArrays;
readonly textureHalfFloatExt: OESTextureHalfFloat;
readonly timerQueryExt: EXTDisjointTimerQuery;
readonly timerQueryExt: EXTDisjointTimerQuery | null;
readonly vertexArrayObjectExt: OESVertexArrayObject;
readonly colorAlphaFormat: ColorAlphaFormat;
@ -381,8 +386,8 @@ export interface RenderContext {
readonly quadPositionsBuffer: WebGLBuffer;
readonly quadElementsBuffer: WebGLBuffer;
readonly atlasRenderingTimerQuery: WebGLQuery;
readonly compositingTimerQuery: WebGLQuery;
readonly atlasRenderingTimerQuery: WebGLQuery | null;
readonly compositingTimerQuery: WebGLQuery | null;
initQuadVAO(attributes: any): void;
setDirty(): void;

View File

@ -1,5 +1,5 @@
[package]
name = "gfx-utils"
name = "pathfinder_gfx_utils"
version = "0.1.0"
authors = ["Patrick Walton <pcwalton@mimiga.net>"]