From 13dcf3ff81ac7653de684f0f505825866ac53e51 Mon Sep 17 00:00:00 2001 From: MendyBerger <12537668+MendyBerger@users.noreply.github.com> Date: Thu, 11 Jun 2026 10:22:02 -0400 Subject: [PATCH] feat: webidl2wit can now generate async functions --- generate/Cargo.lock | 2 +- generate/Cargo.toml | 2 +- generate/webgpu-transforms.json | 62 +++++++++++---------------------- wit/webgpu.wit | 16 ++++----- 4 files changed, 31 insertions(+), 51 deletions(-) diff --git a/generate/Cargo.lock b/generate/Cargo.lock index 6b1c4cd..de13443 100644 --- a/generate/Cargo.lock +++ b/generate/Cargo.lock @@ -278,7 +278,7 @@ dependencies = [ [[package]] name = "webidl2wit" version = "0.1.1" -source = "git+https://github.com/wasi-gfx/webidl2wit?rev=5693d1151834fceddf0e4fd4b9288675a930388e#5693d1151834fceddf0e4fd4b9288675a930388e" +source = "git+https://github.com/wasi-gfx/webidl2wit?rev=f342f815af71e8c2c9d7eb57cee4c6d91e1cfdd5#f342f815af71e8c2c9d7eb57cee4c6d91e1cfdd5" dependencies = [ "anyhow", "hashlink", diff --git a/generate/Cargo.toml b/generate/Cargo.toml index 84b7c79..04b87e2 100644 --- a/generate/Cargo.toml +++ b/generate/Cargo.toml @@ -4,7 +4,7 @@ version = "0.1.0" edition = "2021" [dependencies] -webidl2wit = { git = "https://github.com/wasi-gfx/webidl2wit", rev = "5693d1151834fceddf0e4fd4b9288675a930388e" } +webidl2wit = { git = "https://github.com/wasi-gfx/webidl2wit", rev = "f342f815af71e8c2c9d7eb57cee4c6d91e1cfdd5" } weedle = "0.13.1" wit-transforms = { git = "https://github.com/wasi-gfx/wit-transforms", rev = "82bce93fa23d7e2232f85a46898bc62d225e8317" } wit-parser = "0.250" diff --git a/generate/webgpu-transforms.json b/generate/webgpu-transforms.json index 7c44b28..25d1653 100644 --- a/generate/webgpu-transforms.json +++ b/generate/webgpu-transforms.json @@ -1523,10 +1523,7 @@ "func-result": { "resource": "gpu-adapter", "func": "request-device" - }, - "unwrap-t": [ - "future" - ] + } } } }, @@ -1535,12 +1532,10 @@ "resource": "gpu-adapter", "func": "request-device", "new-result": { - "future": { - "result": { - "ok": "$_SUCCESS", - "err": { - "named": "request-device-error" - } + "result": { + "ok": "$_SUCCESS", + "err": { + "named": "request-device-error" } } } @@ -1601,10 +1596,7 @@ "func-result": { "resource": "gpu-device", "func": "create-compute-pipeline-async" - }, - "unwrap-t": [ - "future" - ] + } } } }, @@ -1613,12 +1605,10 @@ "resource": "gpu-device", "func": "create-compute-pipeline-async", "new-result": { - "future": { - "result": { - "ok": "$_SUCCESS", - "err": { - "named": "create-pipeline-error" - } + "result": { + "ok": "$_SUCCESS", + "err": { + "named": "create-pipeline-error" } } } @@ -1632,10 +1622,7 @@ "func-result": { "resource": "gpu-device", "func": "create-render-pipeline-async" - }, - "unwrap-t": [ - "future" - ] + } } } }, @@ -1644,12 +1631,10 @@ "resource": "gpu-device", "func": "create-render-pipeline-async", "new-result": { - "future": { - "result": { - "ok": "$_SUCCESS", - "err": { - "named": "create-pipeline-error" - } + "result": { + "ok": "$_SUCCESS", + "err": { + "named": "create-pipeline-error" } } } @@ -1787,10 +1772,7 @@ "func-result": { "resource": "gpu-device", "func": "pop-error-scope" - }, - "unwrap-t": [ - "future" - ] + } } } }, @@ -1799,12 +1781,10 @@ "resource": "gpu-device", "func": "pop-error-scope", "new-result": { - "future": { - "result": { - "ok": "$_SUCCESS", - "err": { - "named": "pop-error-scope-error" - } + "result": { + "ok": "$_SUCCESS", + "err": { + "named": "pop-error-scope-error" } } } @@ -1997,7 +1977,7 @@ ] }, { - "reason": "unmap throws if called while future returned by map-async is still pending. https://www.w3.org/TR/webgpu/#dom-gpubuffer-unmap", + "reason": "unmap throws if called while map-async is still pending. https://www.w3.org/TR/webgpu/#dom-gpubuffer-unmap", "operations": [ { "operation": { diff --git a/wit/webgpu.wit b/wit/webgpu.wit index 6c485ca..08368ae 100644 --- a/wit/webgpu.wit +++ b/wit/webgpu.wit @@ -25,7 +25,7 @@ interface webgpu { type-error, } resource gpu { - request-adapter: func(options: option) -> future>; + request-adapter: async func(options: option) -> option; get-preferred-canvas-format: func() -> gpu-texture-format; wgsl-language-features: func() -> wgsl-language-features; } @@ -33,7 +33,7 @@ interface webgpu { features: func() -> gpu-supported-features; limits: func() -> gpu-supported-limits; info: func() -> gpu-adapter-info; - request-device: func(descriptor: option) -> future>; + request-device: async func(descriptor: option) -> result; } resource gpu-adapter-info { vendor: func() -> string; @@ -124,7 +124,7 @@ interface webgpu { size: func() -> gpu-size64-out; usage: func() -> gpu-buffer-usage; map-state: func() -> gpu-buffer-map-state; - map-async: func(mode: gpu-map-mode, offset: option, size: option) -> result<_, map-async-error>; + map-async: async func(mode: gpu-map-mode, offset: option, size: option) -> result<_, map-async-error>; get-mapped-range-get-with-copy: func(offset: option, size: option) -> result, get-mapped-range-error>; unmap: func() -> result<_, unmap-error>; destroy: func(); @@ -341,8 +341,8 @@ interface webgpu { create-shader-module: func(descriptor: gpu-shader-module-descriptor) -> gpu-shader-module; create-compute-pipeline: func(descriptor: gpu-compute-pipeline-descriptor) -> gpu-compute-pipeline; create-render-pipeline: func(descriptor: gpu-render-pipeline-descriptor) -> gpu-render-pipeline; - create-compute-pipeline-async: func(descriptor: gpu-compute-pipeline-descriptor) -> future>; - create-render-pipeline-async: func(descriptor: gpu-render-pipeline-descriptor) -> future>; + create-compute-pipeline-async: async func(descriptor: gpu-compute-pipeline-descriptor) -> result; + create-render-pipeline-async: async func(descriptor: gpu-render-pipeline-descriptor) -> result; create-command-encoder: func(descriptor: option) -> gpu-command-encoder; create-render-bundle-encoder: func(descriptor: gpu-render-bundle-encoder-descriptor) -> gpu-render-bundle-encoder; create-query-set: func(descriptor: gpu-query-set-descriptor) -> result; @@ -350,7 +350,7 @@ interface webgpu { set-label: func(label: string); lost: func() -> future; push-error-scope: func(filter: gpu-error-filter); - pop-error-scope: func() -> future, pop-error-scope-error>>; + pop-error-scope: async func() -> result, pop-error-scope-error>; on-uncaptured-error: func() -> stream; } record gpu-device-descriptor { @@ -512,7 +512,7 @@ interface webgpu { } resource gpu-queue { submit: func(command-buffers: list>); - on-submitted-work-done: func() -> future; + on-submitted-work-done: async func(); write-buffer-with-copy: func(buffer: borrow, buffer-offset: gpu-size64, data: list, data-offset: option, size: option) -> result<_, write-buffer-error>; write-texture-with-copy: func(destination: gpu-texel-copy-texture-info, data: list, data-layout: gpu-texel-copy-buffer-layout, size: gpu-extent3-d); label: func() -> string; @@ -656,7 +656,7 @@ interface webgpu { label: option, } resource gpu-shader-module { - get-compilation-info: func() -> future; + get-compilation-info: async func() -> gpu-compilation-info; label: func() -> string; set-label: func(label: string); }