Skip to content
Merged
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
69855b0
Add Slang + Dawn dependencies
daljit46 Nov 26, 2025
e89112d
Add new GPU compute API
daljit46 Nov 26, 2025
d7c70cc
Add unit tests for GPU API
daljit46 Nov 26, 2025
c24a724
Reorder arguments for FetchContent_Declare
daljit46 Nov 26, 2025
9725022
Fix typos
daljit46 Nov 26, 2025
f63dd43
Remove DOWNLOAD_EXTRACT_TIMESTAMP
daljit46 Nov 26, 2025
0428640
Don't run unit tests in parallel
daljit46 Nov 26, 2025
9d9111e
Add Threads package requirement for Dawn integration
daljit46 Nov 26, 2025
1c58428
Update Dawn library path handling for Linux systems
daljit46 Nov 26, 2025
3e763d5
Update required cmake version in readme
daljit46 Nov 26, 2025
13a684b
Add mesa-vulkan-drivers to dependency installation for Linux builds
daljit46 Nov 26, 2025
50712c6
Fix instance descriptor initialization in ComputeContext constructor
daljit46 Nov 26, 2025
444d16a
Use supported device limits for storage buffer sizes
daljit46 Nov 26, 2025
887c710
Update Slang directory path handling for cross-platform compatibility
daljit46 Nov 26, 2025
f9a43fb
Fix filesystem path handling in ComputeContext constructor
daljit46 Nov 26, 2025
2308693
Add post-build command to copy imported dependencies
daljit46 Nov 26, 2025
95232f4
Add mesa package to MinGW dependencies for Windows build
daljit46 Nov 26, 2025
c543f2b
Catch exceptions during ComputeContext creation for gpu tests
daljit46 Nov 26, 2025
764fa3a
Use std::string_view where required by check_syntax
daljit46 Nov 27, 2025
c5691db
Add workaround for loading vulkan dll on MSYS2
daljit46 Nov 27, 2025
d3c008b
Fetch tcb::span with CMake
daljit46 Nov 27, 2025
9738f59
Introduce MRTRIX_USE_SYSTEM options for Slang, Dawn and tcb::span
daljit46 Nov 27, 2025
365f00d
Use FetchContent_Populate directly to avoid building tcb::span tests
daljit46 Nov 27, 2025
dc37898
Add copyright notice
daljit46 Nov 27, 2025
bfe549d
Apply clang-format-all
daljit46 Nov 27, 2025
f2af69c
Remove redundant this-> qualifiers in gpu.cpp
daljit46 Jan 15, 2026
49dbec2
Add new function to upload POD structs to GPU buffers
daljit46 Jan 15, 2026
ee18874
Remove redundant write_to_buffer overload with void*
daljit46 Jan 15, 2026
9027f69
Use constexpr for desired buffer size constants
daljit46 Jan 15, 2026
44078e2
Fix comment to correctly refer to Slang files instead of WGSL
daljit46 Jan 15, 2026
255a490
Align buffer writes to WebGPU requirements and add device limits
daljit46 Jan 16, 2026
9358f41
Mark new_buffer_from_host_image as [[nodiscard]]
daljit46 Jan 16, 2026
e6fe1af
Add test for kernel using uniform buffer
daljit46 Jan 16, 2026
d7cf148
Select correct Slang entry point end-to-end
daljit46 Jan 17, 2026
b59c2d0
Fix inconsistent parameter names
daljit46 Jan 17, 2026
c2af099
Fix formatting with clang-format
daljit46 Jan 17, 2026
d9de700
Update GPU code copyright to 2026
daljit46 Jan 17, 2026
20fc37f
Revert "Don't run unit tests in parallel"
daljit46 Jan 17, 2026
9cda131
Simplify selection of specialized entry point
daljit46 Jan 17, 2026
2c29bc8
Avoid nested conditional operator when resolving entry point name
daljit46 Jan 17, 2026
68103b9
Use uppercase unsigned literal suffixes
daljit46 Jan 17, 2026
a725e1c
Add missing include header
daljit46 Jan 17, 2026
4c94b1f
Suppress check_syntax for resolved variable
daljit46 Jan 19, 2026
488c6a8
Fix narrowing conversion for Slang entry point
daljit46 Jan 19, 2026
f6efe50
Remove hack to copy Vulkan dll on MSYS2
daljit46 Jan 19, 2026
3e63d21
Update copyright header for gputests.cpp
daljit46 Jan 19, 2026
ad22afc
Add option to enable/disable GPU compute functionality
daljit46 Jan 29, 2026
4617d68
Merge branch 'dev' into webgpu
daljit46 Feb 4, 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
13 changes: 7 additions & 6 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
- name: install dependencies
run: |
sudo apt-get update
sudo apt-get install clang qt6-base-dev libglvnd-dev zlib1g-dev libfftw3-dev ninja-build python3-numpy libpng-dev
sudo apt-get install clang qt6-base-dev libglvnd-dev zlib1g-dev libfftw3-dev ninja-build python3-numpy libpng-dev mesa-vulkan-drivers

- name: Run sccache-cache
uses: mozilla-actions/sccache-action@v0.0.9
Expand Down Expand Up @@ -61,7 +61,7 @@ jobs:
run: cd build && ctest -L cli --output-on-failure

- name: unit tests
run: cd build && ctest -L unittest --output-on-failure --parallel 4
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this deletion intentional? The "compatibility" tests that were incompatible with parallel execution have been moved out of the "unittest" category (111947a), such that the parallelisation added in 2916ca4 became acceptable.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was just a temporary solution to diagnose whether tests were failing due to parallelistation. I will restore it once I confirm things work without this.

run: cd build && ctest -L unittest --output-on-failure

- name: compatibility tests
run: cd build && ctest -L compatibility --output-on-failure
Expand Down Expand Up @@ -96,7 +96,7 @@ jobs:
- name: install dependencies
run: |
sudo apt-get update
sudo apt-get install g++-9 qt6-base-dev libglvnd-dev zlib1g-dev libfftw3-dev ninja-build python3-numpy libpng-dev
sudo apt-get install g++-9 qt6-base-dev libglvnd-dev zlib1g-dev libfftw3-dev ninja-build python3-numpy libpng-dev mesa-vulkan-drivers

- name: Run sccache-cache
uses: mozilla-actions/sccache-action@v0.0.9
Expand Down Expand Up @@ -126,7 +126,7 @@ jobs:
run: cd build && ctest -L cli --output-on-failure

- name: unit tests
run: cd build && ctest -L unittest --output-on-failure --parallel 4
run: cd build && ctest -L unittest --output-on-failure

- name: compatibility tests
run: cd build && ctest -L compatibility --output-on-failure
Expand Down Expand Up @@ -187,7 +187,7 @@ jobs:
run: cd build && ctest -L cli --output-on-failure

- name: unit tests
run: cd build && ctest -L unittest --output-on-failure --parallel 4
run: cd build && ctest -L unittest --output-on-failure

- name: compatibility tests
run: cd build && ctest -L compatibility --output-on-failure
Expand Down Expand Up @@ -233,6 +233,7 @@ jobs:
${{env.MINGW_PACKAGE_PREFIX}}-diffutils
${{env.MINGW_PACKAGE_PREFIX}}-fftw
${{env.MINGW_PACKAGE_PREFIX}}-gcc
${{env.MINGW_PACKAGE_PREFIX}}-mesa
${{env.MINGW_PACKAGE_PREFIX}}-ninja
${{env.MINGW_PACKAGE_PREFIX}}-pkg-config
${{env.MINGW_PACKAGE_PREFIX}}-qt6-base
Expand Down Expand Up @@ -265,7 +266,7 @@ jobs:
run: cd build && ctest -L cli --output-on-failure

- name: unit tests
run: cd build && ctest -L unittest --output-on-failure --parallel 4
run: cd build && ctest -L unittest --output-on-failure

- name: compatibility tests
run: cd build && ctest -L compatibility --output-on-failure
Expand Down
7 changes: 7 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ option(MRTRIX_USE_SYSTEM_EIGEN "Use system-installed Eigen3 library" OFF)
option(MRTRIX_USE_SYSTEM_JSON "Use system-installed Json for Modern C++ library" OFF)
option(MRTRIX_USE_SYSTEM_NIFTI "Use system-installed NIfTI C headers" OFF)
option(MRTRIX_USE_SYSTEM_GTEST "Use system-installed Google Test library" OFF)
option(MRTRIX_USE_SYSTEM_DAWN "Use system-installed Dawn library" OFF)
option(MRTRIX_USE_SYSTEM_SLANG "Use system-installed Slang library" OFF)
option(MRTRIX_USE_SYSTEM_TCB_SPAN "Use system-installed TCB Span library" OFF)

if(MRTRIX_BUILD_TESTS)
if(CMAKE_VERSION VERSION_GREATER 3.17)
Expand Down Expand Up @@ -69,6 +72,10 @@ file(RELATIVE_PATH relDir

set(CMAKE_INSTALL_RPATH ${base} ${base}/${relDir})

if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.24.0")
cmake_policy(SET CMP0135 NEW)
endif()

include(BuildType)
include(BuildInfo)
include(LinkerSetup)
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ You can address all *MRtrix3*-related queries there, using your GitHub or Google
## Quick install

1. Install dependencies by whichever means your system uses.
These include: CMake (>= 3.16), Python3, a C++ compiler with full C++17 support,
These include: CMake (>= 3.22), Python3, a C++ compiler with full C++17 support,
Eigen (>=3.2.8), zlib, OpenGL (>=3.3), and Qt (>=5.5).

2. Clone Git repository and compile:
Expand Down
132 changes: 132 additions & 0 deletions cmake/Dependencies.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -102,3 +102,135 @@ if(MRTRIX_BUILD_TESTS)
FetchContent_MakeAvailable(googletest)
endif()
endif()


# Dawn

# Threads (required by Dawn exported targets)
find_package(Threads REQUIRED)

if(NOT MRTRIX_USE_SYSTEM_DAWN)
message(STATUS "Downloading prebuilt binaries for Dawn...")
include(FetchContent)
set(FETCHCONTENT_QUIET OFF)

if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(DAWN_PLATFORM "linux")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
set(DAWN_PLATFORM "macos")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(DAWN_PLATFORM "windows-msys2")
else()
message(FATAL_ERROR "Unsupported platform: ${CMAKE_SYSTEM_NAME}")
endif()

set(DAWN_VERSION 7495)


set(DAWN_BINARIES_URL_PREFIX
"https://github.com/mrtrix3/webgpu-dawn-binaries/releases/download/chromium")
set(DAWN_BINARIES_URL
${DAWN_BINARIES_URL_PREFIX}-${DAWN_VERSION}/webgpu-dawn-chromium-${DAWN_VERSION}-${DAWN_PLATFORM}.zip
)

FetchContent_Declare(
dawn
DOWNLOAD_NO_PROGRESS 1
URL ${DAWN_BINARIES_URL}
)
FetchContent_MakeAvailable(dawn)

# On Linux, Dawn prebuilt packages use lib64; others use lib
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(DAWN_LIB_DIR_NAME "lib64")
else()
set(DAWN_LIB_DIR_NAME "lib")
endif()
set(
Dawn_DIR
"${dawn_SOURCE_DIR}/${DAWN_LIB_DIR_NAME}/cmake/Dawn"
CACHE PATH "Folder containing DawnConfig.cmake"
FORCE
)
set(FETCHCONTENT_QUIET ON)
endif()


# Slang

find_package(slang QUIET)

if(NOT MRTRIX_USE_SYSTEM_SLANG)
message(STATUS "Downloading prebuilt binaries for Slang...")
set(SLANG_VERSION "2025.22.1" CACHE STRING "Slang version to download from GitHub releases")

if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(SLANG_OS "linux")
elseif(APPLE)
set(SLANG_OS "macos")
else()
set(SLANG_OS "windows")
endif()

if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "arm64")
set(SLANG_ARCH "aarch64")
else()
set(SLANG_ARCH "x86_64")
endif()

set(SLANG_SUBSTRING "-${SLANG_OS}-${SLANG_ARCH}")

set(SLANG_DOWNLOAD_LINK
"https://github.com/shader-slang/slang/releases/download/v${SLANG_VERSION}/slang-${SLANG_VERSION}${SLANG_SUBSTRING}.zip"
)

message(STATUS "Downloading Slang ${SLANG_VERSION} (${SLANG_OS}/${SLANG_ARCH})...")

FetchContent_Declare(
slang
DOWNLOAD_NO_PROGRESS 1
URL ${SLANG_DOWNLOAD_LINK}
)
FetchContent_MakeAvailable(slang)

if(WIN32)
set(slang_DIR_PATH "${slang_SOURCE_DIR}/cmake")
else()
set(slang_DIR_PATH "${slang_SOURCE_DIR}/lib/cmake/slang")
endif()

set(
slang_DIR
"${slang_DIR_PATH}"
CACHE PATH "Folder containing SlangConfig.cmake"
FORCE
)
endif()

# tcb::span
if(MRTRIX_USE_SYSTEM_TCB_SPAN)
find_path(TCB_SPAN_INCLUDE_DIR
NAMES tcb/span.hpp
PATHS /usr/include /usr/local/include
)
if(NOT TCB_SPAN_INCLUDE_DIR)
message(FATAL_ERROR "Could not find tcb::span headers. Please install tcb::span or disable MRTRIX_USE_SYSTEM_TCB_SPAN.")
endif()

add_library(tcb_span INTERFACE)
target_include_directories(tcb_span INTERFACE ${TCB_SPAN_INCLUDE_DIR})
add_library(tcb::span ALIAS tcb_span)
else()
message(STATUS "Downloading tcb::span...")

FetchContent_Populate(
tcb_span
GIT_REPOSITORY https://github.com/tcbrindle/span.git
GIT_TAG 836dc6a0efd9849cb194e88e4aa2387436bb079b
)

add_library(tcb_span INTERFACE)
target_include_directories(tcb_span INTERFACE ${tcb_span_SOURCE_DIR}/include)
add_library(tcb::span ALIAS tcb_span)
endif()

26 changes: 26 additions & 0 deletions cpp/core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ find_package(FFTW REQUIRED)
find_package(Git QUIET)
find_package(Threads REQUIRED)
find_package(PNG QUIET)
find_package(Dawn CONFIG REQUIRED)
find_package(slang CONFIG REQUIRED)

if(PNG_FOUND)
message(STATUS "Found PNG: ${PNG_LIBRARIES}")
Expand Down Expand Up @@ -102,6 +104,7 @@ else()
endif()

target_link_libraries(mrtrix-core PUBLIC
dawn::webgpu_dawn
Eigen3::Eigen
ZLIB::ZLIB
fftw3::fftw
Expand All @@ -110,13 +113,36 @@ target_link_libraries(mrtrix-core PUBLIC
Threads::Threads
nlohmann_json::nlohmann_json
nifti::nifti
slang::slang
tcb::span
)

# On Windows, the libraries need to be in the same directory as the executables
if(WIN32)
set_target_properties(mrtrix-core PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin
)

add_custom_command(TARGET mrtrix-core POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$<TARGET_FILE:dawn::webgpu_dawn>
$<TARGET_FILE:slang::slang>
$<TARGET_FILE_DIR:mrtrix-core>
COMMENT "Copying imported dependencies to output directory"
)
# In an MSYS2 environment, dawn fails to load the required vulkan-1.dll library when
# creating a WebGPU instance. To remedy this, we copy the DLL from C:/Windows/System32
# to the build output directory.
# TODO: Investigate further and find a better solution.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

List Issue and remove TODO code comment?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, thanks that's probably wiser.

if(NOT MSVC)
add_custom_command(TARGET mrtrix-core POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$ENV{WINDIR}/System32/vulkan-1.dll
$<TARGET_FILE_DIR:mrtrix-core>
COMMENT "Copying vulkan-1.dll to output directory"
)
endif()

endif()

install(TARGETS mrtrix-core
Expand Down
Loading
Loading