diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3172d06..d4c7f8f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,21 +4,24 @@ on: [push, pull_request] jobs: check: - runs-on: ubuntu-latest + runs-on: windows-latest steps: - name: Clone repository uses: actions/checkout@v3 - name: Install Deno - uses: denoland/setup-deno@v1 + uses: denoland/setup-deno@v2 with: - deno-version: v1.x + deno-version: v2.x - name: Check formatting run: deno fmt --check + shell: "bash" - name: Lint run: deno lint + shell: "bash" - name: Run run: deno task run + shell: "bash" diff --git a/boids/output.png b/boids/output.png index 939ebb5..b75285a 100644 Binary files a/boids/output.png and b/boids/output.png differ diff --git a/framework.ts b/framework.ts index a37a7fc..8c0e13a 100644 --- a/framework.ts +++ b/framework.ts @@ -4,6 +4,7 @@ import { createCapture } from "std/webgpu"; export class Framework { device: GPUDevice; dimensions: Dimensions; + errors: GPUError[] = []; static async getDevice({ requiredFeatures, @@ -26,16 +27,15 @@ export class Framework { throw new Error("no suitable adapter found"); } - device.addEventListener("uncaughterror", (e) => { - throw e.error; - }); - return device; } constructor(dimensions: Dimensions, device: GPUDevice) { this.dimensions = dimensions; this.device = device; + device.addEventListener("uncapturederror", (e) => { + this.errors.push(e.error); + }); } async init() {} @@ -54,5 +54,9 @@ export class Framework { this.device.queue.submit([encoder.finish()]); await createPng(outputBuffer, this.dimensions); + + if (this.errors.length > 0) { + throw new AggregateError(this.errors, "uncaught gpu errors"); + } } } diff --git a/run.ts b/run.ts index 8063663..57c3f95 100644 --- a/run.ts +++ b/run.ts @@ -2,7 +2,7 @@ import $ from "dax"; for await (const entry of $.path(".").readDir()) { if (entry.isDirectory && !entry.name.startsWith(".")) { - await $`deno run --allow-read=. --allow-write=. --unstable-webgpu mod.ts` + await $`deno run --allow-read=. --allow-write=. --allow-import=deno.land,crux.land,jsr.io mod.ts` .cwd( entry.path, ); diff --git a/shadow/output.png b/shadow/output.png index dad2c6f..8ae9d90 100644 Binary files a/shadow/output.png and b/shadow/output.png differ diff --git a/shadow/shader.wgsl b/shadow/shader.wgsl index b2bdae8..9de624b 100644 --- a/shadow/shader.wgsl +++ b/shadow/shader.wgsl @@ -35,7 +35,7 @@ fn vs_main( let w = u_entity.world; let world_pos = u_entity.world * vec4(position); var result: VertexOutput; - result.world_normal = mat3x3(w.x.xyz, w.y.xyz, w.z.xyz) * vec3(normal.xyz); + result.world_normal = mat3x3(w[0].xyz, w[1].xyz, w[2].xyz) * vec3(normal.xyz); result.world_position = world_pos; result.proj_position = u_globals.view_proj * world_pos; return result; diff --git a/skybox/output.png b/skybox/output.png index 9355cc1..6f9f0c1 100644 Binary files a/skybox/output.png and b/skybox/output.png differ diff --git a/skybox/shader.wgsl b/skybox/shader.wgsl index fcc8caf..deb6715 100644 --- a/skybox/shader.wgsl +++ b/skybox/shader.wgsl @@ -30,7 +30,7 @@ fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput { ); // transposition = inversion for this orthonormal matrix - let inv_model_view = transpose(mat3x3(r_data.view.x.xyz, r_data.view.y.xyz, r_data.view.z.xyz)); + let inv_model_view = transpose(mat3x3(r_data.view[0].xyz, r_data.view[1].xyz, r_data.view[2].xyz)); let unprojected = r_data.proj_inv * pos; var result: SkyOutput;