Skip to content

Commit

Permalink
Automated shader compilation, glslangValidator support.
Browse files Browse the repository at this point in the history
Shader are now compiled to SPIR-V binary at CMake configuration time. For CI environment missing glslc, support glslangValidator for fallback shader compilation path.
  • Loading branch information
stripe2933 committed Nov 19, 2024
1 parent 94391f4 commit 6252728
Show file tree
Hide file tree
Showing 30 changed files with 126 additions and 36 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
uses: humbletim/[email protected]
with:
vulkan-query-version: latest
vulkan-components: Vulkan-Headers, Vulkan-Loader
vulkan-components: Vulkan-Headers, Vulkan-Loader, Glslang, SPIRV-Tools
vulkan-use-cache: true

- name: Install Ninja and build dependencies
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
uses: humbletim/[email protected]
with:
vulkan-query-version: latest
vulkan-components: Vulkan-Headers, Vulkan-Loader
vulkan-components: Vulkan-Headers, Vulkan-Loader, Glslang, SPIRV-Tools
vulkan-use-cache: true

- name: Install latest LLVM, Ninja and build dependencies
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
uses: humbletim/[email protected]
with:
vulkan-query-version: latest
vulkan-components: Vulkan-Headers, Vulkan-Loader
vulkan-components: Vulkan-Headers, Vulkan-Loader, Glslang, SPIRV-Tools
vulkan-use-cache: true

- name: Export GitHub Actions cache environment variables
Expand All @@ -36,7 +36,7 @@ jobs:
- name: Enable Developer Command Prompt
uses: ilammy/msvc-dev-cmd@v1
with:
toolset: 14.40
toolset: 14.42

- name: Configure
run: cmake --preset=default
Expand Down
48 changes: 47 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -156,12 +156,58 @@ target_link_libraries(vk-gltf-viewer PRIVATE
vku::vku
)
target_compile_definitions(vk-gltf-viewer PRIVATE
COMPILED_SHADER_DIR="${CMAKE_CURRENT_SOURCE_DIR}/shaders"
GLFW_INCLUDE_NONE
GLM_FORCE_DEPTH_ZERO_TO_ONE
GLM_FORCE_XYZW_ONLY
GLM_ENABLE_EXPERIMENTAL
GLM_GTC_INLINE_NAMESPACE
GLM_EXT_INLINE_NAMESPACE
GLM_GTX_INLINE_NAMESPACE
)

# --------------------
# Shader compilation.
# --------------------

include(cmake/CompileShader.cmake)

target_link_shaders(vk-gltf-viewer
shaders/blend_faceted_primitive.frag
shaders/blend_primitive.frag
shaders/blend_unlit_primitive.frag
shaders/brdfmap.comp
shaders/cubemap_tone_mapping.frag
shaders/cubemap.comp
shaders/depth.frag
shaders/depth.vert
shaders/faceted_primitive.frag
shaders/faceted_primitive.tesc
shaders/faceted_primitive.tese
shaders/faceted_primitive.vert
shaders/jump_flood_seed.frag
shaders/jump_flood_seed.vert
shaders/jump_flood.comp
shaders/mask_depth.frag
shaders/mask_depth.vert
shaders/mask_faceted_primitive.frag
shaders/mask_jump_flood_seed.frag
shaders/mask_jump_flood_seed.vert
shaders/mask_primitive.frag
shaders/mask_unlit_primitive.frag
shaders/multiply.comp
shaders/outline.frag
shaders/prefilteredmap.comp
shaders/primitive.frag
shaders/primitive.vert
shaders/screen_quad.vert
shaders/skybox.frag
shaders/skybox.vert
shaders/spherical_harmonic_coefficients_sum.comp
shaders/spherical_harmonics.comp
shaders/subgroup_mipmap_16.comp
shaders/subgroup_mipmap_32.comp
shaders/subgroup_mipmap_64.comp
shaders/unlit_primitive.frag
shaders/unlit_primitive.vert
shaders/weighted_blended_composition.frag
)
5 changes: 1 addition & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -307,10 +307,7 @@ The executable will be located in `build` folder.

#### Shader compilation

All shaders are located in the [shaders](/shaders) folder and need to be manually compiled into `<shader-filename>.spv` before the application launch. To make this easier, script files are available:

- Run [`compile.sh`](/shaders/compile.sh) script if you're using bash.
- Run [`compile.bat`](/shaders/compile.bat) batch file if you're using Windows.
All shaders are located in the [shaders](/shaders) folder and will be automatically compiled to SPIR-V format during the CMake configuration time. The result SPIR-V binary files are located in the `build/shader` folder.

## Milestones

Expand Down
49 changes: 49 additions & 0 deletions cmake/CompileShader.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
function(target_link_shaders TARGET)
if (${Vulkan_glslc_FOUND})
message(STATUS "Using Vulkan glslc for shader compilation.")
elseif (NOT ${Vulkan_glslc_FOUND} AND ${Vulkan_glslangValidator_FOUND})
message(WARNING "Vulkan glslc not found, using glslangValidator for shader compilation instead. Modifying indirectly included files will NOT trigger recompilation.")
else()
message(FATAL_ERROR "No shader compiler found.")
endif ()

foreach (source IN LISTS ARGN)
# Get filename from source.
cmake_path(GET source FILENAME filename)

# Make source path absolute.
cmake_path(ABSOLUTE_PATH source OUTPUT_VARIABLE source)

set(output "shader/${filename}.spv")

if (${Vulkan_glslc_FOUND})
set(depfile "shader_depfile/${filename}.d")
add_custom_command(
OUTPUT "${output}"
COMMAND ${Vulkan_GLSLC_EXECUTABLE} -MD -MF "${depfile}" $<$<NOT:$<CONFIG:Debug>>:-O> --target-env=vulkan1.2 "${source}" -o "${output}"
DEPENDS "${source}"
BYPRODUCTS "${depfile}"
COMMENT "Compiling SPIRV: ${source} -> ${output}"
DEPFILE "${depfile}"
VERBATIM
COMMAND_EXPAND_LISTS
)
elseif (${Vulkan_glslangValidator_FOUND})
add_custom_command(
OUTPUT "${output}"
COMMAND ${Vulkan_GLSLANG_VALIDATOR_EXECUTABLE} -V --target-env vulkan1.2 "${source}" -o "${output}"
DEPENDS "${source}"
COMMENT "Compiling SPIRV: ${source} -> ${output}"
VERBATIM
COMMAND_EXPAND_LISTS
)
endif ()

# Make target depends on output shader file.
string(CONFIGURE "${TARGET}_${filename}" shader_target)
add_custom_target("${shader_target}" DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${output}")
add_dependencies("${TARGET}" "${shader_target}")
endforeach ()

target_compile_definitions(${TARGET} PRIVATE COMPILED_SHADER_DIR="shader")
endfunction()
1 change: 1 addition & 0 deletions shaders/blend_faceted_primitive.frag
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_EXT_shader_8bit_storage : require
Expand Down
1 change: 1 addition & 0 deletions shaders/blend_primitive.frag
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_EXT_shader_8bit_storage : require
Expand Down
1 change: 1 addition & 0 deletions shaders/blend_unlit_primitive.frag
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_EXT_shader_8bit_storage : require
Expand Down
2 changes: 2 additions & 0 deletions shaders/brdfmap.comp
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#version 450
#extension GL_GOOGLE_include_directive : require

#include "pbr.glsl"

const float PI = 3.1415926535;
Expand Down
14 changes: 0 additions & 14 deletions shaders/compile.bat

This file was deleted.

13 changes: 0 additions & 13 deletions shaders/compile.sh

This file was deleted.

2 changes: 2 additions & 0 deletions shaders/cubemap.comp
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#version 450
#extension GL_GOOGLE_include_directive : require

#include "cubemap.glsl"

const vec2 INV_ATAN = vec2(0.1591, 0.3183);
Expand Down
1 change: 1 addition & 0 deletions shaders/depth.vert
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_buffer_reference : require
#extension GL_EXT_shader_explicit_arithmetic_types_int64 : require
Expand Down
1 change: 1 addition & 0 deletions shaders/faceted_primitive.frag
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_EXT_shader_8bit_storage : require
Expand Down
1 change: 1 addition & 0 deletions shaders/faceted_primitive.vert
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_buffer_reference : require
#extension GL_EXT_buffer_reference2 : require
Expand Down
1 change: 1 addition & 0 deletions shaders/jump_flood_seed.vert
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_buffer_reference : require
#extension GL_EXT_shader_explicit_arithmetic_types_int64 : require
Expand Down
1 change: 1 addition & 0 deletions shaders/mask_depth.frag
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_shader_8bit_storage : require
Expand Down
1 change: 1 addition & 0 deletions shaders/mask_depth.vert
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_buffer_reference : require
#extension GL_EXT_buffer_reference2 : require
Expand Down
1 change: 1 addition & 0 deletions shaders/mask_faceted_primitive.frag
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_EXT_shader_8bit_storage : require
Expand Down
1 change: 1 addition & 0 deletions shaders/mask_jump_flood_seed.frag
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 450
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_shader_8bit_storage : require
Expand Down
1 change: 1 addition & 0 deletions shaders/mask_jump_flood_seed.vert
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_buffer_reference : require
#extension GL_EXT_buffer_reference2 : require
Expand Down
1 change: 1 addition & 0 deletions shaders/mask_primitive.frag
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_EXT_shader_8bit_storage : require
Expand Down
1 change: 1 addition & 0 deletions shaders/mask_unlit_primitive.frag
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_EXT_shader_8bit_storage : require
Expand Down
2 changes: 2 additions & 0 deletions shaders/prefilteredmap.comp
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#version 450
#extension GL_GOOGLE_include_directive : require

#include "cubemap.glsl"
#include "pbr.glsl"

Expand Down
1 change: 1 addition & 0 deletions shaders/primitive.frag
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_EXT_shader_8bit_storage : require
Expand Down
1 change: 1 addition & 0 deletions shaders/primitive.vert
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_buffer_reference : require
#extension GL_EXT_buffer_reference2 : require
Expand Down
1 change: 1 addition & 0 deletions shaders/spherical_harmonics.comp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_samplerless_texture_functions : require
#extension GL_KHR_shader_subgroup_arithmetic : require
#extension GL_EXT_scalar_block_layout : require
Expand Down
1 change: 1 addition & 0 deletions shaders/unlit_primitive.frag
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_nonuniform_qualifier : require
#extension GL_EXT_shader_8bit_storage : require
Expand Down
1 change: 1 addition & 0 deletions shaders/unlit_primitive.vert
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#version 460
#extension GL_GOOGLE_include_directive : require
#extension GL_EXT_shader_16bit_storage : require
#extension GL_EXT_buffer_reference : require
#extension GL_EXT_buffer_reference2 : require
Expand Down

0 comments on commit 6252728

Please sign in to comment.