Skip to content

Commit b55dbfe

Browse files
committed
Support Embedded Swift in WebGPUDemo
This adopts new `DefaultExecutorFactory`, which means we can mark `main` entrypoint as `async`. Due to swiftlang/swift#83750 we have to use `JSPromise`-returning functions from WebAPIKit, but otherwise this is now fully compatible with Embedded Swift.
1 parent 97aabc5 commit b55dbfe

File tree

4 files changed

+29
-28
lines changed

4 files changed

+29
-28
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
22
"swiftPM": {
3-
"swiftSDK": "swift-DEVELOPMENT-SNAPSHOT-2025-06-03-a_wasm"
3+
"swiftSDK": "swift-DEVELOPMENT-SNAPSHOT-2025-08-14-a_wasm-embedded"
44
}
55
}

WebGPUDemo/Package.resolved

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

WebGPUDemo/Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ let package = Package(
1111
),
1212
.package(
1313
url: "https://github.com/swiftwasm/JavaScriptKit.git",
14-
branch: "main",
14+
branch: "yt/embedded-fix",
1515
),
1616
],
1717
targets: [

WebGPUDemo/Sources/Entrypoint.swift

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -30,32 +30,33 @@ func fetchImageBitmap(url: String) async throws(JSException) -> ImageBitmap {
3030
)
3131
}
3232

33+
typealias DefaultExecutorFactory = JavaScriptEventLoop
34+
3335
@main
3436
struct Entrypoint {
35-
static func main() {
36-
JavaScriptEventLoop.installGlobalExecutor()
37+
static func main() async {
3738
let gpu = Window.global.navigator.gpu
38-
Task {
39-
do throws(JSException) {
40-
let adapter = try await gpu.requestAdapter()!
41-
let device = try await adapter.requestDevice()
42-
43-
let renderer = try await Renderer(
44-
device: device,
45-
gpu: gpu,
46-
assets: .init(
47-
shaders: fetchString(url: "Resources/shaders.wgsl"),
48-
model: fetchString(url: "Resources/SwiftLogo/Swift3DLogo.obj"),
49-
albedo: fetchImageBitmap(url: "Resources/SwiftLogo/T_M_swiftLogo_BaseColor.png"),
50-
normal: fetchImageBitmap(url: "Resources/SwiftLogo/T_M_swiftLogo_Normal.png"),
51-
metalRoughness: fetchImageBitmap(url: "Resources/SwiftLogo/T_M_swiftLogo_MetalRoughness.png"),
52-
),
53-
)
54-
55-
draw(renderer: renderer)
56-
} catch {
57-
console.error(data: error.thrownValue)
58-
}
39+
40+
do throws(JSException) {
41+
let adapterPromise: JSPromise = gpu.requestAdapter()
42+
let devicePromise = JSPromise(from: try await adapterPromise.value().requestDevice())!
43+
let device = try await GPUDevice(unsafelyWrapping: devicePromise.value().object!)
44+
45+
let renderer = try await Renderer(
46+
device: device,
47+
gpu: gpu,
48+
assets: .init(
49+
shaders: fetchString(url: "Resources/shaders.wgsl"),
50+
model: fetchString(url: "Resources/SwiftLogo/Swift3DLogo.obj"),
51+
albedo: fetchImageBitmap(url: "Resources/SwiftLogo/T_M_swiftLogo_BaseColor.png"),
52+
normal: fetchImageBitmap(url: "Resources/SwiftLogo/T_M_swiftLogo_Normal.png"),
53+
metalRoughness: fetchImageBitmap(url: "Resources/SwiftLogo/T_M_swiftLogo_MetalRoughness.png"),
54+
),
55+
)
56+
57+
draw(renderer: renderer)
58+
} catch {
59+
console.error(data: error.thrownValue)
5960
}
6061
}
6162
}

0 commit comments

Comments
 (0)