Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
7b1e283
Update mini_webgpu.h to latest Dawn.
Dec 15, 2025
7fcdc04
Update webgpu.cpp for new version of mini_webgpu.h
Dec 15, 2025
a8bf37e
Update test/common/gpu_context.h for new WebGPU API
Dec 16, 2025
5ed5747
Add NULL/SIZE_MAX definitions and use init macros
Dec 16, 2025
e9cf592
Use more init macros to make code simpler.
Dec 16, 2025
cb079ee
Use more init macros.
Dec 24, 2025
d1b9a97
Checkpoint
Jan 27, 2026
1275621
Tests passing in Dawn native
Jan 27, 2026
0d3dfc6
Implementation using waitany, working on both Dawn native and via emd…
Feb 17, 2026
d388c42
Both native and wasm32 webgpu targets build and test
Feb 18, 2026
3ccf93f
Merge remote-tracking branch 'origin/main' into shoaibkamil/webgpu_us…
Feb 18, 2026
76d55bc
Make gpu context test use new API
Feb 19, 2026
24d4b88
Remove dead code
Feb 19, 2026
bcb184f
update docs, fix minor spacing issue
Feb 19, 2026
1750748
Update docs
Feb 20, 2026
5077f6b
Attempt to fix Makefile
Feb 20, 2026
fd3210d
Merge remote-tracking branch 'origin/main' into shoaibkamil/webgpu_us…
Feb 25, 2026
195b073
Formatting
Feb 25, 2026
5c22026
Fix clang-tidy issues. Fix regexp to exclude mini_*.h from clang-tidy.
Feb 26, 2026
6469bfe
Update vcpkg config to support host-webgpu on macos
Feb 26, 2026
6d6f64b
Allow using a globally-installed webgpu provider
Mar 2, 2026
d5f5a51
Require Node.js 25 as minimum for WebGPU
Mar 2, 2026
d43c524
Add WASM+WebGPU setup instructions to WebGPU.md
Mar 2, 2026
e152bbc
Minor comment/preprocessor change.
Mar 2, 2026
673dd1f
Merge remote-tracking branch 'origin/main' into shoaibkamil/webgpu_us…
Mar 2, 2026
fbc11a1
Small, minor fixes
Mar 2, 2026
d6cd885
WGPUStringView does not guarantee null terminated strings
Mar 2, 2026
fdde2e8
Merge remote-tracking branch 'origin/main' into shoaibkamil/webgpu_us…
May 13, 2026
338a8f7
Fix WebGPU native build: build Dawn as shared library for dlopen support
May 13, 2026
5427827
Fix WebGPU vcpkg triplets and JITModule fallback library search
May 13, 2026
7ac8547
Apply pre-commit auto-fixes
halide-ci[bot] May 13, 2026
b9c8bdb
Merge origin/main into shoaibkamil/webgpu_use_promises
Jul 10, 2026
07af027
release WebGPU resources in generator_alias test before exit
Jul 13, 2026
754b1df
Merge branch 'shoaibkamil/webgpu_use_promises' of github.com:halide/h…
Jul 13, 2026
5c00565
Merge origin/main into shoaibkamil/webgpu_use_promises
Jul 14, 2026
597617a
webgpu: request higher compute workgroup limits and surface pipeline …
Jul 14, 2026
15172e5
Apply pre-commit auto-fixes
halide-ci[bot] Jul 14, 2026
a3ec428
Test upstream vcpkg port
alexreinking Jul 23, 2026
fb938b7
Fix -Werror=unused-function on Linux/GCC
alexreinking Jul 23, 2026
cc3a7ae
Add host-webgpu CI job on macOS
alexreinking Jul 23, 2026
1fe81d5
Pin dawn to a version GHA runners' bundled vcpkg actually has
alexreinking Jul 23, 2026
70e1a96
Fix toolchain file path for new webgpu preset
alexreinking Jul 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .clang-tidy
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ Checks: >
# keep-sorted end
WarningsAsErrors: '*'
HeaderFilterRegex: '.*'
ExcludeHeaderFilterRegex: '\.fbs\.h|common/cmdline\.h|/mini_\w*\.h'
ExcludeHeaderFilterRegex: '\.fbs\.h|common/cmdline\.h|mini_[^/]*\.h'
FormatStyle: 'file'
CheckOptions:
- key: modernize-use-default-member-init.UseAssignment
Expand Down
39 changes: 39 additions & 0 deletions .github/workflows/testing-macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -105,3 +105,42 @@ jobs:
-destination 'generic/platform=iOS Simulator'
build
working-directory: apps/HelloiOS

webgpu:
if: "!contains(github.event.pull_request.labels.*.name, 'skip_buildbots')"
name: arm-64 / host-webgpu
runs-on: macos-26

steps:
- uses: actions/checkout@v7

- uses: astral-sh/setup-uv@v7

- name: Sync CI environment
run: |
uv sync --python 'cpython-3.10.20-macos-aarch64-none' --group ci-llvm-main --no-install-project
echo "${GITHUB_WORKSPACE}/.venv/bin" >> "$GITHUB_PATH"
echo "VIRTUAL_ENV=${GITHUB_WORKSPACE}/.venv" >> "$GITHUB_ENV"

- name: Configure LLVM paths
run: echo "Halide_LLVM_ROOT=$(halide-llvm --prefix)" >> "$GITHUB_ENV"

- name: Cache vcpkg binary archives
uses: actions/cache@v4
with:
path: ~/.cache/vcpkg/archives
key: vcpkg-archives-macos-arm64-webgpu-${{ hashFiles('vcpkg.json', 'vcpkg-configuration.json', 'cmake/vcpkg-triplets/arm64-osx-halide.cmake', 'cmake/vcpkg-ports/**') }}

- name: Configure CMake
run: cmake --preset ci-macos-arm-64-webgpu -DHalide_TARGET=host-webgpu

- name: Build
run: cmake --build build

- name: Test (host-webgpu)
run: ctest --test-dir build --output-on-failure -j "$(sysctl -n hw.ncpu)" -R correctness_gpu
env:
# CMake's find_package resolves Dawn fine at configure/build time, but the
# JIT's runtime dlopen (JITModule.cpp's load_webgpu) is a separate lookup
# that needs to be told explicitly where the vcpkg-installed dylib lives.
HL_WEBGPU_NATIVE_LIB: ${{ github.workspace }}/build/vcpkg_installed/arm64-osx-halide/lib/libwebgpu_dawn.dylib
9 changes: 9 additions & 0 deletions CMakePresets.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,15 @@
"name": "ci-macos-arm-64",
"inherits": "ci"
},
{
"name": "ci-macos-arm-64-webgpu",
"inherits": "ci-macos-arm-64",
"cacheVariables": {
"VCPKG_TARGET_TRIPLET": "arm64-osx-halide",
"VCPKG_MANIFEST_FEATURES": "developer;webgpu-native",
"VCPKG_CHAINLOAD_TOOLCHAIN_FILE": "${sourceDir}/cmake/toolchain.ci-macos-arm-64.cmake"
}
},
{
"name": "ci-macos-x86-64",
"inherits": "ci"
Expand Down
37 changes: 36 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -911,7 +911,8 @@ RUNTIME_CPP_COMPONENTS = \
vulkan \
wasm_cpu_features \
wasm_thread_id \
webgpu_dawn \
webgpu_dawn_arm \
webgpu_dawn_x86 \
webgpu_emscripten \
windows_aarch64_cpu_features_arm \
windows_clock \
Expand Down Expand Up @@ -1111,6 +1112,8 @@ RUNTIME_TRIPLE_WIN_GENERIC_64 = "x86_64-unknown-windows-unknown"

RUNTIME_TRIPLE_WEBGPU_32 = "wasm32-unknown-unknown-unknown"
RUNTIME_TRIPLE_WEBGPU_64 = "wasm64-unknown-unknown-unknown"
RUNTIME_TRIPLE_WEBGPU_ARM_64 = "aarch64-unknown-unknown-unknown"
RUNTIME_TRIPLE_WEBGPU_X86_64 = "x86_64-unknown-unknown-unknown"

# `-fno-threadsafe-statics` is very important here (note that it allows us to use a 'modern' C++
# standard but still skip threadsafe guards for static initialization in our runtime code)
Expand Down Expand Up @@ -1164,6 +1167,22 @@ $(BUILD_DIR)/initmod.windows_%_64.ll: $(SRC_DIR)/runtime/windows_%.cpp
@mkdir -p $(@D)
$(CLANG) $(CXX_WARNING_FLAGS) $(RUNTIME_CXX_FLAGS) -m64 -target $(RUNTIME_TRIPLE_WIN_GENERIC_64) -fshort-wchar -DCOMPILING_HALIDE_RUNTIME -DBITS_64 -emit-llvm -S $(SRC_DIR)/runtime/windows_$*.cpp -o $@ -MMD -MP -MF $(BUILD_DIR)/initmod.windows_$*_64.d

$(BUILD_DIR)/initmod.webgpu_dawn_arm_32.ll: $(SRC_DIR)/runtime/webgpu_dawn_arm.cpp
@mkdir -p $(@D)
$(CLANG) $(CXX_WARNING_FLAGS) $(RUNTIME_CXX_FLAGS) -m32 -target $(RUNTIME_TRIPLE_32) -DCOMPILING_HALIDE_RUNTIME -DBITS_32 -emit-llvm -S $(SRC_DIR)/runtime/webgpu_dawn_arm.cpp -o $@ -MMD -MP -MF $(BUILD_DIR)/initmod.webgpu_dawn_arm_32.d

$(BUILD_DIR)/initmod.webgpu_dawn_arm_64.ll: $(SRC_DIR)/runtime/webgpu_dawn_arm.cpp
@mkdir -p $(@D)
$(CLANG) $(CXX_WARNING_FLAGS) $(RUNTIME_CXX_FLAGS) -m64 -target $(RUNTIME_TRIPLE_WEBGPU_ARM_64) -DCOMPILING_HALIDE_RUNTIME -DBITS_64 -emit-llvm -S $(SRC_DIR)/runtime/webgpu_dawn_arm.cpp -o $@ -MMD -MP -MF $(BUILD_DIR)/initmod.webgpu_dawn_arm_64.d

$(BUILD_DIR)/initmod.webgpu_dawn_x86_32.ll: $(SRC_DIR)/runtime/webgpu_dawn_x86.cpp
@mkdir -p $(@D)
$(CLANG) $(CXX_WARNING_FLAGS) $(RUNTIME_CXX_FLAGS) -m32 -target $(RUNTIME_TRIPLE_32) -DCOMPILING_HALIDE_RUNTIME -DBITS_32 -emit-llvm -S $(SRC_DIR)/runtime/webgpu_dawn_x86.cpp -o $@ -MMD -MP -MF $(BUILD_DIR)/initmod.webgpu_dawn_x86_32.d

$(BUILD_DIR)/initmod.webgpu_dawn_x86_64.ll: $(SRC_DIR)/runtime/webgpu_dawn_x86.cpp
@mkdir -p $(@D)
$(CLANG) $(CXX_WARNING_FLAGS) $(RUNTIME_CXX_FLAGS) -m64 -target $(RUNTIME_TRIPLE_WEBGPU_X86_64) -DCOMPILING_HALIDE_RUNTIME -DBITS_64 -emit-llvm -S $(SRC_DIR)/runtime/webgpu_dawn_x86.cpp -o $@ -MMD -MP -MF $(BUILD_DIR)/initmod.webgpu_dawn_x86_64.d

$(BUILD_DIR)/initmod.webgpu_%_32.ll: $(SRC_DIR)/runtime/webgpu_%.cpp
@mkdir -p $(@D)
$(CLANG) $(CXX_WARNING_FLAGS) $(RUNTIME_CXX_FLAGS) -m32 -target $(RUNTIME_TRIPLE_WEBGPU_32) -DCOMPILING_HALIDE_RUNTIME -DBITS_32 -emit-llvm -S $(SRC_DIR)/runtime/webgpu_$*.cpp -o $@ -MMD -MP -MF $(BUILD_DIR)/initmod.webgpu_$*_32.d
Expand All @@ -1172,6 +1191,22 @@ $(BUILD_DIR)/initmod.webgpu_%_64.ll: $(SRC_DIR)/runtime/webgpu_%.cpp
@mkdir -p $(@D)
$(CLANG) $(CXX_WARNING_FLAGS) $(RUNTIME_CXX_FLAGS) -m64 -target $(RUNTIME_TRIPLE_WEBGPU_64) -DCOMPILING_HALIDE_RUNTIME -DBITS_64 -emit-llvm -S $(SRC_DIR)/runtime/webgpu_$*.cpp -o $@ -MMD -MP -MF $(BUILD_DIR)/initmod.webgpu_$*_64.d

$(BUILD_DIR)/initmod.webgpu_dawn_arm_32_debug.ll: $(SRC_DIR)/runtime/webgpu_dawn_arm.cpp
@mkdir -p $(@D)
$(CLANG) $(CXX_WARNING_FLAGS) -g -DDEBUG_RUNTIME $(RUNTIME_CXX_FLAGS) -m32 -target $(RUNTIME_TRIPLE_32) -DCOMPILING_HALIDE_RUNTIME -DBITS_32 -emit-llvm -S $(SRC_DIR)/runtime/webgpu_dawn_arm.cpp -o $@ -MMD -MP -MF $(BUILD_DIR)/initmod.webgpu_dawn_arm_32_debug.d

$(BUILD_DIR)/initmod.webgpu_dawn_arm_64_debug.ll: $(SRC_DIR)/runtime/webgpu_dawn_arm.cpp
@mkdir -p $(@D)
$(CLANG) $(CXX_WARNING_FLAGS) -g -DDEBUG_RUNTIME $(RUNTIME_CXX_FLAGS) -m64 -target $(RUNTIME_TRIPLE_WEBGPU_ARM_64) -DCOMPILING_HALIDE_RUNTIME -DBITS_64 -emit-llvm -S $(SRC_DIR)/runtime/webgpu_dawn_arm.cpp -o $@ -MMD -MP -MF $(BUILD_DIR)/initmod.webgpu_dawn_arm_64_debug.d

$(BUILD_DIR)/initmod.webgpu_dawn_x86_32_debug.ll: $(SRC_DIR)/runtime/webgpu_dawn_x86.cpp
@mkdir -p $(@D)
$(CLANG) $(CXX_WARNING_FLAGS) -g -DDEBUG_RUNTIME $(RUNTIME_CXX_FLAGS) -m32 -target $(RUNTIME_TRIPLE_32) -DCOMPILING_HALIDE_RUNTIME -DBITS_32 -emit-llvm -S $(SRC_DIR)/runtime/webgpu_dawn_x86.cpp -o $@ -MMD -MP -MF $(BUILD_DIR)/initmod.webgpu_dawn_x86_32_debug.d

$(BUILD_DIR)/initmod.webgpu_dawn_x86_64_debug.ll: $(SRC_DIR)/runtime/webgpu_dawn_x86.cpp
@mkdir -p $(@D)
$(CLANG) $(CXX_WARNING_FLAGS) -g -DDEBUG_RUNTIME $(RUNTIME_CXX_FLAGS) -m64 -target $(RUNTIME_TRIPLE_WEBGPU_X86_64) -DCOMPILING_HALIDE_RUNTIME -DBITS_64 -emit-llvm -S $(SRC_DIR)/runtime/webgpu_dawn_x86.cpp -o $@ -MMD -MP -MF $(BUILD_DIR)/initmod.webgpu_dawn_x86_64_debug.d

$(BUILD_DIR)/initmod.webgpu_%_32_debug.ll: $(SRC_DIR)/runtime/webgpu_%.cpp
@mkdir -p $(@D)
$(CLANG) $(CXX_WARNING_FLAGS) -g -DDEBUG_RUNTIME $(RUNTIME_CXX_FLAGS) -m32 -target $(RUNTIME_TRIPLE_WEBGPU_32) -DCOMPILING_HALIDE_RUNTIME -DBITS_32 -emit-llvm -S $(SRC_DIR)/runtime/webgpu_$*.cpp -o $@ -MMD -MP -MF $(BUILD_DIR)/initmod.webgpu_$*_32_debug.d
Expand Down
81 changes: 71 additions & 10 deletions cmake/FindHalide_WebGPU.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,77 @@ if (EXISTS "$ENV{HL_WEBGPU_NATIVE_LIB}")
set(Halide_WebGPU_NATIVE_LIB "$ENV{HL_WEBGPU_NATIVE_LIB}" CACHE FILEPATH "")
endif ()

find_library(Halide_WebGPU_NATIVE_LIB NAMES webgpu_dawn wgpu)
# Try to find Dawn via vcpkg's CMake config first
if (NOT TARGET Halide::WebGPU)
# Look for DawnConfig.cmake in vcpkg installed directory
if (DEFINED ENV{VCPKG_ROOT})
set(_dawn_cmake_path "$ENV{VCPKG_ROOT}/installed/${VCPKG_TARGET_TRIPLET}/share/dawn")
if (EXISTS "${_dawn_cmake_path}/DawnConfig.cmake")
# Use find_package to properly resolve dependencies
find_package(Dawn CONFIG QUIET)
if (TARGET dawn::webgpu_dawn AND NOT TARGET Halide::WebGPU)
add_library(Halide::WebGPU ALIAS dawn::webgpu_dawn)
elseif (TARGET dawn::dawn_public_config AND NOT TARGET Halide::WebGPU)
get_target_property(_dawn_loc dawn::dawn_public_config IMPORTED_LOCATION)
if (_dawn_loc)
add_library(Halide::WebGPU UNKNOWN IMPORTED)
set_target_properties(Halide::WebGPU
PROPERTIES
IMPORTED_LOCATION "${_dawn_loc}"
)
get_target_property(
_dawn_link_deps dawn::dawn_public_config INTERFACE_LINK_LIBRARIES
)
if (_dawn_link_deps)
set_target_properties(Halide::WebGPU
PROPERTIES
INTERFACE_LINK_LIBRARIES "${_dawn_link_deps}"
)
endif ()
endif ()
endif ()
elseif (EXISTS "${_dawn_cmake_path}/DawnTargets.cmake")
include("${_dawn_cmake_path}/DawnTargets.cmake")
if (TARGET dawn::webgpu_dawn AND NOT TARGET Halide::WebGPU)
add_library(Halide::WebGPU ALIAS dawn::webgpu_dawn)
endif ()
endif ()
endif ()
endif ()

# If Dawn wasn't found via vcpkg config, fall back to manual find
if (NOT TARGET Halide::WebGPU)
# Prefer shared library for runtime loading (dlopen)
find_library(
Halide_WebGPU_NATIVE_LIB
NAMES webgpu_dawn wgpu
PATHS "${CMAKE_CURRENT_LIST_DIR}/../vcpkg_installed/${VCPKG_TARGET_TRIPLET}/lib"
NO_DEFAULT_PATH
)
if (NOT Halide_WebGPU_NATIVE_LIB)
find_library(Halide_WebGPU_NATIVE_LIB NAMES webgpu_dawn wgpu)
endif ()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(
Halide_WebGPU
REQUIRED_VARS Halide_WebGPU_NATIVE_LIB
HANDLE_COMPONENTS
)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(
Halide_WebGPU
REQUIRED_VARS Halide_WebGPU_NATIVE_LIB
HANDLE_COMPONENTS
)
if (Halide_WebGPU_NATIVE_LIB)
add_library(Halide::WebGPU UNKNOWN IMPORTED)
set_target_properties(Halide::WebGPU
PROPERTIES
IMPORTED_LOCATION "${Halide_WebGPU_NATIVE_LIB}"
)

if (Halide_WebGPU_NATIVE_LIB AND NOT TARGET Halide::WebGPU)
add_library(Halide::WebGPU UNKNOWN IMPORTED)
set_target_properties(Halide::WebGPU PROPERTIES IMPORTED_LOCATION "${Halide_WebGPU_NATIVE_LIB}")
if (APPLE)
set_target_properties(Halide::WebGPU
PROPERTIES
INTERFACE_LINK_LIBRARIES
"-framework Cocoa;-framework IOKit;-framework Foundation;-framework IOSurface;-framework QuartzCore;-framework Metal"
)
endif ()
endif ()
endif ()
16 changes: 16 additions & 0 deletions cmake/vcpkg-triplets/arm64-osx-halide.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
set(VCPKG_TARGET_ARCHITECTURE arm64)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE static)
set(VCPKG_CMAKE_SYSTEM_NAME Darwin)
set(VCPKG_OSX_ARCHITECTURES arm64)

# Dawn must be a shared library so it can be loaded via dlopen at runtime.
if (PORT STREQUAL "dawn")
set(VCPKG_LIBRARY_LINKAGE dynamic)
endif ()

# Skip Debug builds in CI: they're unused (we only ever load Release Dawn) and
# ~2x the build time / ~30x the artifact size for no benefit.
if (DEFINED ENV{CI})
set(VCPKG_BUILD_TYPE release)
endif ()
15 changes: 15 additions & 0 deletions cmake/vcpkg-triplets/x64-osx-halide.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
set(VCPKG_TARGET_ARCHITECTURE x64)
set(VCPKG_CRT_LINKAGE dynamic)
set(VCPKG_LIBRARY_LINKAGE static)
set(VCPKG_CMAKE_SYSTEM_NAME Darwin)

# Dawn must be a shared library so it can be loaded via dlopen at runtime.
if (PORT STREQUAL "dawn")
set(VCPKG_LIBRARY_LINKAGE dynamic)
endif ()

# Skip Debug builds in CI: they're unused (we only ever load Release Dawn) and
# ~2x the build time / ~30x the artifact size for no benefit.
if (DEFINED ENV{CI})
set(VCPKG_BUILD_TYPE release)
endif ()
Loading
Loading