Expose context lost simulator

This commit is contained in:
schmelczerandras 2020-10-27 11:08:31 +01:00
parent 32aebe9036
commit 69ad74ed73
8 changed files with 36 additions and 11 deletions

View file

@ -1,3 +1,4 @@
import { enableContextLostSimulator } from './graphics/graphics-library/helper/enable-context-lost-simulator';
import { ContextAwareRenderer } from './graphics/rendering/renderer/context-aware-renderer'; import { ContextAwareRenderer } from './graphics/rendering/renderer/context-aware-renderer';
import { StartupSettings } from './graphics/rendering/settings/startup-settings'; import { StartupSettings } from './graphics/rendering/settings/startup-settings';
import { DrawableDescriptor, Renderer } from './main'; import { DrawableDescriptor, Renderer } from './main';
@ -31,6 +32,9 @@ export async function compile(
descriptors: Array<DrawableDescriptor>, descriptors: Array<DrawableDescriptor>,
settingsOverrides: Partial<StartupSettings> = {} settingsOverrides: Partial<StartupSettings> = {}
): Promise<Renderer> { ): Promise<Renderer> {
if (settingsOverrides.enableContextLostSimulator) {
enableContextLostSimulator(canvas);
}
const renderer = new ContextAwareRenderer(canvas, descriptors, settingsOverrides); const renderer = new ContextAwareRenderer(canvas, descriptors, settingsOverrides);
await renderer.initializedPromise; await renderer.initializedPromise;
return renderer; return renderer;

View file

@ -1,3 +1,5 @@
import { formatLog } from '../../../helper/format-log';
/** @internal */ /** @internal */
let isEnabled = false; let isEnabled = false;
@ -14,12 +16,12 @@ export const enableContextLostSimulator = (canvas: HTMLCanvasElement) => {
const simulateContextLost = () => { const simulateContextLost = () => {
ext.loseContext(); ext.loseContext();
console.log('lost'); console.info(formatLog('context-lost-simulator', 'lost'));
const restoreTimeout = Math.random() * 500; const restoreTimeout = Math.random() * 500;
setTimeout(() => { setTimeout(() => {
ext.restoreContext(); ext.restoreContext();
console.log('restored'); console.info(formatLog('context-lost-simulator', 'restored'));
}, restoreTimeout); }, restoreTimeout);
setTimeout(() => simulateContextLost(), restoreTimeout + Math.random() * 500); setTimeout(() => simulateContextLost(), restoreTimeout + Math.random() * 500);

View file

@ -1,3 +1,4 @@
import { formatLog } from '../../helper/format-log';
import { numberToGlslFloat } from '../../helper/number-to-glsl-float'; import { numberToGlslFloat } from '../../helper/number-to-glsl-float';
import { wait } from '../../helper/wait'; import { wait } from '../../helper/wait';
import { tryEnableExtension } from './helper/enable-extension'; import { tryEnableExtension } from './helper/enable-extension';
@ -138,9 +139,12 @@ export class ParallelCompiler {
const line = Number.parseInt(match[1]); const line = Number.parseInt(match[1]);
const error = match[2]; const error = match[2];
console.error( console.error(
`Error: ${error}\nSource (line ${line}):\n${ formatLog(
shader.source.split('\n')[line - 1] 'parallel-compiler',
}` `Error: ${error}\nSource (line ${line}):\n${
shader.source.split('\n')[line - 1]
}`
)
); );
} }
throw new Error('Error while compiling shader'); throw new Error('Error while compiling shader');

View file

@ -1,6 +1,7 @@
import { ReadonlyVec2, vec2 } from 'gl-matrix'; import { ReadonlyVec2, vec2 } from 'gl-matrix';
import { Drawable } from '../../../drawables/drawable'; import { Drawable } from '../../../drawables/drawable';
import { DrawableDescriptor } from '../../../drawables/drawable-descriptor'; import { DrawableDescriptor } from '../../../drawables/drawable-descriptor';
import { formatLog } from '../../../helper/format-log';
import { RuntimeSettings } from '../settings/runtime-settings'; import { RuntimeSettings } from '../settings/runtime-settings';
import { StartupSettings } from '../settings/startup-settings'; import { StartupSettings } from '../settings/startup-settings';
import { Renderer } from './renderer'; import { Renderer } from './renderer';
@ -51,7 +52,6 @@ export class ContextAwareRenderer implements Renderer {
if (!e.message.includes('Context lost')) { if (!e.message.includes('Context lost')) {
throw e; throw e;
} }
console.warn(e.message);
} }
} }
@ -63,7 +63,6 @@ export class ContextAwareRenderer implements Renderer {
if (!e.message.includes('Context lost')) { if (!e.message.includes('Context lost')) {
throw e; throw e;
} }
console.warn(e.message);
} }
this.setRuntimeSettings(this.runtimeOverrides); this.setRuntimeSettings(this.runtimeOverrides);
@ -75,13 +74,12 @@ export class ContextAwareRenderer implements Renderer {
private handleContextLost(event: Event) { private handleContextLost(event: Event) {
this.isRendererReady = false; this.isRendererReady = false;
event.preventDefault(); event.preventDefault();
console.warn('Context lost'); console.warn(formatLog('context-aware-renderer', 'Context lost'));
} }
private handleContextRestored(event: Event) { private handleContextRestored(event: Event) {
event.preventDefault(); event.preventDefault();
console.info('Context restored'); console.info(formatLog('context-aware-renderer', 'Context restored'));
this.createRenderer(); this.createRenderer();
} }
@ -92,7 +90,6 @@ export class ContextAwareRenderer implements Renderer {
} catch (e) { } catch (e) {
if (e.message.includes('Context lost')) { if (e.message.includes('Context lost')) {
this.isRendererReady = false; this.isRendererReady = false;
console.warn(e.message);
return defaultValue; return defaultValue;
} }
throw e; throw e;

View file

@ -11,4 +11,5 @@ export const defaultStartupSettings: StartupSettings = {
backgroundColor: vec4.fromValues(1, 1, 1, 1), backgroundColor: vec4.fromValues(1, 1, 1, 1),
lightPenetrationRatio: 0.75, lightPenetrationRatio: 0.75,
enableStopwatch: false, enableStopwatch: false,
enableContextLostSimulator: false,
}; };

View file

@ -41,6 +41,13 @@ export interface StartupSettings {
*/ */
paletteSize: number; paletteSize: number;
/**
* Many context lost event will be simulated when enabled.
*
* Useful for testing.
*/
enableContextLostSimulator: boolean;
/** /**
* The default background color of the scene, can have transparency on every platform. * The default background color of the scene, can have transparency on every platform.
*/ */

6
src/helper/format-log.ts Normal file
View file

@ -0,0 +1,6 @@
/**
* @internal
*/
export const formatLog = (originator: string, message: any): string => {
return `[SDF-2D][${originator}]: ${message}`;
};

View file

@ -1,3 +1,4 @@
import { enableContextLostSimulator } from './graphics/graphics-library/helper/enable-context-lost-simulator';
import { FpsQualityAutoscaler } from './graphics/rendering/fps-quality-autoscaler'; import { FpsQualityAutoscaler } from './graphics/rendering/fps-quality-autoscaler';
import { ContextAwareRenderer } from './graphics/rendering/renderer/context-aware-renderer'; import { ContextAwareRenderer } from './graphics/rendering/renderer/context-aware-renderer';
import { RuntimeSettings } from './graphics/rendering/settings/runtime-settings'; import { RuntimeSettings } from './graphics/rendering/settings/runtime-settings';
@ -53,6 +54,9 @@ export async function runAnimation(
startupSettingOverrides: Partial<StartupSettings> = {}, startupSettingOverrides: Partial<StartupSettings> = {},
initialRuntimeSettingOverrides: Partial<RuntimeSettings> = {} initialRuntimeSettingOverrides: Partial<RuntimeSettings> = {}
): Promise<void> { ): Promise<void> {
if (startupSettingOverrides.enableContextLostSimulator) {
enableContextLostSimulator(canvas);
}
const renderer = new ContextAwareRenderer(canvas, descriptors, startupSettingOverrides); const renderer = new ContextAwareRenderer(canvas, descriptors, startupSettingOverrides);
const deltaTimeCalculator = new DeltaTimeCalculator(); const deltaTimeCalculator = new DeltaTimeCalculator();