There are three directories under external
that are related to SPIR-V:
- external/spirv-headers
- external/spirv-tools
- external/spirv-tools-generated
In order to use the latest or custom SPIR-V, they need to be updated.
Currently Slang uses shader-slang/SPIRV-Tools forked from KhronosGroup/SPIRV-Tools.
In order for Slang to use the latest changes from KhronosGroup/SPIRV-Tools
, shader-slang/SPIRV-Tools
needs to be updated.
- Fork
shader-slang/SPIRV-Tools
to your personal github organization likeyour-name/SPIRV-Tools
. - Clone it on your local machine.
git clone https://github.com/your-name/SPIRV-Tools.git # replace `your-name` to the actual URL
- Fetch from
KhronosGroup/SPIRV-Tools
.git remote add khronos https://github.com/KhronosGroup/SPIRV-Tools.git git fetch khronos
- Create a branch for a Pull Request.
git checkout -b merge/update
- Rebase to khronos/main
git rebase khronos/main # use ToT
- Push to Github.
git push origin merge/update
The steps above will create a branch called merge/update
. You can use a different name but this document will use the name.
Before creating a Pull Request for merge/update
, you should test and make sure everything works.
On a Slang repo side, you need to create a branch for the following changes.
git clone https://github.com/your-name/slang.git # replace `your-name` to the actual URL
cd slang
git checkout -b update_spirv
Open .gitmodules
and modify the setting to the following,
[submodule "external/spirv-tools"]
path = external/spirv-tools
url = https://github.com/your-name/SPIRV-Tools.git
[submodule "external/spirv-headers"]
path = external/spirv-headers
url = https://github.com/KhronosGroup/SPIRV-Headers.git
Note that you need to replace your-name
with the actual URL from the previous step.
Apply the URL changes with the following commands,
git submodule sync
git submodule update --init --recursive
cd spirv-headers
git fetch
git checkout origin/main # use ToT
cd ..
cd external
cd spirv-tools
git fetch
git checkout merge/update # use merger/update branch
A directory, external/spirv-tools/generated
, holds a set of files generated from spirv-tools directory.
You need to build spirv-tools in order to generate them.
cd external
cd spirv-tools
python3.exe utils\git-sync-deps # this step may require you to register your ssh public key to gitlab.khronos.org
cmake.exe . -B build
cmake.exe --build build --config Release
Copy some of generated files from external/spirv-tools/build/
to external/spirv-tools-generated/
.
The following files are ones you need to copy at the moment, but the list may change in the future.
DebugInfo.h
NonSemanticShaderDebugInfo100.h
OpenCLDebugInfo100.h
build-version.inc
core.insts-unified1.inc
debuginfo.insts.inc
enum_string_mapping.inc
extension_enum.inc
generators.inc
glsl.std.450.insts.inc
nonsemantic.clspvreflection.insts.inc
nonsemantic.shader.debuginfo.100.insts.inc
nonsemantic.vkspreflection.insts.inc
opencl.debuginfo.100.insts.inc
opencl.std.insts.inc
operand.kinds-unified1.inc
spv-amd-gcn-shader.insts.inc
spv-amd-shader-ballot.insts.inc
spv-amd-shader-explicit-vertex-parameter.insts.inc
spv-amd-shader-trinary-minmax.insts.inc
There are many ways to build Slang executables. Refer to the document for more detail. For a quick reference, you can build with the following commands,
cmake.exe --preset vs2019
cmake.exe --build --preset release
After building Slang executables, run slang-test
to see all tests are passing.
set SLANG_RUN_SPIRV_VALIDATION=1
build\Release\bin\slang-test.exe -use-test-server -server-count 8
It is often the case that some of tests fail, because of the changes on SPIRV-Header. You need to properly resolve them before proceed.
After testing is done, you should create a Pull Request on shader-slang/SPIRV-Tools
repo.
-
The git-push command will show you a URL for creating a Pull Request like following,
https://github.com/your-name/SPIRV-Tools/pull/new/merge/update # replace
your-name
to the actual URLCreate a Pull Request.
-
Wait for all workflows to pass.
-
Merge the PR and take a note of the commit ID for the next step.
Note that this process will update shader-slang/SPIRV-Tools
repo, but your merge is not used by slang
repo yet.
After the PR is merged to shader-slang/SPIRV-Tools
, slang
needs to start using it.
On the clone of Slang repo, revert the changes in .gitmodules
if modified.
# revert the change in .gitmodules
git checkout .gitmodules
git submodule sync
git submodule update --init --recursive
You need to stage and commit the latest commit IDs of spirv-tools and spirv-headers. Note that when you want to use a new commit IDs of the submodules, you have to stage with git-add command for the directly of the submodule itself.
cd external
# Add changes in spirv-tools-generated
git add spirv-tools-generated
# Add commit ID of spirv-headers
cd spirv-headers
git fetch
git checkout origin/main # Use ToT
cd ..
git add spirv-headers
# Add commit ID of spirv-tools
cd spirv-tools
git fetch
git checkout merge/update # Use merge/update branch
cd ..
git add spirv-tools
# Add more if there are other changes to resolve the test failures.
git commit
git push origin update_spirv
Once all changes are pushed to GitHub, you can create a Pull Request on shader-slang/slang
.