Skip to content

Commit c1be8c0

Browse files
committed
Checkpoint Runtime shader path and tooling integration
1 parent 5ba53ca commit c1be8c0

12 files changed

Lines changed: 888 additions & 34 deletions

CMakeLists.txt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ option(WASM_AUTO_FETCH_TOOLS "Auto-download missing tools during configure" ON)
1212
option(WEBVULKAN_BUILD_TESTS "Build maintainer smoke tests" OFF)
1313
option(WEBVULKAN_ALLOW_DEP_UPDATES "Allow dependency git update during configure" OFF)
1414
option(WEBVULKAN_DEPS_EDITABLE "Use editable local dependency checkouts without automatic git reset/update" OFF)
15+
set(WEBVULKAN_CLANG_WASM_PACKAGE "clang/clang" CACHE STRING "Wasmer package used for OpenCL C to SPIR-V compilation")
16+
set(WEBVULKAN_SPIRV_WASM_PACKAGE "lights0123/llvm-spir" CACHE STRING "Wasmer package that provides SPIR-V compiler entrypoint")
17+
set(WEBVULKAN_SPIRV_WASM_ENTRYPOINT "clspv" CACHE STRING "Wasmer package command used for OpenCL C to SPIR-V")
1518
set(WASM_EMSDK_VERSION "latest" CACHE STRING "emsdk version or tag")
1619
set(WASM_EMSDK_GIT_URL "https://github.com/emscripten-core/emsdk.git" CACHE STRING "emsdk git repository URL")
1720
set(WASM_EMSDK_GIT_REF "14c18b569f55138fe4963924162244251f454fb0" CACHE STRING "Pinned emsdk git ref")
@@ -27,6 +30,9 @@ set(WEBVULKAN_EMSCRIPTEN_TOOLCHAIN_FILE "${PROJECT_SOURCE_DIR}/cmake/toolchains/
2730
set(MESA_SRC_DIR "${WEBVULKAN_THIRDPARTY_DIR}/mesa" CACHE PATH "Path where Mesa is cloned")
2831
set(MESA_GIT_URL "https://github.com/Devsh-Graphics-Programming/mesa.git" CACHE STRING "Mesa git repository URL")
2932
set(MESA_GIT_REF "caeeea677046411288c1a5155d81b27640aedd3a" CACHE STRING "Pinned Mesa git ref")
33+
if(MESA_GIT_REF STREQUAL "fc73e2257d9c2b51f64c78eaaafe878a73951eb8")
34+
set(MESA_GIT_REF "caeeea677046411288c1a5155d81b27640aedd3a" CACHE STRING "Pinned Mesa git ref" FORCE)
35+
endif()
3036
set(MESA_WASM_BUILD_DIR "${WEBVULKAN_BUILD_DIR}/mesa-wasm" CACHE PATH "Mesa WASM build directory")
3137
set(LLVM_SRC_DIR "${WEBVULKAN_THIRDPARTY_DIR}/llvm-project" CACHE PATH "Path where llvm-project is cloned")
3238
set(LLVM_HOST_BUILD_DIR "${WEBVULKAN_BUILD_DIR}/llvm-host-tools" CACHE PATH "LLVM host tools build directory")
@@ -72,6 +78,8 @@ set(CPM_UPDATE_DISCONNECTED ${_WEBVULKAN_FETCH_UPDATES_DISCONNECTED} CACHE BOOL
7278
include(cmake/BootstrapCpm.cmake)
7379
webvulkan_bootstrap_cpm()
7480
include(cmake/FetchWebVulkanSources.cmake)
81+
set(WEBVULKAN_SHADER_COMPILER_SCRIPT "${PROJECT_SOURCE_DIR}/tools/webvulkan_compile_spirv.mjs")
82+
include(cmake/WebVulkanShaderTools.cmake)
7583

7684
include(cmake/BootstrapEmsdk.cmake)
7785
ensure_emsdk_ready(
@@ -146,6 +154,8 @@ add_library(webvulkan::llvmpipe_wasm ALIAS webvulkan_llvmpipe_wasm)
146154
add_library(webvulkan::lavapipe_wasm ALIAS webvulkan_llvmpipe_wasm)
147155
add_library(webvulkan_llvm_jit INTERFACE)
148156
add_library(webvulkan::llvm_jit ALIAS webvulkan_llvm_jit)
157+
add_library(webvulkan_shader_tools INTERFACE)
158+
add_library(webvulkan::shader_tools ALIAS webvulkan_shader_tools)
149159

150160
add_dependencies(webvulkan_llvmpipe_wasm llvmpipe_wasm_spike)
151161
add_dependencies(webvulkan_llvm_jit llvmpipe_wasm_spike)
@@ -164,6 +174,7 @@ target_link_libraries(webvulkan_llvmpipe_wasm INTERFACE
164174
)
165175
target_link_libraries(webvulkan_llvm_jit INTERFACE webvulkan::llvmpipe_wasm)
166176
target_compile_definitions(webvulkan_llvm_jit INTERFACE WEBVULKAN_ENABLE_LLVM_JIT=1)
177+
set_property(TARGET webvulkan_shader_tools PROPERTY WEBVULKAN_SHADER_COMPILER_SCRIPT "${WEBVULKAN_SHADER_COMPILER_SCRIPT}")
167178

168179
set(WEBVULKAN_PACKAGE_NAME "WebVulkanLlvmpipeWasm")
169180
set(WEBVULKAN_CONFIG_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${WEBVULKAN_PACKAGE_NAME}")
@@ -174,7 +185,7 @@ configure_package_config_file(
174185
"${PROJECT_SOURCE_DIR}/cmake/${WEBVULKAN_PACKAGE_NAME}Config.cmake.in"
175186
"${WEBVULKAN_CONFIG_FILE}"
176187
INSTALL_DESTINATION "${WEBVULKAN_CONFIG_DIR}"
177-
PATH_VARS CMAKE_INSTALL_LIBDIR CMAKE_INSTALL_INCLUDEDIR
188+
PATH_VARS CMAKE_INSTALL_LIBDIR CMAKE_INSTALL_INCLUDEDIR CMAKE_INSTALL_DATADIR
178189
NO_SET_AND_CHECK_MACRO
179190
NO_CHECK_REQUIRED_COMPONENTS_MACRO
180191
)
@@ -196,6 +207,8 @@ install(DIRECTORY "${MESA_SRC_DIR}/include/" DESTINATION "${CMAKE_INSTALL_INCLUD
196207
install(DIRECTORY "${MESA_SRC_DIR}/src/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/mesa/src")
197208
install(DIRECTORY "${LLVM_WASM_INSTALL_DIR}/include/" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/llvm")
198209
install(FILES "${WEBVULKAN_CONFIG_FILE}" "${WEBVULKAN_VERSION_FILE}" DESTINATION "${WEBVULKAN_CONFIG_DIR}")
210+
install(FILES "${PROJECT_SOURCE_DIR}/cmake/WebVulkanShaderTools.cmake" DESTINATION "${WEBVULKAN_CONFIG_DIR}")
211+
install(FILES "${PROJECT_SOURCE_DIR}/tools/webvulkan_compile_spirv.mjs" DESTINATION "${CMAKE_INSTALL_DATADIR}/webvulkan/tools")
199212

200213
if(WEBVULKAN_BUILD_TESTS)
201214
add_subdirectory(tests)

README.local-rnd.md

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# Local R&D Plan - DXC Wasm + LLVM IR -> Wasm Fast Dispatch
2+
3+
Local planning/execution doc only.
4+
Do not commit.
5+
Do not push.
6+
7+
## Objective
8+
9+
Deliver locally, end-to-end:
10+
11+
1. DXC running inside Wasm for runtime `HLSL -> SPIR-V`
12+
2. Fast shader execute path in llvmpipe via `LLVM IR -> Wasm`
13+
3. Runtime smoke that compiles HLSL in Wasm, creates Vulkan compute pipeline, dispatches, and proves fast Wasm path usage
14+
15+
## Constraints
16+
17+
- Local-only iteration
18+
- Commits allowed locally if needed
19+
- No push to any remote in this phase
20+
- Smoke proof must be machine-readable
21+
22+
## Runtime design
23+
24+
### Shader source path
25+
26+
- JS smoke harness compiles HLSL at runtime using Wasm DXC (`dxc.js`) to SPIR-V bytes
27+
- SPIR-V bytes are injected into the C smoke via `webvulkan_set_runtime_shader_spirv`
28+
- Vulkan path creates `VkShaderModule` and compute pipeline from injected SPIR-V
29+
30+
### Fast execute path
31+
32+
- At dispatch, llvmpipe Emscripten path uses `lp_webvulkan_run_store_wasm_js`
33+
- That path runs injected `LLVM IR -> Wasm` module generated by `clang/clang` in Wasm
34+
- If module requires shared-memory import, runtime uses a dedicated shared-memory shim and writes result back to target SSBO bytes
35+
- Smoke enforces proof markers:
36+
- `proof.codegen=llvm_ir_to_wasm`
37+
- `proof.execute_path=fast_wasm`
38+
- `proof.interpreter=disabled_for_dispatch`
39+
40+
## Work packages
41+
42+
### A. DXC Wasm
43+
44+
- Fork remote: `https://github.com/Devsh-Graphics-Programming/DirectXShaderCompiler`
45+
- Branch: `wasm`
46+
- Local Wasm DXC artifact consumed from `tmp/dxc-wasm-build/bin/dxc.js`
47+
- Runtime smoke uses this artifact to compile inline HLSL to SPIR-V
48+
49+
### B. Mesa fast path hardening (Emscripten)
50+
51+
- Device creation stability patches for Emscripten path in lavapipe
52+
- Defensive handle callback usage (`create_texture_handle`/`create_image_handle` nullable)
53+
- Emscripten-safe compute/flush cleanup adjustments to avoid draw teardown traps in smoke scope
54+
- Build-state signature fix in CMake Mesa subbuild so option changes trigger proper reconfigure
55+
56+
### C. Smoke proof
57+
58+
- Vulkan loader path: Volk with custom `vk_icdGetInstanceProcAddr`
59+
- Runtime compile proof:
60+
- HLSL compiled in Wasm by DXC
61+
- LLVM IR compiled in Wasm by clang package
62+
- Dispatch proof:
63+
- expected value `0x12345678`
64+
- observed value `0x12345678`
65+
- Driver identity proof:
66+
- `device.name` contains `llvmpipe`
67+
- `driver.name` contains `llvmpipe`
68+
69+
## Current local status
70+
71+
- [x] Runtime DXC Wasm compile path active
72+
- [x] Runtime LLVM IR -> Wasm injection active
73+
- [x] Vulkan compute dispatch succeeds with expected output
74+
- [x] Fast-path proof lines printed and validated
75+
- [x] `cmake --build build --target lavapipe_runtime_smoke --config Release` passes
76+
77+
## Last validated command
78+
79+
`cmake --build build --target lavapipe_runtime_smoke --config Release`
80+
81+
Key proof lines from passing run:
82+
83+
- `shader.source=runtime_injected_spirv`
84+
- `shader.dispatch=ok`
85+
- `shader.dispatch.expected=0x12345678`
86+
- `shader.dispatch.observed=0x12345678`
87+
- `proof.codegen=llvm_ir_to_wasm`
88+
- `proof.execute_path=fast_wasm`
89+
- `proof.interpreter=disabled_for_dispatch`
90+
- `runtime smoke passed`
91+
92+
## Next local tasks before any push
93+
94+
1. Remove temporary verbose debug logging from Mesa smoke hardening patches
95+
2. Decide which Emscripten safety patches stay productized vs smoke-only
96+
3. Re-run full tests target set after cleanup
97+
4. Prepare minimal commit split (toolchain/smoke/mesa patches) for review

README.md

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Public link targets:
1919

2020
- `webvulkan::llvmpipe_wasm`
2121
- `webvulkan::lavapipe_wasm`
22+
- `webvulkan::shader_tools`
2223

2324
## Scope
2425

@@ -87,6 +88,30 @@ cmake -S . -B build -G Ninja
8788
cmake --build build
8889
```
8990

91+
## Build-time shader toolchain helper
92+
93+
This repository exposes a reusable CMake helper:
94+
- `webvulkan_compile_opencl_to_spirv(...)`
95+
96+
It compiles OpenCL C source to SPIR-V through Wasmer package runtime (`clspv` entrypoint by default), and can be used directly in consumer builds.
97+
98+
Example:
99+
100+
```cmake
101+
add_subdirectory(path/to/llvmpipe2wasm)
102+
103+
set(MY_SHADER_SPV "${CMAKE_BINARY_DIR}/shaders/write_const.spv")
104+
webvulkan_compile_opencl_to_spirv(
105+
SOURCE "${CMAKE_SOURCE_DIR}/shaders/write_const.cl"
106+
OUTPUT "${MY_SHADER_SPV}"
107+
)
108+
109+
add_custom_target(my_shaders DEPENDS "${MY_SHADER_SPV}")
110+
add_executable(my_app src/main.c)
111+
add_dependencies(my_app my_shaders)
112+
target_link_libraries(my_app PRIVATE webvulkan::llvmpipe_wasm)
113+
```
114+
90115
## Use as relocatable package (`find_package`)
91116

92117
Build and install:
@@ -106,6 +131,18 @@ add_executable(my_app src/main.c)
106131
target_link_libraries(my_app PRIVATE webvulkan::llvmpipe_wasm)
107132
```
108133

134+
The same shader helper is available in package mode:
135+
136+
```cmake
137+
find_package(WebVulkanLlvmpipeWasm REQUIRED CONFIG)
138+
139+
set(MY_SHADER_SPV "${CMAKE_BINARY_DIR}/shaders/write_const.spv")
140+
webvulkan_compile_opencl_to_spirv(
141+
SOURCE "${CMAKE_SOURCE_DIR}/shaders/write_const.cl"
142+
OUTPUT "${MY_SHADER_SPV}"
143+
)
144+
```
145+
109146
## Volk smoke path
110147

111148
`runtime_smoke` includes a dedicated Volk-based runtime check.
@@ -120,9 +157,9 @@ This gives a realistic loader flow for consumers that use Volk, while keeping di
120157
`smoke_poc_nir_to_wasm` is kept as an experimental proof-of-concept path and is not the main production direction.
121158

122159
Current shader-path split:
123-
- `lavapipe_runtime_smoke` validates Vulkan compute dispatch in the Mesa wasm driver.
124-
- `clang_wasm_runtime_smoke` validates the clang-in-wasm toolchain path and reports `spirv_probe` status.
125-
- Current `clang/clang` runtime package does not include `llvm-spirv`, so direct clang-in-wasm -> SPIR-V for Vulkan shaders is currently unavailable in this smoke.
160+
- `lavapipe_runtime_smoke` injects runtime-generated SPIR-V (from Wasmer `clspv` by default) into the smoke module and validates Vulkan compute dispatch in the Mesa wasm driver.
161+
- `clang_wasm_runtime_smoke` validates the clang-in-wasm toolchain path and runs an SPIR-V probe through a Wasmer runtime command (`clspv` package entrypoint by default).
162+
- If that command is unavailable, smoke falls back to a direct `--target=spirv32` probe and reports the provider and failure reason.
126163
- `smoke_poc_nir_to_wasm` is a separate experimental check and is not part of `runtime_smoke`.
127164

128165
## Release channels

cmake/BuildMesaLlvmpipeWasm.cmake

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,8 @@ set(MESA_LAVAPIPE_THIN_ARCHIVE "${MESA_BUILD_DIR}/src/gallium/frontends/lavapipe
268268
set(MESA_LAVAPIPE_FULL_ARCHIVE "${MESA_BUILD_DIR}/src/gallium/frontends/lavapipe/liblavapipe_st.full.a")
269269
set(MESA_WEBVULKAN_DRIVER_ARCHIVE "${MESA_BUILD_DIR}/libwebvulkan_driver.full.a")
270270
set(MESA_BUILD_STATE_FILE "${MESA_BUILD_DIR}/.webvulkan_mesa_build_state.txt")
271-
set(MESA_BUILD_SIGNATURE_VERSION "4")
271+
set(MESA_BUILD_SIGNATURE_VERSION "5")
272+
set(MESA_DRAW_USE_LLVM "true")
272273
set(MESA_SOURCE_REV "${MESA_GIT_REF}")
273274
set(MESA_SOURCE_TREE_STATE "unknown")
274275
if(EXISTS "${MESA_SRC_DIR}/.git")
@@ -334,7 +335,7 @@ if(EXISTS "${MESA_SRC_DIR}/.git")
334335
endif()
335336

336337
set(MESA_CONFIG_SIGNATURE_INPUT
337-
"llvm_provider=${LLVM_PROVIDER}\nllvm_git_ref=${LLVM_GIT_REF}\nllvm_prebuilt_url=${LLVM_PREBUILT_URL}\nllvm_prebuilt_sha256=${LLVM_PREBUILT_SHA256}\nemsdk_root=${EMSDK_ROOT}\nllvm_orcjit=${WEBVULKAN_LLVM_ORCJIT_MESON}\n"
338+
"llvm_provider=${LLVM_PROVIDER}\nllvm_git_ref=${LLVM_GIT_REF}\nllvm_prebuilt_url=${LLVM_PREBUILT_URL}\nllvm_prebuilt_sha256=${LLVM_PREBUILT_SHA256}\nemsdk_root=${EMSDK_ROOT}\nllvm_orcjit=${WEBVULKAN_LLVM_ORCJIT_MESON}\ndraw_use_llvm=${MESA_DRAW_USE_LLVM}\n"
338339
)
339340
string(SHA256 MESA_CONFIG_SIGNATURE_HASH "${MESA_CONFIG_SIGNATURE_INPUT}")
340341

@@ -665,7 +666,7 @@ if(MESA_REQUIRES_CONFIGURE)
665666
-Dplatforms=[]
666667
-Dllvm=enabled
667668
-Dshared-llvm=disabled
668-
-Ddraw-use-llvm=true
669+
-Ddraw-use-llvm=${MESA_DRAW_USE_LLVM}
669670
-Dllvm-orcjit=${WEBVULKAN_LLVM_ORCJIT_MESON}
670671
-Dopengl=false
671672
-Dgles1=disabled

cmake/WebVulkanLlvmpipeWasmConfig.cmake.in

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ set(_webvulkan_lib_driver "@PACKAGE_CMAKE_INSTALL_LIBDIR@/libwebvulkan_driver.a"
44
set(_webvulkan_inc_mesa "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@/mesa")
55
set(_webvulkan_inc_mesa_src "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@/mesa/src")
66
set(_webvulkan_inc_llvm "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@/llvm")
7+
set(_webvulkan_tools_dir "${PACKAGE_PREFIX_DIR}/@PACKAGE_CMAKE_INSTALL_DATADIR@/webvulkan/tools")
8+
set(WEBVULKAN_SHADER_COMPILER_SCRIPT "${_webvulkan_tools_dir}/webvulkan_compile_spirv.mjs")
9+
include("${CMAKE_CURRENT_LIST_DIR}/WebVulkanShaderTools.cmake")
710

811
if(NOT TARGET webvulkan::llvmpipe_wasm)
912
add_library(webvulkan::llvmpipe_wasm INTERFACE IMPORTED)
@@ -26,6 +29,11 @@ if(NOT TARGET webvulkan::llvm_jit)
2629
target_compile_definitions(webvulkan::llvm_jit INTERFACE WEBVULKAN_ENABLE_LLVM_JIT=1)
2730
endif()
2831

32+
if(NOT TARGET webvulkan::shader_tools)
33+
add_library(webvulkan::shader_tools INTERFACE IMPORTED)
34+
set_property(TARGET webvulkan::shader_tools PROPERTY WEBVULKAN_SHADER_COMPILER_SCRIPT "${WEBVULKAN_SHADER_COMPILER_SCRIPT}")
35+
endif()
36+
2937
if(NOT TARGET webvulkan_llvmpipe_wasm)
3038
add_library(webvulkan_llvmpipe_wasm INTERFACE IMPORTED)
3139
target_link_libraries(webvulkan_llvmpipe_wasm INTERFACE webvulkan::llvmpipe_wasm)

cmake/WebVulkanShaderTools.cmake

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
include_guard(GLOBAL)
2+
3+
function(_webvulkan_resolve_node OUT_VAR)
4+
if(DEFINED WEBVULKAN_NODE_BIN AND NOT WEBVULKAN_NODE_BIN STREQUAL "")
5+
set(_node "${WEBVULKAN_NODE_BIN}")
6+
else()
7+
find_program(_node NAMES node node.exe)
8+
endif()
9+
if(NOT _node OR NOT EXISTS "${_node}")
10+
message(FATAL_ERROR "Node.js executable not found. Set WEBVULKAN_NODE_BIN to continue.")
11+
endif()
12+
set(${OUT_VAR} "${_node}" PARENT_SCOPE)
13+
endfunction()
14+
15+
function(_webvulkan_resolve_wasmer OUT_VAR)
16+
if(DEFINED WEBVULKAN_WASMER_BIN AND NOT WEBVULKAN_WASMER_BIN STREQUAL "")
17+
set(_wasmer "${WEBVULKAN_WASMER_BIN}")
18+
else()
19+
find_program(_wasmer NAMES wasmer wasmer.exe)
20+
endif()
21+
if(NOT _wasmer OR NOT EXISTS "${_wasmer}")
22+
message(FATAL_ERROR "Wasmer executable not found. Set WEBVULKAN_WASMER_BIN to continue.")
23+
endif()
24+
set(${OUT_VAR} "${_wasmer}" PARENT_SCOPE)
25+
endfunction()
26+
27+
function(webvulkan_compile_opencl_to_spirv)
28+
set(options)
29+
set(oneValueArgs SOURCE OUTPUT NODE_BIN WASMER_BIN CLANG_PACKAGE SPIRV_PACKAGE SPIRV_ENTRYPOINT)
30+
set(multiValueArgs DEPENDS)
31+
cmake_parse_arguments(WEBVULKAN_SHADER "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
32+
33+
if(NOT WEBVULKAN_SHADER_SOURCE)
34+
message(FATAL_ERROR "webvulkan_compile_opencl_to_spirv requires SOURCE")
35+
endif()
36+
if(NOT WEBVULKAN_SHADER_OUTPUT)
37+
message(FATAL_ERROR "webvulkan_compile_opencl_to_spirv requires OUTPUT")
38+
endif()
39+
40+
if(NOT DEFINED WEBVULKAN_SHADER_COMPILER_SCRIPT OR WEBVULKAN_SHADER_COMPILER_SCRIPT STREQUAL "")
41+
set(_default_script "${CMAKE_CURRENT_LIST_DIR}/../tools/webvulkan_compile_spirv.mjs")
42+
if(EXISTS "${_default_script}")
43+
set(WEBVULKAN_SHADER_COMPILER_SCRIPT "${_default_script}")
44+
endif()
45+
endif()
46+
if(NOT EXISTS "${WEBVULKAN_SHADER_COMPILER_SCRIPT}")
47+
message(FATAL_ERROR "WEBVULKAN_SHADER_COMPILER_SCRIPT does not exist: ${WEBVULKAN_SHADER_COMPILER_SCRIPT}")
48+
endif()
49+
50+
if(WEBVULKAN_SHADER_NODE_BIN)
51+
set(_node_bin "${WEBVULKAN_SHADER_NODE_BIN}")
52+
else()
53+
_webvulkan_resolve_node(_node_bin)
54+
endif()
55+
if(NOT EXISTS "${_node_bin}")
56+
message(FATAL_ERROR "Node.js executable does not exist: ${_node_bin}")
57+
endif()
58+
59+
if(WEBVULKAN_SHADER_WASMER_BIN)
60+
set(_wasmer_bin "${WEBVULKAN_SHADER_WASMER_BIN}")
61+
else()
62+
_webvulkan_resolve_wasmer(_wasmer_bin)
63+
endif()
64+
if(NOT EXISTS "${_wasmer_bin}")
65+
message(FATAL_ERROR "Wasmer executable does not exist: ${_wasmer_bin}")
66+
endif()
67+
68+
if(WEBVULKAN_SHADER_CLANG_PACKAGE)
69+
set(_clang_package "${WEBVULKAN_SHADER_CLANG_PACKAGE}")
70+
elseif(DEFINED WEBVULKAN_CLANG_WASM_PACKAGE AND NOT WEBVULKAN_CLANG_WASM_PACKAGE STREQUAL "")
71+
set(_clang_package "${WEBVULKAN_CLANG_WASM_PACKAGE}")
72+
else()
73+
set(_clang_package "clang/clang")
74+
endif()
75+
76+
if(WEBVULKAN_SHADER_SPIRV_PACKAGE)
77+
set(_spirv_package "${WEBVULKAN_SHADER_SPIRV_PACKAGE}")
78+
elseif(DEFINED WEBVULKAN_SPIRV_WASM_PACKAGE AND NOT WEBVULKAN_SPIRV_WASM_PACKAGE STREQUAL "")
79+
set(_spirv_package "${WEBVULKAN_SPIRV_WASM_PACKAGE}")
80+
else()
81+
set(_spirv_package "lights0123/llvm-spir")
82+
endif()
83+
84+
if(WEBVULKAN_SHADER_SPIRV_ENTRYPOINT)
85+
set(_spirv_entrypoint "${WEBVULKAN_SHADER_SPIRV_ENTRYPOINT}")
86+
elseif(DEFINED WEBVULKAN_SPIRV_WASM_ENTRYPOINT AND NOT WEBVULKAN_SPIRV_WASM_ENTRYPOINT STREQUAL "")
87+
set(_spirv_entrypoint "${WEBVULKAN_SPIRV_WASM_ENTRYPOINT}")
88+
else()
89+
set(_spirv_entrypoint "clspv")
90+
endif()
91+
92+
get_filename_component(_output_dir "${WEBVULKAN_SHADER_OUTPUT}" DIRECTORY)
93+
if(_output_dir)
94+
set(_make_dir_command COMMAND "${CMAKE_COMMAND}" -E make_directory "${_output_dir}")
95+
else()
96+
set(_make_dir_command)
97+
endif()
98+
99+
add_custom_command(
100+
OUTPUT "${WEBVULKAN_SHADER_OUTPUT}"
101+
${_make_dir_command}
102+
COMMAND
103+
"${_node_bin}" "${WEBVULKAN_SHADER_COMPILER_SCRIPT}"
104+
--input "${WEBVULKAN_SHADER_SOURCE}"
105+
--output "${WEBVULKAN_SHADER_OUTPUT}"
106+
--wasmer "${_wasmer_bin}"
107+
--clang-package "${_clang_package}"
108+
--spirv-package "${_spirv_package}"
109+
--spirv-entrypoint "${_spirv_entrypoint}"
110+
DEPENDS
111+
"${WEBVULKAN_SHADER_SOURCE}"
112+
"${WEBVULKAN_SHADER_COMPILER_SCRIPT}"
113+
${WEBVULKAN_SHADER_DEPENDS}
114+
VERBATIM
115+
)
116+
endfunction()

0 commit comments

Comments
 (0)