Skip to content

Commit 4e8e107

Browse files
authored
Emscripten: replace USE_WEBGPU to emdawnwebgpu in wgpu-backend (#76)
1 parent 254e949 commit 4e8e107

File tree

2 files changed

+78
-25
lines changed

2 files changed

+78
-25
lines changed

.github/workflows/build.yml

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,10 @@ jobs:
3535
3636
- name: (dub) Running shdc
3737
run: dub build -c genshaders -v
38-
# - name: (dub) Build sokol-static (default)
39-
# run: dub build -v
40-
# - name: (dub) Build imgui-static
41-
# run: dub build -c imgui-static -v
42-
# - name: (dub) Build sokol-shared
43-
# run: dub build -c sokol-shared -v
44-
# - name: (dub) Build imgui-shared
45-
# run: dub build -c imgui-shared -v
4638
- name: (dub) Build sokol examples
4739
working-directory: examples
4840
run: |
49-
dub build :blend -f
41+
dub build :blend
5042
dub build :bufferoffsets
5143
dub build :clear
5244
dub build :cube
@@ -79,18 +71,10 @@ jobs:
7971
- uses: dlang-community/setup-dlang@v2
8072
with:
8173
compiler: ldc-master
82-
# - name: (dub) Build sokol+imgui-wgles3
83-
# run: dub build -c imgui-wgles3 -v --arch wasm32-unknown-emscripten-wasm
84-
# - name: (dub) Build sokol+imgui-wgpu
85-
# run: dub build -c imgui-wgpu -v --arch wasm32-unknown-emscripten-wasm
86-
# - name: (dub) Build sokol-wgpu
87-
# run: dub build -c sokol-wgpu -v --arch wasm32-unknown-emscripten-wasm
88-
# - name: (dub) Build sokol-wgles3
89-
# run: dub build -c sokol-wgles3 -v --arch wasm32-unknown-emscripten-wasm
9074
- name: (dub) Build sokol examples
9175
working-directory: examples
9276
run: |
93-
dub build :blend -f -c wasm -v --arch wasm32-unknown-emscripten-wasm
77+
dub build :blend -c wasm -v --arch wasm32-unknown-emscripten-wasm
9478
dub build :bufferoffsets -c wasm -v --arch wasm32-unknown-emscripten-wasm
9579
dub build :clear -c wasm -v --arch wasm32-unknown-emscripten-wasm
9680
dub build :cube -c wasm -v --arch wasm32-unknown-emscripten-wasm
@@ -112,7 +96,43 @@ jobs:
11296
dub build :userdata -c wasm -v --arch wasm32-unknown-emscripten-wasm
11397
dub build :vertexpull -c wasm -v --arch wasm32-unknown-emscripten-wasm
11498
115-
archlinux-gdc-15:
99+
build-wgpu:
100+
strategy:
101+
fail-fast: false
102+
matrix:
103+
runs-on: [ubuntu-24.04-arm, ubuntu-latest, macos-latest, windows-latest]
104+
runs-on: ${{ matrix.runs-on }}
105+
steps:
106+
- uses: actions/checkout@v4
107+
- uses: dlang-community/setup-dlang@v2
108+
with:
109+
compiler: ldc-master
110+
- name: (dub) Build sokol examples
111+
working-directory: examples
112+
run: |
113+
dub build :blend -c wgpu -v --arch wasm32-unknown-emscripten-wasm
114+
dub build :bufferoffsets -c wgpu -v --arch wasm32-unknown-emscripten-wasm
115+
dub build :clear -c wgpu -v --arch wasm32-unknown-emscripten-wasm
116+
dub build :cube -c wgpu -v --arch wasm32-unknown-emscripten-wasm
117+
dub build :debugtext -c wgpu -v --arch wasm32-unknown-emscripten-wasm
118+
dub build :droptest -c wgpu -v --arch wasm32-unknown-emscripten-wasm
119+
dub build :imgui -c wgpu -v --arch wasm32-unknown-emscripten-wasm
120+
dub build :instancing -c wgpu -v --arch wasm32-unknown-emscripten-wasm
121+
dub build :instancingcompute -c wgpu -v --arch wasm32-unknown-emscripten-wasm
122+
dub build :mrt -c wgpu -v --arch wasm32-unknown-emscripten-wasm
123+
dub build :noninterleaved -c wgpu -v --arch wasm32-unknown-emscripten-wasm
124+
dub build :offscreen -c wgpu -v --arch wasm32-unknown-emscripten-wasm
125+
dub build :quad -c wgpu -v --arch wasm32-unknown-emscripten-wasm
126+
dub build :shapes -c wgpu -v --arch wasm32-unknown-emscripten-wasm
127+
dub build :saudio -c wgpu -v --arch wasm32-unknown-emscripten-wasm
128+
dub build :sglcontext -c wgpu -v --arch wasm32-unknown-emscripten-wasm
129+
dub build :sglpoints -c wgpu -v --arch wasm32-unknown-emscripten-wasm
130+
dub build :triangle -c wgpu -v --arch wasm32-unknown-emscripten-wasm
131+
dub build :texcube -c wgpu -v --arch wasm32-unknown-emscripten-wasm
132+
dub build :userdata -c wgpu -v --arch wasm32-unknown-emscripten-wasm
133+
dub build :vertexpull -c wgpu -v --arch wasm32-unknown-emscripten-wasm
134+
135+
archlinux-gdc:
116136
strategy:
117137
fail-fast: false
118138
runs-on: ubuntu-latest
@@ -130,7 +150,7 @@ jobs:
130150
- name: (dub) Build sokol examples
131151
working-directory: examples
132152
run: |
133-
dub build :blend -f
153+
dub build :blend
134154
dub build :bufferoffsets
135155
dub build :clear
136156
dub build :cube

build.d

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ module build;
1212
import std;
1313

1414
// Dependency versions
15-
enum emsdk_version = "4.0.9";
15+
enum emsdk_version = "4.0.10";
1616
enum imgui_version = "1.91.9";
1717

1818
void main(string[] args) @safe
@@ -29,7 +29,7 @@ void main(string[] args) @safe
2929
bool help, verbose, downloadEmsdk, downloadShdc;
3030
string compiler, target = defaultTarget, optimize = "debug", linkExample, runExample, linkage = "static";
3131
SokolBackend backend;
32-
bool useX11 = true, useWayland, useEgl, withSokolImgui;
32+
bool useX11 = true, useWayland, useEgl, useLTO, withSokolImgui;
3333
}
3434

3535
Options opts;
@@ -47,6 +47,9 @@ void main(string[] args) @safe
4747
case "--verbose":
4848
verbose = true;
4949
break;
50+
case "--enable-wasm-lto":
51+
useLTO = true;
52+
break;
5053
case "--download-emsdk":
5154
downloadEmsdk = true;
5255
break;
@@ -89,6 +92,8 @@ void main(string[] args) @safe
8992
writeln(" --toolchain=<compiler> Select C toolchain (e.g., gcc, clang, emcc)");
9093
writeln(" --optimize=<level> Select optimization level (debug, release, small)");
9194
writeln(" --target=<target> Select target (native, wasm, android)");
95+
writeln(" --enable-wasm-lto Enable Emscripten LTO");
96+
writeln(" --enable-dawn Use emdawnwebgpu bindings for WASM");
9297
writeln(
9398
" --linkage=<type> Specify library linkage (static or dynamic, default: static)");
9499
writeln(" --download-emsdk Download Emscripten SDK");
@@ -133,6 +138,7 @@ void main(string[] args) @safe
133138
vendor: vendorPath,
134139
backend: opts.backend,
135140
use_emmalloc: true,
141+
release_use_lto: opts.useLTO,
136142
use_imgui: opts.withSokolImgui,
137143
use_filesystem: false,
138144
shell_file_path: absolutePath(buildPath(sokolRoot, "src", "sokol", "web", "shell.html")),
@@ -259,6 +265,11 @@ struct EmRunOptions
259265
bool verbose;
260266
}
261267

268+
struct EmbuilderOptions
269+
{
270+
string port_name, vendor;
271+
}
272+
262273
// Build Sokol and ImGui libraries
263274
void buildLibSokol(LibSokolOptions opts) @safe
264275
{
@@ -307,6 +318,17 @@ void buildLibSokol(LibSokolOptions opts) @safe
307318
break;
308319
case "wasm":
309320
cflags ~= ["-fPIE"];
321+
if (opts.backend == SokolBackend.wgpu) // add include path to find emdawnwebgpu <webgpu/webgpu.h> before Emscripten SDK webgpu.h
322+
{
323+
//dfmt off
324+
EmbuilderOptions embopts = {
325+
port_name: "emdawnwebgpu",
326+
vendor: opts.vendor,
327+
};
328+
//dfmt on
329+
embuilderStep(embopts);
330+
cflags ~= format("-I%s", buildPath(opts.vendor, "emsdk", "upstream", "emscripten", "cache", "ports", "emdawnwebgpu", "emdawnwebgpu_pkg", "webgpu", "include"));
331+
}
310332
compiler = buildPath(opts.vendor, "emsdk", "upstream", "emscripten", "emcc") ~ (isWindows ? ".bat"
311333
: "");
312334
break;
@@ -348,9 +370,12 @@ void buildLibSokol(LibSokolOptions opts) @safe
348370
];
349371
cflags ~= format("-I%s", imguiRoot);
350372

373+
//dfmt off
351374
string imguiCompiler = opts.target.canFind("wasm") ? buildPath(opts.vendor, "emsdk", "upstream", "emscripten", "em++") ~ (
352-
isWindows ? ".bat" : "") : compiler.canFind("clang") ? findProgram(compiler ~ "++") : compiler.canFind(
353-
"gcc") ? findProgram("g++") : compiler;
375+
isWindows ? ".bat" : "") :
376+
compiler.canFind("clang") ? findProgram(compiler ~ "++") :
377+
compiler.canFind("gcc") ? findProgram("g++") : compiler;
378+
//dfmt on
354379

355380
// Compile ImGui sources
356381
auto imguiObjs = compileSources(imguiSources, buildDir, imguiRoot, imguiCompiler, cflags ~ "-DNDEBUG", "imgui_", opts
@@ -463,7 +488,7 @@ void emLinkStep(EmLinkOptions opts) @safe
463488
}
464489

465490
if (opts.backend == SokolBackend.wgpu)
466-
cmd ~= "-sUSE_WEBGPU=1";
491+
cmd ~= "--use-port=emdawnwebgpu";
467492
if (opts.backend == SokolBackend.gles3)
468493
cmd ~= "-sUSE_WEBGL2=1";
469494
if (!opts.use_filesystem)
@@ -511,6 +536,14 @@ void emSdkSetupStep(string emsdk) @safe
511536
}
512537
}
513538

539+
void embuilderStep(EmbuilderOptions opts) @safe
540+
{
541+
string embuilder = buildPath(opts.vendor, "emsdk", "upstream", "emscripten", "embuilder") ~ (
542+
isWindows ? ".bat" : "");
543+
string[] bFlags = ["build", opts.port_name];
544+
executeOrFail(embuilder ~ bFlags, "embuilder failed to build " ~ opts.port_name, true);
545+
}
546+
514547
// Utility functions
515548
string findProgram(string programName) @safe
516549
{

0 commit comments

Comments
 (0)