@@ -64,42 +64,60 @@ find_program(SLANGC_EXECUTABLE slangc HINTS $ENV{VULKAN_SDK}/bin REQUIRED)
6464function (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} )
8197endfunction ()
8298
8399function (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)
103121endfunction ()
104122
105123function (add_chapter CHAPTER_NAME)
0 commit comments