From 46dfb69c0afa59a5b9afff7edbdf576bdf8f4552 Mon Sep 17 00:00:00 2001 From: Sebastian Macke Date: Thu, 27 Jun 2024 00:10:43 +0200 Subject: [PATCH] Queue should never run full and remove async on render routine --- src/scripts/AbstractGPURunner.ts | 4 +-- src/scripts/GPURenderRunner.ts | 2 +- src/scripts/RunGPURunner.ts | 25 +++++++++++++------ src/scripts/fluid/fluid.ts | 2 +- src/scripts/light/light.ts | 2 +- src/scripts/light2/light.ts | 2 +- .../light_monte_carlo_path_tracing/light.ts | 2 +- 7 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/scripts/AbstractGPURunner.ts b/src/scripts/AbstractGPURunner.ts index eb5955d..5ef0b8a 100644 --- a/src/scripts/AbstractGPURunner.ts +++ b/src/scripts/AbstractGPURunner.ts @@ -13,7 +13,7 @@ export interface GPURunner { getRenderInfo(): {textures: Texture[], fragmentShaderFilenames: string[]}; getCommandBuffer(): GPUCommandBuffer; Run(): Promise; - Render(): Promise; + Render(): void; Init(): Promise; Destroy(): Promise; } @@ -24,7 +24,7 @@ export abstract class GPUAbstractRunner implements GPURunner { public abstract Init(): Promise public abstract Run(): Promise - Render(): Promise { + Render() { throw new Error("Method not implemented."); } diff --git a/src/scripts/GPURenderRunner.ts b/src/scripts/GPURenderRunner.ts index f318c9b..17b2223 100644 --- a/src/scripts/GPURenderRunner.ts +++ b/src/scripts/GPURenderRunner.ts @@ -11,7 +11,7 @@ export class GPURenderRunner implements GPURunner { this.runner = runner } - async Render() { + Render() { GPU.device.queue.submit([this.render.getCommandBuffer()]) } diff --git a/src/scripts/RunGPURunner.ts b/src/scripts/RunGPURunner.ts index 2ed603d..ccda00c 100644 --- a/src/scripts/RunGPURunner.ts +++ b/src/scripts/RunGPURunner.ts @@ -33,7 +33,7 @@ async function SwitchToGraphic() { document.getElementById("screen").style.height = "100%" } -async function InitRunner(runner: GPURunner) : Promise { +async function InitRunner(runner: GPURunner): Promise { stop_immediately = false; try { await runner.Init() @@ -89,7 +89,7 @@ async function HandleAnimation(runner: GPURunner) { let frame = async () => { try { await runner.Run() - await runner.Render() + runner.Render() await GPU.device.queue.onSubmittedWorkDone() } catch (e) { ShowError("GPU error", e as Error) @@ -117,7 +117,7 @@ async function HandleAsyncAnimation(runner: GPURunner) { // never return from this function unless the animation is stopped await new Promise(async resolve => { let nIter = 0 - let queuePartFinished = async() => { + let queuePartFinished = async () => { if (stop_immediately) { return } @@ -126,12 +126,22 @@ async function HandleAsyncAnimation(runner: GPURunner) { GPU.device.queue.onSubmittedWorkDone().then(() => queuePartFinished()) } // fill the queue - queuePartFinished().then(r => {}) - queuePartFinished().then(r => {}) + queuePartFinished().then(r => { + }) + queuePartFinished().then(r => { + }) + let renderFinished = true let frame = async () => { try { - await runner.Render() + // don't Render if old render is not yet finished + if (renderFinished) { + runner.Render() + renderFinished = false + GPU.device.queue.onSubmittedWorkDone().then(() => { + renderFinished = true + }) + } } catch (e) { ShowError("GPU error", e as Error) await runner.Destroy() @@ -180,7 +190,6 @@ async function HandleBenchmark(runner: GPURunner) { } - let mutex = Promise.resolve(); export async function HandleRunner(runner: GPURunner) { @@ -194,7 +203,7 @@ export async function HandleRunner(runner: GPURunner) { await ResetHTML() ListenToError(); - if (! await InitRunner(runner)) return Promise.resolve(); + if (!await InitRunner(runner)) return Promise.resolve(); const type = runner.getType() switch (type) { diff --git a/src/scripts/fluid/fluid.ts b/src/scripts/fluid/fluid.ts index 3b2bdfe..f3bfa17 100644 --- a/src/scripts/fluid/fluid.ts +++ b/src/scripts/fluid/fluid.ts @@ -124,7 +124,7 @@ export class Fluid extends GPUAbstractRunner { //await GPU.Render(this.poisson.pressurea); } - async Render() { + Render() { GPU.device.queue.submit([ this.render.GetCommandBuffer() ]) diff --git a/src/scripts/light/light.ts b/src/scripts/light/light.ts index 6e4f0e8..814ce16 100644 --- a/src/scripts/light/light.ts +++ b/src/scripts/light/light.ts @@ -173,7 +173,7 @@ export class LightPropagation extends GPUAbstractRunner { GPU.device.queue.submit([this.scene.GetCommandBuffer(), this.GetCommandBuffer()]); } - async Render() { + Render() { GPU.device.queue.submit([this.render.getCommandBuffer()]); } } diff --git a/src/scripts/light2/light.ts b/src/scripts/light2/light.ts index 6f55bb3..35df186 100644 --- a/src/scripts/light2/light.ts +++ b/src/scripts/light2/light.ts @@ -199,7 +199,7 @@ export class LightPropagation2 extends GPUAbstractRunner { GPU.device.queue.submit([this.scene.GetCommandBuffer(), this.GetCommandBuffer()]); } - async Render() { + Render() { GPU.device.queue.submit([this.render.getCommandBuffer()]); } } diff --git a/src/scripts/light_monte_carlo_path_tracing/light.ts b/src/scripts/light_monte_carlo_path_tracing/light.ts index 6a260c5..c84f278 100644 --- a/src/scripts/light_monte_carlo_path_tracing/light.ts +++ b/src/scripts/light_monte_carlo_path_tracing/light.ts @@ -195,7 +195,7 @@ export class LightMonteCarloPathTracing extends GPUAbstractRunner { GPU.device.queue.submit([this.scene.GetCommandBuffer(), this.GetCommandBuffer()]); } - async Render() { + Render() { GPU.device.queue.submit([this.render.getCommandBuffer()]); }