Petwoip
Petwoip

Reputation: 1345

Compiling GLSL to SPIR-V using Premake 5 and Visual Studio 2015

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?

Upvotes: 6

Views: 3016

Answers (2)

Petwoip
Petwoip

Reputation: 1345

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)).

Upvotes: 5

krOoze
krOoze

Reputation: 13306

I know nothing of Premake, but this works for Visual Studio:

  1. Add the shaders to your project
  2. In the property page of each shader file set Item Type to Custom Build Tool
  3. In the newly appeared Custom Build Tool tree set for each shader file:
    1. Set Command Line to $(VULKAN_SDK)\Bin32\glslangValidator -V -o $(OutDir)\%(Identity).spv %(Identity) (for x32, otherwise Bin for x64 host)
    2. Set Description to something nice, e.g. Compiling vertex shader
    3. Set Outputs to e.g. $(OutDir)\%(Identity).spv
    4. Set 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.

Upvotes: 4

Related Questions