Skip to content

Commit ea911a6

Browse files
authored
Add Rust CI (#3)
1 parent 840b531 commit ea911a6

File tree

2 files changed

+183
-0
lines changed

2 files changed

+183
-0
lines changed

.github/workflows/rust.yml

Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
name: Rust CI
2+
3+
on:
4+
push:
5+
branches:
6+
- master
7+
pull_request:
8+
branches:
9+
- master
10+
11+
jobs:
12+
test:
13+
name: Test Rust Shaders - ${{ matrix.name }}
14+
runs-on: ${{ matrix.os }}
15+
strategy:
16+
fail-fast: false
17+
matrix:
18+
include:
19+
- os: ubuntu-latest
20+
name: Ubuntu
21+
- os: windows-latest
22+
name: Windows
23+
- os: macos-latest
24+
name: macOS-MoltenVK
25+
use_moltenvk: true
26+
- os: macos-latest
27+
name: macOS-SwiftShader
28+
use_swiftshader: true
29+
30+
steps:
31+
- uses: actions/checkout@v4
32+
with:
33+
submodules: "recursive"
34+
35+
- name: Install Vulkan SDK
36+
shell: bash
37+
env:
38+
VULKAN_SDK_VERSION: 1.3.250.1
39+
run: |
40+
if [ "$RUNNER_OS" == "Linux" ]; then
41+
sudo apt-get update -y -qq
42+
sudo apt install -y vulkan-tools libvulkan-dev
43+
elif [ "$RUNNER_OS" == "macOS" ]; then
44+
VULKAN_INSTALL_DIR="$HOME/vulkan-sdk"
45+
mkdir -p "$VULKAN_INSTALL_DIR"
46+
cd "$RUNNER_TEMP"
47+
wget "https://sdk.lunarg.com/sdk/download/$VULKAN_SDK_VERSION/mac/vulkansdk-macos-$VULKAN_SDK_VERSION.dmg?Human=true" -O vulkan-sdk.dmg
48+
hdiutil attach vulkan-sdk.dmg
49+
# The volume is mounted as /Volumes/VulkanSDK
50+
sudo /Volumes/VulkanSDK/InstallVulkan.app/Contents/MacOS/InstallVulkan --root $VULKAN_INSTALL_DIR/vulkansdk-macos-$VULKAN_SDK_VERSION --accept-licenses --default-answer --confirm-command install
51+
hdiutil detach /Volumes/VulkanSDK
52+
rm vulkan-sdk.dmg
53+
echo "VULKAN_SDK_PATH=$VULKAN_INSTALL_DIR/vulkansdk-macos-$VULKAN_SDK_VERSION" >> $GITHUB_ENV
54+
echo "VULKAN_SDK=$VULKAN_INSTALL_DIR/vulkansdk-macos-$VULKAN_SDK_VERSION/macOS" >> $GITHUB_ENV
55+
echo "DYLD_LIBRARY_PATH=$VULKAN_INSTALL_DIR/vulkansdk-macos-$VULKAN_SDK_VERSION/macOS/lib:$DYLD_LIBRARY_PATH" >> $GITHUB_ENV
56+
echo "PATH=$VULKAN_INSTALL_DIR/vulkansdk-macos-$VULKAN_SDK_VERSION/macOS/bin:$PATH" >> $GITHUB_ENV
57+
cd "$GITHUB_WORKSPACE"
58+
elif [ "$RUNNER_OS" == "Windows" ]; then
59+
cd "$RUNNER_TEMP"
60+
curl -L "https://sdk.lunarg.com/sdk/download/$VULKAN_SDK_VERSION/windows/VulkanSDK-$VULKAN_SDK_VERSION-Installer.exe?Human=true" -o vulkan-sdk.exe
61+
./vulkan-sdk.exe --accept-licenses --default-answer --confirm-command install
62+
rm vulkan-sdk.exe
63+
echo "VULKAN_SDK=C:\\VulkanSDK\\$VULKAN_SDK_VERSION" >> $GITHUB_ENV
64+
echo "PATH=$VULKAN_SDK\\Bin;$PATH" >> $GITHUB_ENV
65+
cd "$GITHUB_WORKSPACE"
66+
fi
67+
68+
- if: ${{ runner.os == 'Linux' }}
69+
name: Install Linux graphics dependencies
70+
run: |
71+
sudo add-apt-repository ppa:kisak/turtle -y
72+
sudo apt-get update
73+
sudo apt install -y xvfb libgl1-mesa-dri libxcb-xfixes0-dev mesa-vulkan-drivers
74+
75+
- if: ${{ runner.os == 'macOS' && matrix.use_moltenvk == true }}
76+
name: Setup MoltenVK on macOS
77+
run: |
78+
echo "VK_ICD_FILENAMES=$HOME/vulkan-sdk/vulkansdk-macos-1.3.250.1/macOS/share/vulkan/icd.d/MoltenVK_icd.json" >> $GITHUB_ENV
79+
80+
- name: Install SwiftShader
81+
if: ${{ matrix.use_swiftshader == true || runner.os == 'Linux' || runner.os == 'Windows' }}
82+
env:
83+
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
84+
SWIFTSHADER_LINUX_URL: https://github.com/qarmin/gtk_library_store/releases/download/3.24.0/swiftshader2.zip
85+
SWIFTSHADER_MACOS_URL: https://github.com/nikitalita/swiftshader-builds/releases/download/1.0.0/swiftshader-vulkan-r6216.7997cbc34b-macos-10.15.zip
86+
shell: bash
87+
run: |
88+
export SWIFTSHADER_DEST_DIR='${{ runner.temp }}/swiftshader'
89+
mkdir -p $SWIFTSHADER_DEST_DIR
90+
if [ "$RUNNER_OS" == "Linux" ]; then
91+
wget ${{ env.SWIFTSHADER_LINUX_URL }} -O swiftshader.zip
92+
unzip swiftshader.zip -d $SWIFTSHADER_DEST_DIR
93+
rm swiftshader.zip
94+
SWIFTSHADER_LIB_NAME="./libvk_swiftshader.so"
95+
sed -i "s|PATH_TO_CHANGE|$SWIFTSHADER_LIB_NAME|" $SWIFTSHADER_DEST_DIR/vk_swiftshader_icd.json
96+
echo "VK_ICD_FILENAMES=$SWIFTSHADER_DEST_DIR/vk_swiftshader_icd.json" >> $GITHUB_ENV
97+
elif [ "$RUNNER_OS" == "macOS" ]; then
98+
wget ${{ env.SWIFTSHADER_MACOS_URL }} -O swiftshader.zip
99+
unzip swiftshader.zip -d temp-ss-dl/
100+
rm swiftshader.zip
101+
mv temp-ss-dl/lib/libvk_swiftshader.dylib $SWIFTSHADER_DEST_DIR/libvk_swiftshader.dylib
102+
mv temp-ss-dl/share/vulkan/icd.d/vk_swiftshader_icd.json $SWIFTSHADER_DEST_DIR/vk_swiftshader_icd.json
103+
rm -rf temp-ss-dl/
104+
sed -i '' "s/..\/..\/..\/lib\/libvk_swiftshader.dylib/.\/libvk_swiftshader.dylib/" "$SWIFTSHADER_DEST_DIR/vk_swiftshader_icd.json"
105+
echo "VK_ICD_FILENAMES=$SWIFTSHADER_DEST_DIR/vk_swiftshader_icd.json" >> $GITHUB_ENV
106+
elif [ "$RUNNER_OS" == "Windows" ]; then
107+
choco install --yes 7zip
108+
curl -L ${{env.SWIFTSHADER_WINDOWS_URL}} -o swiftshader.zip
109+
7z x swiftshader.zip -otemp-ss-dl/
110+
rm swiftshader.zip
111+
mv temp-ss-dl/swiftshader-*/swiftshader-*.7z temp-ss-dl/swiftshader.7z
112+
7z x temp-ss-dl/swiftshader.7z -otemp-ss-dl/swiftshader
113+
rm temp-ss-dl/swiftshader.7z
114+
mv temp-ss-dl/swiftshader/x64/bin/vk_swiftshader.dll $SWIFTSHADER_DEST_DIR/vk_swiftshader.dll
115+
mv temp-ss-dl/swiftshader/x64/bin/vulkan-1.dll $SWIFTSHADER_DEST_DIR/vulkan-1.dll
116+
mv temp-ss-dl/swiftshader/x64/bin/vk_swiftshader_icd.json $SWIFTSHADER_DEST_DIR/vk_swiftshader_icd.json
117+
rm -rf temp-ss-dl/
118+
echo "VK_ICD_FILENAMES=$SWIFTSHADER_DEST_DIR\vk_swiftshader_icd.json" >> $GITHUB_ENV
119+
fi
120+
121+
- name: Setup Python
122+
uses: actions/setup-python@v5
123+
with:
124+
python-version: '3.x'
125+
126+
- name: Install Rust toolchain
127+
uses: dtolnay/rust-toolchain@stable
128+
129+
- name: Install nightly toolchain for cargo-gpu
130+
shell: bash
131+
run: |
132+
# cargo-gpu will auto-install its required toolchain version
133+
# but we need a base nightly toolchain
134+
rustup toolchain install nightly
135+
rustup component add rust-src rustc-dev llvm-tools --toolchain nightly
136+
137+
- name: Install cargo-gpu
138+
shell: bash
139+
env:
140+
RUST_LOG: debug
141+
run: |
142+
# Install cargo-gpu with locked dependencies
143+
cargo install --git https://github.com/rust-gpu/cargo-gpu cargo-gpu --locked
144+
145+
- name: Cache cargo registry
146+
uses: actions/cache@v3
147+
with:
148+
path: |
149+
~/.cargo/registry
150+
~/.cargo/git
151+
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
152+
153+
- name: Set Windows PATH
154+
if: runner.os == 'Windows'
155+
run: echo "$env:USERPROFILE\.cargo\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
156+
157+
- name: Compile shaders to SPIR-V
158+
working-directory: shaders/rust
159+
run: python3 compileshaders.py
160+
161+
- name: Verify no uncommitted changes
162+
shell: bash
163+
run: |
164+
# Check if there are any changes to tracked files
165+
if ! git diff --exit-code; then
166+
echo "Error: Generated SPIR-V files differ from checked-in versions"
167+
echo "Please run 'python3 compileshaders.py' locally and commit the changes"
168+
git diff --name-only
169+
exit 1
170+
fi
171+
172+
# Check for untracked files
173+
if [ -n "$(git ls-files --others --exclude-standard)" ]; then
174+
echo "Error: New untracked files were generated"
175+
echo "Please add these files to git or update .gitignore:"
176+
git ls-files --others --exclude-standard
177+
exit 1
178+
fi

shaders/rust/compileshaders.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def compile_shader(shader_dir):
3131
"--shader-crate", str(shader_dir),
3232
"--output-dir", str(shader_dir),
3333
"--multimodule", # Split into separate files per entry point
34+
"--auto-install-rust-toolchain", # Auto-install required toolchain in CI
3435
], capture_output=False)
3536

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

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

@@ -104,6 +107,8 @@ def compile_shader(shader_dir):
104107
old_path = shader_dir / old_name
105108
new_path = shader_dir / new_name
106109
if old_path.exists():
110+
if new_path.exists():
111+
new_path.unlink() # Remove existing file
107112
old_path.rename(new_path)
108113
print(f" Created {new_name}")
109114
else:

0 commit comments

Comments
 (0)