Skip to content

Commit

Permalink
Remove Render from classes and separate into own class
Browse files Browse the repository at this point in the history
  • Loading branch information
s-macke committed Sep 23, 2023
1 parent 9fb95be commit 1dca365
Show file tree
Hide file tree
Showing 10 changed files with 147 additions and 140 deletions.
6 changes: 6 additions & 0 deletions src/scripts/AbstractGPURunner.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import {Texture} from "./webgpu/texture";

export enum RunnerType {
HTML = 1,
Expand All @@ -8,6 +9,7 @@ export enum RunnerType {
export interface GPURunner {
getType(): RunnerType;
getHTML(): string;
getRenderInfo(): {textures: Texture[], fragmentShaderFilenames: string[]};
getCommandBuffer(): GPUCommandBuffer;
Run(): Promise<void>;
Init(): Promise<void>;
Expand All @@ -27,4 +29,8 @@ export abstract class GPUAbstractRunner implements GPURunner {
getHTML(): string {
throw new Error("Method not implemented.");
}

getRenderInfo(): { textures: Texture[]; fragmentShaderFilenames: string[] } {
throw new Error("Method not implemented.");
}
}
45 changes: 45 additions & 0 deletions src/scripts/GPURenderRunner.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import {GPURunner, RunnerType} from "./AbstractGPURunner";
import {Render} from "./render/render";
import {Texture} from "./webgpu/texture";
import {GPU} from "./webgpu/gpu";

export class GPURenderRunner implements GPURunner {
runner: GPURunner
render: Render

constructor(runner: GPURunner) {
this.runner = runner
}

getHTML(): string {
return this.runner.getHTML()
}

getType(): RunnerType {
return this.runner.getType()
}

async Destroy() {
await this.render.Destroy()
await this.runner.Destroy()
}

async Init() {
await this.runner.Init()
let renderInfo = this.runner.getRenderInfo()
this.render = new Render(renderInfo.textures, ...renderInfo.fragmentShaderFilenames)
await this.render.Init()
}

async Run() {
GPU.device.queue.submit([this.runner.getCommandBuffer(), this.render.getCommandBuffer()])
}

getCommandBuffer(): GPUCommandBuffer {
throw new Error("Method not implemented.");
}

getRenderInfo(): { textures: Texture[]; fragmentShaderFilenames: string[] } {
throw new Error("Method not implemented.");
}
}
2 changes: 1 addition & 1 deletion src/scripts/GPURunner.ts → src/scripts/RunGPURunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import {Mutex} from "async-mutex";

let stop_immediately = true;

function ListenToError() {
export function ListenToError() {
GPU.device.addEventListener("uncapturederror", (event) => {
let e = event as GPUUncapturedErrorEvent
console.error("A WebGPU error was not captured", e.error);
Expand Down
14 changes: 9 additions & 5 deletions src/scripts/diffuse/diffuse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ export class Diffuse extends GPUAbstractRunner {

texturesrc: Texture;
texturedest: Texture;
render: Render;

bind_group_layout: GPUBindGroupLayout
bind_group_layout_mesh: GPUBindGroupLayout
Expand Down Expand Up @@ -52,7 +51,6 @@ export class Diffuse extends GPUAbstractRunner {
}

override async Destroy() {
await this.render.Destroy()
this.texturesrc.destroy()
this.texturedest.destroy()
this.vertexBuffer.destroy()
Expand Down Expand Up @@ -157,8 +155,6 @@ export class Diffuse extends GPUAbstractRunner {
this.texturesrc = GPU.CreateStorageTexture(this.width, this.height, "rgba32float")
this.texturedest = GPU.CreateStorageTexture(this.width, this.height, "rgba32float")

this.render = new Render([this.texturedest], "scripts/diffuse/aces-tone-mapping.wgsl")
await this.render.Init()

this.stagingBuffer = GPU.CreateUniformBuffer(4 * 4) // must be a multiple of 16 bytes
this.stagingData = new Float32Array(4)
Expand Down Expand Up @@ -278,7 +274,15 @@ export class Diffuse extends GPUAbstractRunner {
}

override async Run() {
GPU.device.queue.submit([this.getCommandBuffer(), this.render.getCommandBuffer()])
GPU.device.queue.submit([this.getCommandBuffer()])
await GPU.device.queue.onSubmittedWorkDone()
}

override getRenderInfo(): { textures: Texture[]; fragmentShaderFilenames: string[] } {
return {
textures: [this.texturedest],
fragmentShaderFilenames: ["scripts/diffuse/aces-tone-mapping.wgsl"]
}
}

}
14 changes: 0 additions & 14 deletions src/scripts/fluid/render/render.frag.wgsl
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,10 @@ struct VertexOutput {
@builtin(position) Position : vec4<f32>,
@location(0) fragUV : vec2<f32>
};
/*
[[stage(fragment)]]
fn main(data: VertexOutput) -> [[location(0)]] vec4<f32> {
return textureSample(myTexture, mySampler, data.fragUV);
}
*/

@fragment
fn main(data: VertexOutput) -> @location(0) vec4<f32> {
var d: vec2<f32> = vec2<f32>(textureDimensions(myTexture, 0));
let c = textureLoad(myTexture, vec2<i32>(data.fragUV*d), 0).rgb;
return vec4<f32>(abs(c), 1.);
//return vec4<f32>(c.r, -c.r, 0., 1.);
}

/*
[[stage(fragment)]]
fn main([[location(0)]] fragUV: vec2<f32>) -> [[location(0)]] vec4<f32> {
return vec4<f32>(fragUV.x, 0.0, 0.0, 1.0);
}
*/
31 changes: 0 additions & 31 deletions src/scripts/light/light.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,12 @@ import {Texture} from "../webgpu/texture";
import {Buffer} from "../webgpu/buffer";
import {GPUAbstractRunner, RunnerType} from "../AbstractGPURunner";
import {Render} from "../render/render";
import {Raytrace} from "../raytrace/raytrace";
import {SDF} from "../sdf/sdf";

export class LightPropagation extends GPUAbstractRunner {
width: number
height: number

render: Render
sdf: SDF
raytrace: Raytrace
textureSignedDistance: Texture

textureDest: Texture
textureSrc: Texture
Expand All @@ -48,35 +43,9 @@ export class LightPropagation extends GPUAbstractRunner {
async Destroy() {
this.textureDest.destroy()
this.textureSrc.destroy()
/*
await this.sdf.Destroy()
await this.raytrace.Destroy()
*/
}

async Init() {
/*
this.raytrace = new Raytrace("fbm.wgsl", false)
try {
await this.raytrace.Init()
await this.raytrace.Run()
} catch (e) {
ShowError("Creation of FBM failed", e as Error)
throw e
}
this.sdf = new SDF(this.raytrace.texturedest)
try {
await this.sdf.Init()
for(let i = 0; i < 256; i++) {
await this.sdf.Run()
}
} catch (e) {
ShowError("Creation of SDF failed", e as Error)
throw e
}
//this.textureSignedDistance = await GPU.createTextureFromTexture(this.sdf.texturea, "rgba16float")
this.textureSignedDistance = this.sdf.texturea
*/
console.log("Create Texture")
this.textureDest = GPU.CreateStorageTextureArray(this.width, this.height, 3, "rgba16float")
this.textureSrc = GPU.CreateStorageTextureArray(this.width, this.height, 3, "rgba16float")
Expand Down
51 changes: 22 additions & 29 deletions src/scripts/raytrace/raytrace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ import {GPUAbstractRunner, RunnerType} from "../AbstractGPURunner";
import {Render} from "../render/render";

export class Raytrace extends GPUAbstractRunner {
width: number;
height: number;
width: number
height: number

texturesrc: Texture;
texturedest: Texture;
render: Render;
texturesrc: Texture
texturedest: Texture
render: Render

bind_group_layout: GPUBindGroupLayout
bind_group: GPUBindGroup
Expand All @@ -20,16 +20,13 @@ export class Raytrace extends GPUAbstractRunner {
stagingBuffer: Buffer
stagingData: Float32Array

filename: string;
filename: string
fragmentShaderFilename: string

showOnScreen: boolean;
fragmentShaderFilename: string;
startTime: number

startTime: number;

constructor(filename: string, showOnScreen: boolean, fragmentShaderFilename: string = null) {
constructor(filename: string, fragmentShaderFilename: string = null) {
super();
this.showOnScreen = showOnScreen
this.filename = filename
this.width = GPU.viewport.width
this.height = GPU.viewport.height
Expand All @@ -41,9 +38,6 @@ export class Raytrace extends GPUAbstractRunner {
}

override async Destroy() {
if (this.showOnScreen) {
await this.render.Destroy()
}
this.texturesrc.destroy()
this.texturedest.destroy()
}
Expand All @@ -53,15 +47,6 @@ export class Raytrace extends GPUAbstractRunner {
this.texturesrc = GPU.CreateStorageTexture(this.width, this.height, "rgba32float")
this.texturedest = GPU.CreateStorageTexture(this.width, this.height, "rgba32float")

if (this.showOnScreen) {
if (this.fragmentShaderFilename === null) {
this.render = new Render([this.texturedest])
} else {
this.render = new Render([this.texturedest], "scripts/raytrace/" + this.fragmentShaderFilename)
}
await this.render.Init()
}

this.stagingBuffer = GPU.CreateUniformBuffer(4*3 + 4) // must be a multiple of 16 bytes
this.stagingData = new Float32Array(4)

Expand Down Expand Up @@ -112,7 +97,19 @@ export class Raytrace extends GPUAbstractRunner {
})

this.startTime = new Date().getTime();
}

override getRenderInfo(): { textures: Texture[]; fragmentShaderFilenames: string[] } {
if (this.fragmentShaderFilename == null) {
return {
textures: [this.texturedest],
fragmentShaderFilenames: []
}
}
return {
textures: [this.texturedest],
fragmentShaderFilenames: ["scripts/raytrace/" + this.fragmentShaderFilename]
}
}

previousMouseCoordinatex: number = 0
Expand Down Expand Up @@ -145,11 +142,7 @@ export class Raytrace extends GPUAbstractRunner {
}

override async Run() {
if (this.showOnScreen) {
GPU.device.queue.submit([this.getCommandBuffer(), this.render.getCommandBuffer()])
} else {
GPU.device.queue.submit([this.getCommandBuffer()])
}
GPU.device.queue.submit([this.getCommandBuffer()])
await GPU.device.queue.onSubmittedWorkDone()
}
}
28 changes: 13 additions & 15 deletions src/scripts/render/render.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,12 @@ import {Texture} from "../webgpu/texture";
import {GPUAbstractRunner, RunnerType} from "../AbstractGPURunner";

export class Render extends GPUAbstractRunner {
bind_group_layout: GPUBindGroupLayout;
bind_group: GPUBindGroup;
pipeline_layout: GPUPipelineLayout;
pipeline: GPURenderPipeline;
textures: Texture[];

fragmentShaderFilenames: string[];
bind_group_layout: GPUBindGroupLayout
bind_group: GPUBindGroup
pipeline_layout: GPUPipelineLayout
pipeline: GPURenderPipeline
textures: Texture[]
fragmentShaderFilenames: string[]

constructor(textures: Texture[], ...fragmentShaderFilenames: string[]) {
super();
Expand All @@ -21,7 +20,6 @@ export class Render extends GPUAbstractRunner {
return RunnerType.GRAPHIC
}


override async Destroy() {
}

Expand Down Expand Up @@ -101,16 +99,16 @@ export class Render extends GPUAbstractRunner {
topology: "triangle-strip",
stripIndexFormat: "uint32"
}
});
})
}

override getCommandBuffer(): GPUCommandBuffer {
const commandEncoder = GPU.device.createCommandEncoder({});
const passEncoder = commandEncoder.beginRenderPass(GPU.getRenderPassDescriptor());
passEncoder.setPipeline(this.pipeline);
passEncoder.setBindGroup(0, this.bind_group);
passEncoder.draw(4, 1, 0, 0);
passEncoder.end();
const commandEncoder = GPU.device.createCommandEncoder({})
const passEncoder = commandEncoder.beginRenderPass(GPU.getRenderPassDescriptor())
passEncoder.setPipeline(this.pipeline)
passEncoder.setBindGroup(0, this.bind_group)
passEncoder.draw(4, 1, 0, 0)
passEncoder.end()
return commandEncoder.finish()
}

Expand Down
Loading

0 comments on commit 1dca365

Please sign in to comment.