Skip to content

Commit 422555b

Browse files
committed
Refactor shader compilation functions to use absolute output paths and improve handling of individual shader sources in CMake
1 parent 5e7b4f4 commit 422555b

File tree

1 file changed

+35
-17
lines changed

1 file changed

+35
-17
lines changed

attachments/CMakeLists.txt

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -64,42 +64,60 @@ find_program(SLANGC_EXECUTABLE slangc HINTS $ENV{VULKAN_SDK}/bin REQUIRED)
6464
function (add_shaders_target TARGET)
6565
cmake_parse_arguments ("SHADER" "" "CHAPTER_NAME" "SOURCES" ${ARGN})
6666
set (SHADERS_DIR ${SHADER_CHAPTER_NAME}/shaders)
67+
set (SHADERS_FULL_DIR ${CMAKE_CURRENT_BINARY_DIR}/${SHADERS_DIR})
6768
add_custom_command (
68-
OUTPUT ${SHADERS_DIR}
69-
COMMAND ${CMAKE_COMMAND} -E make_directory ${SHADERS_DIR}
69+
OUTPUT ${SHADERS_FULL_DIR}
70+
COMMAND ${CMAKE_COMMAND} -E make_directory ${SHADERS_FULL_DIR}
7071
)
71-
add_custom_command (
72-
OUTPUT ${SHADERS_DIR}/frag.spv ${SHADERS_DIR}/vert.spv
73-
COMMAND glslang::validator
74-
ARGS --target-env vulkan1.0 ${SHADER_SOURCES} --quiet
75-
WORKING_DIRECTORY ${SHADERS_DIR}
76-
DEPENDS ${SHADERS_DIR} ${SHADER_SOURCES}
77-
COMMENT "Compiling Shaders"
78-
VERBATIM
72+
# Create a list to store the output files
73+
set(SHADER_OUTPUTS "")
74+
75+
# Create separate commands for each shader file to ensure they are compiled to the correct location
76+
foreach(SHADER_SOURCE ${SHADER_SOURCES})
77+
get_filename_component(SHADER_NAME ${SHADER_SOURCE} NAME_WE)
78+
get_filename_component(SHADER_EXT ${SHADER_SOURCE} EXT)
79+
string(REPLACE "." "" SHADER_EXT ${SHADER_EXT})
80+
81+
# Add the output file to the list
82+
list(APPEND SHADER_OUTPUTS ${SHADERS_FULL_DIR}/${SHADER_EXT}.spv)
83+
84+
add_custom_command(
85+
OUTPUT ${SHADERS_FULL_DIR}/${SHADER_EXT}.spv
86+
COMMAND glslang::validator
87+
ARGS --target-env vulkan1.0 ${SHADER_SOURCE} --quiet -o ${SHADERS_FULL_DIR}/${SHADER_EXT}.spv
88+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
89+
DEPENDS ${SHADERS_FULL_DIR} ${SHADER_SOURCE}
90+
COMMENT "Compiling ${SHADER_EXT} Shader"
91+
VERBATIM
7992
)
80-
add_custom_target (${TARGET} DEPENDS ${SHADERS_DIR}/frag.spv ${SHADERS_DIR}/vert.spv)
93+
endforeach()
94+
95+
# Create the custom target that depends on all output files
96+
add_custom_target (${TARGET} DEPENDS ${SHADER_OUTPUTS})
8197
endfunction ()
8298

8399
function (add_slang_shader_target TARGET)
84100
cmake_parse_arguments ("SHADER" "" "CHAPTER_NAME" "SOURCES" ${ARGN})
85101
set (SHADERS_DIR ${SHADER_CHAPTER_NAME}/shaders)
102+
set (SHADERS_FULL_DIR ${CMAKE_CURRENT_BINARY_DIR}/${SHADERS_DIR})
86103
file(GLOB HAS_COMPUTE ${CHAPTER_SHADER}.comp)
87104
set (ENTRY_POINTS -entry vertMain -entry fragMain)
88105
if(HAS_COMPUTE)
89106
list(APPEND ENTRY_POINTS -entry compMain)
90107
endif()
91108
add_custom_command (
92-
OUTPUT ${SHADERS_DIR}
93-
COMMAND ${CMAKE_COMMAND} -E make_directory ${SHADERS_DIR}
109+
OUTPUT ${SHADERS_FULL_DIR}
110+
COMMAND ${CMAKE_COMMAND} -E make_directory ${SHADERS_FULL_DIR}
94111
)
95112
add_custom_command (
96-
OUTPUT ${SHADERS_DIR}/slang.spv
97-
COMMAND ${SLANGC_EXECUTABLE} ${SHADER_SOURCES} -target spirv -profile spirv_1_4 -emit-spirv-directly -fvk-use-entrypoint-name ${ENTRY_POINTS} -o ${CMAKE_CURRENT_LIST_DIR}/${SHADERS_DIR}/slang.spv
98-
DEPENDS ${SHADERS_DIR} ${SHADER_SOURCES}
113+
OUTPUT ${SHADERS_FULL_DIR}/slang.spv
114+
COMMAND ${CMAKE_COMMAND} -E make_directory ${SHADERS_FULL_DIR}
115+
COMMAND ${SLANGC_EXECUTABLE} ${SHADER_SOURCES} -target spirv -profile spirv_1_4 -emit-spirv-directly -fvk-use-entrypoint-name ${ENTRY_POINTS} -o ${CMAKE_CURRENT_BINARY_DIR}/${SHADERS_DIR}/slang.spv
116+
DEPENDS ${SHADER_SOURCES}
99117
COMMENT "Compiling Slang Shaders"
100118
VERBATIM
101119
)
102-
add_custom_target (${TARGET} DEPENDS ${SHADERS_DIR}/slang.spv)
120+
add_custom_target (${TARGET} DEPENDS ${SHADERS_FULL_DIR}/slang.spv)
103121
endfunction()
104122

105123
function (add_chapter CHAPTER_NAME)

0 commit comments

Comments
 (0)