@@ -4,6 +4,10 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
44 project (webvulkan_tests LANGUAGES NONE )
55endif ()
66
7+ if (NOT DEFINED WASM_AUTO_FETCH_TOOLS)
8+ set (WASM_AUTO_FETCH_TOOLS ON CACHE BOOL "Auto-download missing tools during configure" )
9+ endif ()
10+
711set (WEBVULKAN_TEST_THIRDPARTY_DIR "${CMAKE_CURRENT_LIST_DIR } /../.3rdparty/tests" CACHE PATH "Test-only third-party root directory" )
812set (WEBVULKAN_THIRDPARTY_STATE_DIR "${CMAKE_CURRENT_LIST_DIR } /../.3rdparty/.state" CACHE PATH "State directory for fetched third-party metadata" )
913set (WEBVULKAN_VOLK_GIT_URL "https://github.com/zeux/volk.git" CACHE STRING "volk git repository URL for smoke tests" )
@@ -14,6 +18,8 @@ set(WEBVULKAN_TEST_MODE "auto" CACHE STRING "Test mode: auto, in-tree, or packag
1418set_property (CACHE WEBVULKAN_TEST_MODE PROPERTY STRINGS auto in-tree package)
1519set (WEBVULKAN_TEST_PACKAGE_PREFIX "" CACHE PATH "Install prefix for WebVulkan package mode" )
1620set (WEBVULKAN_TEST_WASM_BUILD_DIR "${CMAKE_BINARY_DIR } /wasm" CACHE PATH "WASM smoke build directory" )
21+ set (WEBVULKAN_TEST_NODE_BIN "" CACHE FILEPATH "Path to node executable used by runtime smoke scripts" )
22+ set (WEBVULKAN_WASMER_BIN "" CACHE FILEPATH "Path to wasmer executable used by clang wasm runtime smoke" )
1723
1824if (NOT COMMAND CPMAddPackage)
1925 if (NOT DEFINED WEBVULKAN_CPM_VERSION OR WEBVULKAN_CPM_VERSION STREQUAL "" )
@@ -103,6 +109,87 @@ if(NOT SUBBUILD_GENERATOR)
103109 message (FATAL_ERROR "No CMake generator is available for wasm smoke sub-build" )
104110endif ()
105111
112+ set (_webvulkan_node_hints)
113+ file (GLOB _webvulkan_node_candidates
114+ "${EMSDK_ROOT} /node/*/bin/node"
115+ "${EMSDK_ROOT} /node/*/bin/node.exe"
116+ )
117+ if (_webvulkan_node_candidates)
118+ list (SORT _webvulkan_node_candidates COMPARE NATURAL ORDER DESCENDING )
119+ list (GET _webvulkan_node_candidates 0 _webvulkan_emsdk_node_exe)
120+ get_filename_component (_webvulkan_emsdk_node_dir "${_webvulkan_emsdk_node_exe} " DIRECTORY )
121+ list (APPEND _webvulkan_node_hints "${_webvulkan_emsdk_node_dir} " )
122+ endif ()
123+ if (CMAKE_HOST_WIN32 )
124+ if (DEFINED ENV{ProgramFiles} AND NOT "$ENV{ProgramFiles} " STREQUAL "" )
125+ list (APPEND _webvulkan_node_hints "$ENV{ProgramFiles} /nodejs" )
126+ endif ()
127+ if (DEFINED ENV{ProgramW6432} AND NOT "$ENV{ProgramW6432} " STREQUAL "" )
128+ list (APPEND _webvulkan_node_hints "$ENV{ProgramW6432} /nodejs" )
129+ endif ()
130+ if (DEFINED ENV{LOCALAPPDATA} AND NOT "$ENV{LOCALAPPDATA} " STREQUAL "" )
131+ list (APPEND _webvulkan_node_hints "$ENV{LOCALAPPDATA} /Programs/nodejs" )
132+ endif ()
133+ endif ()
134+
135+ if (NOT WEBVULKAN_TEST_NODE_BIN OR WEBVULKAN_TEST_NODE_BIN MATCHES "-NOTFOUND$" )
136+ unset (WEBVULKAN_TEST_NODE_BIN CACHE )
137+ find_program (WEBVULKAN_TEST_NODE_BIN NAMES node node.exe nodejs nodejs.exe HINTS ${_webvulkan_node_hints} )
138+ endif ()
139+ if (NOT WEBVULKAN_TEST_NODE_BIN OR NOT EXISTS "${WEBVULKAN_TEST_NODE_BIN} " )
140+ message (FATAL_ERROR "node executable is required for runtime smoke scripts" )
141+ endif ()
142+ set (WEBVULKAN_TEST_NODE_BIN "${WEBVULKAN_TEST_NODE_BIN} " CACHE FILEPATH "Path to node executable used by runtime smoke scripts" FORCE )
143+
144+ set (_webvulkan_home_dir "" )
145+ if (WIN32 AND DEFINED ENV{USERPROFILE} AND NOT "$ENV{USERPROFILE} " STREQUAL "" )
146+ set (_webvulkan_home_dir "$ENV{USERPROFILE} " )
147+ elseif (DEFINED ENV{HOME} AND NOT "$ENV{HOME} " STREQUAL "" )
148+ set (_webvulkan_home_dir "$ENV{HOME} " )
149+ endif ()
150+
151+ set (_webvulkan_wasmer_hints)
152+ if (_webvulkan_home_dir)
153+ list (APPEND _webvulkan_wasmer_hints "${_webvulkan_home_dir} /.wasmer/bin" )
154+ endif ()
155+ if (WIN32 )
156+ list (APPEND _webvulkan_wasmer_hints
157+ "C:/Program Files/Wasmer/bin"
158+ "C:/Program Files (x86)/Wasmer/bin"
159+ )
160+ endif ()
161+
162+ if (NOT WEBVULKAN_WASMER_BIN OR WEBVULKAN_WASMER_BIN MATCHES "-NOTFOUND$" )
163+ unset (WEBVULKAN_WASMER_BIN CACHE )
164+ find_program (WEBVULKAN_WASMER_BIN NAMES wasmer wasmer.exe HINTS ${_webvulkan_wasmer_hints} )
165+ endif ()
166+ if ((NOT WEBVULKAN_WASMER_BIN OR NOT EXISTS "${WEBVULKAN_WASMER_BIN} " ) AND _webvulkan_home_dir)
167+ if (CMAKE_HOST_WIN32 )
168+ set (_webvulkan_wasmer_default "${_webvulkan_home_dir} /.wasmer/bin/wasmer.exe" )
169+ else ()
170+ set (_webvulkan_wasmer_default "${_webvulkan_home_dir} /.wasmer/bin/wasmer" )
171+ endif ()
172+ if (EXISTS "${_webvulkan_wasmer_default} " )
173+ set (WEBVULKAN_WASMER_BIN "${_webvulkan_wasmer_default} " )
174+ endif ()
175+ endif ()
176+
177+ if ((NOT WEBVULKAN_WASMER_BIN OR NOT EXISTS "${WEBVULKAN_WASMER_BIN} " ) AND WASM_AUTO_FETCH_TOOLS)
178+ execute_process (
179+ COMMAND "${CMAKE_COMMAND } " -P "${CMAKE_CURRENT_LIST_DIR } /BootstrapWasmer.cmake"
180+ RESULT_VARIABLE _webvulkan_bootstrap_wasmer_result
181+ )
182+ if (NOT _webvulkan_bootstrap_wasmer_result EQUAL 0)
183+ message (FATAL_ERROR "Failed to bootstrap wasmer runtime" )
184+ endif ()
185+ find_program (WEBVULKAN_WASMER_BIN NAMES wasmer wasmer.exe HINTS ${_webvulkan_wasmer_hints} )
186+ endif ()
187+
188+ if (NOT WEBVULKAN_WASMER_BIN OR NOT EXISTS "${WEBVULKAN_WASMER_BIN} " )
189+ message (FATAL_ERROR "wasmer executable is required for clang wasm runtime smoke" )
190+ endif ()
191+ set (WEBVULKAN_WASMER_BIN "${WEBVULKAN_WASMER_BIN} " CACHE FILEPATH "Path to wasmer executable used by clang wasm runtime smoke" FORCE )
192+
106193if (NOT COMMAND webvulkan_fetch_git_source)
107194 set (_webvulkan_root_fetch_sources "${CMAKE_CURRENT_LIST_DIR } /../cmake/FetchWebVulkanSources.cmake" )
108195 if (EXISTS "${_webvulkan_root_fetch_sources} " )
@@ -208,6 +295,7 @@ add_custom_command(
208295 -DSMOKE_INCLUDE_DIRS_SERIALIZED=${_webvulkan_smoke_include_dirs_serialized}
209296 -DSMOKE_SOURCE=${CMAKE_CURRENT_LIST_DIR}/wasm/src/lavapipe_runtime_smoke.c
210297 -DSMOKE_JS_OUT=${WEBVULKAN_LAVAPIPE_SMOKE_JS}
298+ -DSMOKE_EXPORT=_lavapipe_runtime_smoke
211299 -DSMOKE_SCRIPT=${CMAKE_CURRENT_LIST_DIR}/wasm/tools/smoke_runtime.mjs
212300 -DVOLK_INCLUDE_DIR=${_webvulkan_volk_include_dir}
213301 -DVOLK_SOURCE=${_webvulkan_volk_source}
@@ -219,5 +307,53 @@ add_custom_command(
219307)
220308add_custom_target (lavapipe_runtime_smoke DEPENDS "${WEBVULKAN_LAVAPIPE_SMOKE_OK} " )
221309
310+ set (WEBVULKAN_POC_NIR_TO_WASM_SMOKE_OK "${CMAKE_BINARY_DIR } /poc_nir_to_wasm_smoke.ok" )
311+ set (WEBVULKAN_POC_NIR_TO_WASM_SMOKE_JS "${CMAKE_BINARY_DIR } /lavapipe-smoke/poc_nir_to_wasm_smoke.js" )
312+ set (_webvulkan_poc_nir_to_wasm_depends
313+ "${CMAKE_CURRENT_LIST_DIR } /RunLavapipeRuntimeSmoke.cmake"
314+ "${CMAKE_CURRENT_LIST_DIR } /wasm/src/poc_nir_to_wasm_smoke.c"
315+ "${CMAKE_CURRENT_LIST_DIR } /wasm/tools/smoke_runtime.mjs"
316+ "${_webvulkan_volk_source} "
317+ "${_webvulkan_volk_header} "
318+ "${_webvulkan_driver_archive} "
319+ )
320+ if (_webvulkan_test_mode STREQUAL "in-tree" )
321+ list (APPEND _webvulkan_poc_nir_to_wasm_depends llvmpipe_wasm_spike)
322+ endif ()
323+ add_custom_command (
324+ OUTPUT "${WEBVULKAN_POC_NIR_TO_WASM_SMOKE_OK} "
325+ COMMAND
326+ "${CMAKE_COMMAND } "
327+ -DEMSDK_ROOT=${EMSDK_ROOT}
328+ -DDRIVER_ARCHIVE=${_webvulkan_driver_archive}
329+ -DSMOKE_INCLUDE_DIRS_SERIALIZED=${_webvulkan_smoke_include_dirs_serialized}
330+ -DSMOKE_SOURCE=${CMAKE_CURRENT_LIST_DIR}/wasm/src/poc_nir_to_wasm_smoke.c
331+ -DSMOKE_JS_OUT=${WEBVULKAN_POC_NIR_TO_WASM_SMOKE_JS}
332+ -DSMOKE_EXPORT=_poc_nir_to_wasm_smoke
333+ -DSMOKE_SCRIPT=${CMAKE_CURRENT_LIST_DIR}/wasm/tools/smoke_runtime.mjs
334+ -DVOLK_INCLUDE_DIR=${_webvulkan_volk_include_dir}
335+ -DVOLK_SOURCE=${_webvulkan_volk_source}
336+ -P "${CMAKE_CURRENT_LIST_DIR } /RunLavapipeRuntimeSmoke.cmake"
337+ COMMAND "${CMAKE_COMMAND } " -E touch "${WEBVULKAN_POC_NIR_TO_WASM_SMOKE_OK} "
338+ DEPENDS ${_webvulkan_poc_nir_to_wasm_depends}
339+ USES_TERMINAL
340+ VERBATIM
341+ )
342+ add_custom_target (smoke_poc_nir_to_wasm DEPENDS "${WEBVULKAN_POC_NIR_TO_WASM_SMOKE_OK} " )
343+
344+ set (WEBVULKAN_CLANG_WASM_SMOKE_OK "${CMAKE_BINARY_DIR } /clang_wasm_runtime_smoke.ok" )
345+ add_custom_command (
346+ OUTPUT "${WEBVULKAN_CLANG_WASM_SMOKE_OK} "
347+ COMMAND
348+ "${CMAKE_COMMAND } " -E env
349+ "WEBVULKAN_WASMER_BIN=${WEBVULKAN_WASMER_BIN} "
350+ "${WEBVULKAN_TEST_NODE_BIN} " "${CMAKE_CURRENT_LIST_DIR } /wasm/tools/clang_wasm_runtime_smoke.mjs"
351+ COMMAND "${CMAKE_COMMAND } " -E touch "${WEBVULKAN_CLANG_WASM_SMOKE_OK} "
352+ DEPENDS "${CMAKE_CURRENT_LIST_DIR } /wasm/tools/clang_wasm_runtime_smoke.mjs"
353+ USES_TERMINAL
354+ VERBATIM
355+ )
356+ add_custom_target (clang_wasm_runtime_smoke DEPENDS "${WEBVULKAN_CLANG_WASM_SMOKE_OK} " )
357+
222358add_custom_target (runtime_smoke )
223- add_dependencies (runtime_smoke wasm_runtime_smoke lavapipe_runtime_smoke )
359+ add_dependencies (runtime_smoke wasm_runtime_smoke lavapipe_runtime_smoke clang_wasm_runtime_smoke )
0 commit comments