Instead of manually compiling my GLSL shaders to SPIR-V, I want Visual Studio to automatically detect changes to shader files and run glslangValidator as a build step. I am using Premake to generate the Visual Studio solution/project.
One solution that partly worked was declaring in premake5.lua
:
--prebuildcommands [[for %%i in (..\data\shaders\*) do (..\libs\vulkan\glslangValidator.exe -V -o "%%~dpibin\%%~nxi.spv" %%i)]]
and then right-click shader in solution explorer -> properties -> General -> Item Type -> Custom Build Tool
.
There are some downsides to this approach:
The closest thing I could find in the premake documentation was: Custom Build Commands. I think the idea is to use a filter on shader files and generate build commands, but I just couldn't get anything to work. Maybe someone else has an idea?
I know nothing of Premake, but this works for Visual Studio:
Item Type
to Custom Build Tool
Custom Build Tool
tree set for each shader file:
Command Line
to $(VULKAN_SDK)\Bin32\glslangValidator -V -o $(OutDir)\%(Identity).spv %(Identity)
(for x32, otherwise Bin
for x64 host)Description
to something nice, e.g. Compiling vertex shader
Outputs
to e.g. $(OutDir)\%(Identity).spv
Link Objects
to No
Should now work per file and properly compile only the modified one and also delete them on clean.
Although I do prefer the method (as you did) of just adding one command to post-build step:
for %%f in (*.vert *.tesc *.tese *.geom *.frag *.comp) \
do %VK_SDK_PATH%\Bin\glslangValidator.exe -V -o $(OutDir)\%%f.spv %%f
It has the benefit that it can be easily added to a new project with a Property Sheet.
Looks like I misunderstood a few things from the premake documentation (thanks Nicol). I got it working by doing:
filter "files:../data/shaders/*"
buildcommands '"../libs/vulkan/glslangValidator.exe" -V -o "%{file.directory}/bin/%{file.name}.spv" "%{file.relpath}"'
buildoutputs "%{file.directory}/bin/%{file.name}.spv"
Now my Visual Studio project settings match krOoze's answer. The only downside is having to manually set this up for each new shader (or regenerate the entire project). Custom Rules look interesting but are only supported for Visual Studio at the moment (also they don't support multiple extension types in the same rule (.frag, .vert, .comp, etc)).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With