Skip to content

Add Rust CI #3

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 16 commits into from
Jul 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
178 changes: 178 additions & 0 deletions .github/workflows/rust.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
name: Rust CI

on:
push:
branches:
- master
pull_request:
branches:
- master

jobs:
test:
name: Test Rust Shaders - ${{ matrix.name }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
name: Ubuntu
- os: windows-latest
name: Windows
- os: macos-latest
name: macOS-MoltenVK
use_moltenvk: true
- os: macos-latest
name: macOS-SwiftShader
use_swiftshader: true

steps:
- uses: actions/checkout@v4
with:
submodules: "recursive"

- name: Install Vulkan SDK
shell: bash
env:
VULKAN_SDK_VERSION: 1.3.250.1
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
sudo apt-get update -y -qq
sudo apt install -y vulkan-tools libvulkan-dev
elif [ "$RUNNER_OS" == "macOS" ]; then
VULKAN_INSTALL_DIR="$HOME/vulkan-sdk"
mkdir -p "$VULKAN_INSTALL_DIR"
cd "$RUNNER_TEMP"
wget "https://sdk.lunarg.com/sdk/download/$VULKAN_SDK_VERSION/mac/vulkansdk-macos-$VULKAN_SDK_VERSION.dmg?Human=true" -O vulkan-sdk.dmg
hdiutil attach vulkan-sdk.dmg
# The volume is mounted as /Volumes/VulkanSDK
sudo /Volumes/VulkanSDK/InstallVulkan.app/Contents/MacOS/InstallVulkan --root $VULKAN_INSTALL_DIR/vulkansdk-macos-$VULKAN_SDK_VERSION --accept-licenses --default-answer --confirm-command install
hdiutil detach /Volumes/VulkanSDK
rm vulkan-sdk.dmg
echo "VULKAN_SDK_PATH=$VULKAN_INSTALL_DIR/vulkansdk-macos-$VULKAN_SDK_VERSION" >> $GITHUB_ENV
echo "VULKAN_SDK=$VULKAN_INSTALL_DIR/vulkansdk-macos-$VULKAN_SDK_VERSION/macOS" >> $GITHUB_ENV
echo "DYLD_LIBRARY_PATH=$VULKAN_INSTALL_DIR/vulkansdk-macos-$VULKAN_SDK_VERSION/macOS/lib:$DYLD_LIBRARY_PATH" >> $GITHUB_ENV
echo "PATH=$VULKAN_INSTALL_DIR/vulkansdk-macos-$VULKAN_SDK_VERSION/macOS/bin:$PATH" >> $GITHUB_ENV
cd "$GITHUB_WORKSPACE"
elif [ "$RUNNER_OS" == "Windows" ]; then
cd "$RUNNER_TEMP"
curl -L "https://sdk.lunarg.com/sdk/download/$VULKAN_SDK_VERSION/windows/VulkanSDK-$VULKAN_SDK_VERSION-Installer.exe?Human=true" -o vulkan-sdk.exe
./vulkan-sdk.exe --accept-licenses --default-answer --confirm-command install
rm vulkan-sdk.exe
echo "VULKAN_SDK=C:\\VulkanSDK\\$VULKAN_SDK_VERSION" >> $GITHUB_ENV
echo "PATH=$VULKAN_SDK\\Bin;$PATH" >> $GITHUB_ENV
cd "$GITHUB_WORKSPACE"
fi

- if: ${{ runner.os == 'Linux' }}
name: Install Linux graphics dependencies
run: |
sudo add-apt-repository ppa:kisak/turtle -y
sudo apt-get update
sudo apt install -y xvfb libgl1-mesa-dri libxcb-xfixes0-dev mesa-vulkan-drivers

- if: ${{ runner.os == 'macOS' && matrix.use_moltenvk == true }}
name: Setup MoltenVK on macOS
run: |
echo "VK_ICD_FILENAMES=$HOME/vulkan-sdk/vulkansdk-macos-1.3.250.1/macOS/share/vulkan/icd.d/MoltenVK_icd.json" >> $GITHUB_ENV

- name: Install SwiftShader
if: ${{ matrix.use_swiftshader == true || runner.os == 'Linux' || runner.os == 'Windows' }}
env:
SWIFTSHADER_WINDOWS_URL: https://github.com/nikitalita/swiftshader-dist-win/releases/download/2021-12-09_00-02/swiftshader-2021-12-09_00-02-subzero.7z.zip
SWIFTSHADER_LINUX_URL: https://github.com/qarmin/gtk_library_store/releases/download/3.24.0/swiftshader2.zip
SWIFTSHADER_MACOS_URL: https://github.com/nikitalita/swiftshader-builds/releases/download/1.0.0/swiftshader-vulkan-r6216.7997cbc34b-macos-10.15.zip
shell: bash
run: |
export SWIFTSHADER_DEST_DIR='${{ runner.temp }}/swiftshader'
mkdir -p $SWIFTSHADER_DEST_DIR
if [ "$RUNNER_OS" == "Linux" ]; then
wget ${{ env.SWIFTSHADER_LINUX_URL }} -O swiftshader.zip
unzip swiftshader.zip -d $SWIFTSHADER_DEST_DIR
rm swiftshader.zip
SWIFTSHADER_LIB_NAME="./libvk_swiftshader.so"
sed -i "s|PATH_TO_CHANGE|$SWIFTSHADER_LIB_NAME|" $SWIFTSHADER_DEST_DIR/vk_swiftshader_icd.json
echo "VK_ICD_FILENAMES=$SWIFTSHADER_DEST_DIR/vk_swiftshader_icd.json" >> $GITHUB_ENV
elif [ "$RUNNER_OS" == "macOS" ]; then
wget ${{ env.SWIFTSHADER_MACOS_URL }} -O swiftshader.zip
unzip swiftshader.zip -d temp-ss-dl/
rm swiftshader.zip
mv temp-ss-dl/lib/libvk_swiftshader.dylib $SWIFTSHADER_DEST_DIR/libvk_swiftshader.dylib
mv temp-ss-dl/share/vulkan/icd.d/vk_swiftshader_icd.json $SWIFTSHADER_DEST_DIR/vk_swiftshader_icd.json
rm -rf temp-ss-dl/
sed -i '' "s/..\/..\/..\/lib\/libvk_swiftshader.dylib/.\/libvk_swiftshader.dylib/" "$SWIFTSHADER_DEST_DIR/vk_swiftshader_icd.json"
echo "VK_ICD_FILENAMES=$SWIFTSHADER_DEST_DIR/vk_swiftshader_icd.json" >> $GITHUB_ENV
elif [ "$RUNNER_OS" == "Windows" ]; then
choco install --yes 7zip
curl -L ${{env.SWIFTSHADER_WINDOWS_URL}} -o swiftshader.zip
7z x swiftshader.zip -otemp-ss-dl/
rm swiftshader.zip
mv temp-ss-dl/swiftshader-*/swiftshader-*.7z temp-ss-dl/swiftshader.7z
7z x temp-ss-dl/swiftshader.7z -otemp-ss-dl/swiftshader
rm temp-ss-dl/swiftshader.7z
mv temp-ss-dl/swiftshader/x64/bin/vk_swiftshader.dll $SWIFTSHADER_DEST_DIR/vk_swiftshader.dll
mv temp-ss-dl/swiftshader/x64/bin/vulkan-1.dll $SWIFTSHADER_DEST_DIR/vulkan-1.dll
mv temp-ss-dl/swiftshader/x64/bin/vk_swiftshader_icd.json $SWIFTSHADER_DEST_DIR/vk_swiftshader_icd.json
rm -rf temp-ss-dl/
echo "VK_ICD_FILENAMES=$SWIFTSHADER_DEST_DIR\vk_swiftshader_icd.json" >> $GITHUB_ENV
fi

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: '3.x'

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Install nightly toolchain for cargo-gpu
shell: bash
run: |
# cargo-gpu will auto-install its required toolchain version
# but we need a base nightly toolchain
rustup toolchain install nightly
rustup component add rust-src rustc-dev llvm-tools --toolchain nightly

- name: Install cargo-gpu
shell: bash
env:
RUST_LOG: debug
run: |
# Install cargo-gpu with locked dependencies
cargo install --git https://github.com/rust-gpu/cargo-gpu cargo-gpu --locked

- name: Cache cargo registry
uses: actions/cache@v3
with:
path: |
~/.cargo/registry
~/.cargo/git
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}

- name: Set Windows PATH
if: runner.os == 'Windows'
run: echo "$env:USERPROFILE\.cargo\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append

- name: Compile shaders to SPIR-V
working-directory: shaders/rust
run: python3 compileshaders.py

- name: Verify no uncommitted changes
shell: bash
run: |
# Check if there are any changes to tracked files
if ! git diff --exit-code; then
echo "Error: Generated SPIR-V files differ from checked-in versions"
echo "Please run 'python3 compileshaders.py' locally and commit the changes"
git diff --name-only
exit 1
fi

# Check for untracked files
if [ -n "$(git ls-files --others --exclude-standard)" ]; then
echo "Error: New untracked files were generated"
echo "Please add these files to git or update .gitignore:"
git ls-files --others --exclude-standard
exit 1
fi
5 changes: 5 additions & 0 deletions shaders/rust/compileshaders.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ def compile_shader(shader_dir):
"--shader-crate", str(shader_dir),
"--output-dir", str(shader_dir),
"--multimodule", # Split into separate files per entry point
"--auto-install-rust-toolchain", # Auto-install required toolchain in CI
], capture_output=False)

if result.returncode == 0:
Expand Down Expand Up @@ -74,6 +75,8 @@ def compile_shader(shader_dir):
final_path = shader_dir / f"{shader_name}.{shader_type}.spv"

# Just rename the file - the C++ code will look for the entry point by name
if final_path.exists():
final_path.unlink() # Remove existing file
source_path.rename(final_path)
print(f" Created {final_path.name} (entry point: {entry_point})")

Expand Down Expand Up @@ -104,6 +107,8 @@ def compile_shader(shader_dir):
old_path = shader_dir / old_name
new_path = shader_dir / new_name
if old_path.exists():
if new_path.exists():
new_path.unlink() # Remove existing file
old_path.rename(new_path)
print(f" Created {new_name}")
else:
Expand Down