Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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:

  • All shaders recompile when only one changes
  • I had to manually change the VS project settings

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?

like image 620
Petwoip Avatar asked Aug 22 '16 06:08

Petwoip


2 Answers

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.

like image 64
krOoze Avatar answered Nov 08 '22 04:11

krOoze


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

like image 34
Petwoip Avatar answered Nov 08 '22 04:11

Petwoip