2222set (SCRIPT_DIR ${CMAKE_CURRENT_LIST_DIR} )
2323
2424function (add_sample)
25- set (options )
25+ set (options )
2626 set (oneValueArgs ID CATEGORY AUTHOR NAME DESCRIPTION DXC_ADDITIONAL_ARGUMENTS GLSLC_ADDITIONAL_ARGUMENTS)
2727 set (multiValueArgs FILES LIBS SHADER_FILES_GLSL SHADER_FILES_HLSL SHADER_FILES_SLANG)
2828
@@ -35,7 +35,7 @@ function(add_sample)
3535 AUTHOR ${TARGET_AUTHOR}
3636 NAME ${TARGET_NAME}
3737 DESCRIPTION ${TARGET_DESCRIPTION}
38- TAGS
38+ TAGS
3939 "any"
4040 FILES
4141 ${TARGET_FILES}
@@ -54,7 +54,7 @@ endfunction()
5454function (add_sample_with_tags)
5555 set (options )
5656 set (oneValueArgs ID CATEGORY AUTHOR NAME DESCRIPTION DXC_ADDITIONAL_ARGUMENTS GLSLC_ADDITIONAL_ARGUMENTS)
57- set (multiValueArgs TAGS FILES LIBS SHADER_FILES_GLSL SHADER_FILES_HLSL SHADER_FILES_SLANG)
57+ set (multiValueArgs TAGS FILES LIBS SHADER_FILES_GLSL SHADER_FILES_HLSL SHADER_FILES_SLANG SHADER_FILES_SPVASM )
5858
5959 cmake_parse_arguments (TARGET "${options} " "${oneValueArgs} " "${multiValueArgs} " ${ARGN} )
6060
@@ -83,7 +83,12 @@ function(add_sample_with_tags)
8383 # Add slang shader files for this sample
8484 foreach (SHADER_FILE_SLANG ${TARGET_SHADER_FILES_SLANG} )
8585 list (APPEND SHADERS_SLANG "${PROJECT_SOURCE_DIR} /shaders/${SHADER_FILE_SLANG} " )
86- endforeach ()
86+ endforeach ()
87+
88+ # Add spvasm shader files for this sample
89+ foreach (SHADER_FILE_SPVASM ${TARGET_SHADER_FILES_SPVASM} )
90+ list (APPEND SHADERS_SPVASM "${PROJECT_SOURCE_DIR} /shaders/${SHADER_FILE_SPVASM} " )
91+ endforeach ()
8792
8893 add_project(
8994 TYPE "Sample"
@@ -92,7 +97,7 @@ function(add_sample_with_tags)
9297 AUTHOR ${TARGET_AUTHOR}
9398 NAME ${TARGET_NAME}
9499 DESCRIPTION ${TARGET_DESCRIPTION}
95- TAGS
100+ TAGS
96101 ${TARGET_TAGS}
97102 FILES
98103 ${SRC_FILES}
@@ -103,15 +108,17 @@ function(add_sample_with_tags)
103108 SHADERS_HLSL
104109 ${SHADERS_HLSL}
105110 SHADERS_SLANG
106- ${SHADERS_SLANG}
111+ ${SHADERS_SLANG}
112+ SHADERS_SPVASM
113+ ${SHADERS_SPVASM}
107114 DXC_ADDITIONAL_ARGUMENTS ${TARGET_DXC_ADDITIONAL_ARGUMENTS}
108115 GLSLC_ADDITIONAL_ARGUMENTS ${TARGET_GLSLC_ADDITIONAL_ARGUMENTS} )
109116endfunction ()
110117
111118function (add_project)
112- set (options )
119+ set (options )
113120 set (oneValueArgs TYPE ID CATEGORY AUTHOR NAME DESCRIPTION DXC_ADDITIONAL_ARGUMENTS GLSLC_ADDITIONAL_ARGUMENTS)
114- set (multiValueArgs TAGS FILES LIBS SHADERS_GLSL SHADERS_HLSL SHADERS_SLANG)
121+ set (multiValueArgs TAGS FILES LIBS SHADERS_GLSL SHADERS_HLSL SHADERS_SLANG SHADERS_SPVASM )
115122
116123 cmake_parse_arguments (TARGET "${options} " "${oneValueArgs} " "${multiValueArgs} " ${ARGN} )
117124
@@ -138,16 +145,19 @@ function(add_project)
138145 if (TARGET_SHADERS_HLSL)
139146 source_group ("\\ Shaders\\ hlsl" FILES ${TARGET_SHADERS_HLSL} )
140147 # Disable automatic compilation of HLSL shaders for MSVC
141- set_source_files_properties (SOURCE ${SHADERS_HLSL} PROPERTIES VS_SETTINGS "ExcludedFromBuild=true" )
148+ set_source_files_properties (SOURCE ${SHADERS_HLSL} PROPERTIES VS_SETTINGS "ExcludedFromBuild=true" )
142149 endif ()
143150 if (TARGET_SHADERS_SLANG)
144151 source_group ("\\ Shaders\\ slang" FILES ${TARGET_SHADERS_SLANG} )
145- endif ()
152+ endif ()
153+ if (TARGET_SHADERS_SPVASM)
154+ source_group ("\\ Shaders\\ spvasm" FILES ${TARGET_SHADERS_SPVASM} )
155+ endif ()
146156
147157if (${TARGET_TYPE} STREQUAL "Sample" )
148- add_library (${PROJECT_NAME} OBJECT ${TARGET_FILES} ${SHADERS_GLSL} ${SHADERS_HLSL} ${SHADERS_SLANG} )
158+ add_library (${PROJECT_NAME} OBJECT ${TARGET_FILES} ${SHADERS_GLSL} ${SHADERS_HLSL} ${SHADERS_SLANG} ${SHADERS_SPVASM} )
149159elseif (${TARGET_TYPE} STREQUAL "Test" )
150- add_library (${PROJECT_NAME} STATIC ${TARGET_FILES} ${SHADERS_GLSL} ${SHADERS_HLSL} ${SHADERS_SLANG} )
160+ add_library (${PROJECT_NAME} STATIC ${TARGET_FILES} ${SHADERS_GLSL} ${SHADERS_HLSL} ${SHADERS_SLANG} ${SHADERS_SPVASM} )
151161endif ()
152162 set_target_properties (${PROJECT_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON )
153163
@@ -160,15 +170,15 @@ endif()
160170 target_link_libraries (${PROJECT_NAME} PUBLIC ${TARGET_LIBS} )
161171 endif ()
162172
163- # capitalise the first letter of the category (performance -> Performance)
173+ # capitalise the first letter of the category (performance -> Performance)
164174 string (SUBSTRING ${TARGET_CATEGORY} 0 1 FIRST_LETTER)
165175 string (TOUPPER ${FIRST_LETTER} FIRST_LETTER)
166176 string (REGEX REPLACE "^.(.*)" "${FIRST_LETTER} \\ 1" CATEGORY "${TARGET_CATEGORY} " )
167177
168178 if (${TARGET_TYPE} STREQUAL "Sample" )
169179 # set sample properties
170180 set_target_properties (${PROJECT_NAME}
171- PROPERTIES
181+ PROPERTIES
172182 SAMPLE_CATEGORY ${TARGET_CATEGORY}
173183 SAMPLE_AUTHOR ${TARGET_AUTHOR}
174184 SAMPLE_NAME ${TARGET_NAME}
@@ -185,12 +195,12 @@ endif()
185195 if (VKB_DO_CLANG_TIDY)
186196 set_target_properties (${PROJECT_NAME} PROPERTIES CXX_CLANG_TIDY "${VKB_DO_CLANG_TIDY} " )
187197 endif ()
188-
198+
189199 # HLSL compilation via DXC
190200 if (Vulkan_dxc_EXECUTABLE AND DEFINED SHADERS_HLSL)
191201 set (OUTPUT_FILES "" )
192202 set (HLSL_TARGET_NAME ${PROJECT_NAME} -HLSL)
193- foreach (SHADER_FILE_HLSL ${TARGET_SHADERS_HLSL} )
203+ foreach (SHADER_FILE_HLSL ${TARGET_SHADERS_HLSL} )
194204 get_filename_component (HLSL_SPV_FILE ${SHADER_FILE_HLSL} NAME_WLE)
195205 get_filename_component (bare_name ${HLSL_SPV_FILE} NAME_WLE)
196206 get_filename_component (extension ${HLSL_SPV_FILE} LAST_EXT)
@@ -242,7 +252,7 @@ endif()
242252 endforeach ()
243253 add_custom_target (${HLSL_TARGET_NAME} DEPENDS ${OUTPUT_FILES} )
244254 set_property (TARGET ${HLSL_TARGET_NAME} PROPERTY FOLDER "Shaders-HLSL" )
245- add_dependencies (${PROJECT_NAME} ${HLSL_TARGET_NAME} )
255+ add_dependencies (${PROJECT_NAME} ${HLSL_TARGET_NAME} )
246256 endif ()
247257
248258 # Slang shader compilation
@@ -274,11 +284,11 @@ endif()
274284 endforeach ()
275285 add_custom_target (${SLANG_TARGET_NAME} DEPENDS ${OUTPUT_FILES} )
276286 set_property (TARGET ${SLANG_TARGET_NAME} PROPERTY FOLDER "Shaders-SLANG" )
277- add_dependencies (${PROJECT_NAME} ${SLANG_TARGET_NAME} )
287+ add_dependencies (${PROJECT_NAME} ${SLANG_TARGET_NAME} )
278288 endif ()
279289
280290 # GLSL shader compilation
281- if (Vulkan_glslc_EXECUTABLE AND DEFINED SHADERS_GLSL)
291+ if (Vulkan_glslc_EXECUTABLE AND DEFINED SHADERS_GLSL)
282292 set (GLSL_TARGET_NAME ${PROJECT_NAME} -GLSL)
283293 set (OUTPUT_FILES "" )
284294 foreach (SHADER_FILE_GLSL ${TARGET_SHADERS_GLSL} )
@@ -293,9 +303,22 @@ endif()
293303 set (OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR} /shader-glsl-spv" )
294304 set (OUTPUT_FILE ${OUTPUT_DIR} /${bare_name}${extension} .spv)
295305 file (MAKE_DIRECTORY ${OUTPUT_DIR} )
306+
307+ # NOTE: Vulkan SDK has old glslc but new glslang. We must use glslang to compile shaders from `tensor_and_data_graph`.
308+ # TODO: Remove workaround once glslc is updated.
309+ if ("${CMAKE_CURRENT_BINARY_DIR} " MATCHES "tensor_and_data_graph" AND NOT ${SHADER_FILE_GLSL} MATCHES "base" )
310+ # glslang (NOT glslangValidator, as that also seems to be old)
311+ string (REPLACE "glslangValidator" "glslang" GLSLANG_EXECUTABLE ${Vulkan_GLSLANG_VALIDATOR_EXECUTABLE} )
312+ SET (COMPILE_COMMAND ${GLSLANG_EXECUTABLE} ${SHADER_FILE_GLSL} -o ${OUTPUT_FILE} -V -I"${CMAKE_SOURCE_DIR} /shaders/includes/glsl" ${TARGET_GLSLC_ADDITIONAL_ARGUMENTS} )
313+ else ()
314+ # glslc
315+ SET (COMPILE_COMMAND ${Vulkan_glslc_EXECUTABLE} ${SHADER_FILE_GLSL} -o ${OUTPUT_FILE} -I "${CMAKE_SOURCE_DIR} /shaders/includes/glsl" ${TARGET_GLSLC_ADDITIONAL_ARGUMENTS} )
316+ endif ()
317+
318+
296319 add_custom_command (
297320 OUTPUT ${OUTPUT_FILE}
298- COMMAND ${Vulkan_glslc_EXECUTABLE} ${SHADER_FILE_GLSL} -o ${OUTPUT_FILE} -I " ${CMAKE_SOURCE_DIR} /shaders/includes/glsl" ${TARGET_GLSLC_ADDITIONAL_ARGUMENTS }
321+ COMMAND ${COMPILE_COMMAND }
299322 COMMAND ${CMAKE_COMMAND} -E copy ${OUTPUT_FILE} ${directory}
300323 MAIN_DEPENDENCY ${SHADER_FILE_GLSL}
301324 WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
@@ -310,4 +333,34 @@ endif()
310333 add_dependencies (${PROJECT_NAME} ${GLSL_TARGET_NAME} )
311334 endif ()
312335
336+ # spvasm shader compilation
337+ if (Vulkan_spirvas_EXECUTABLE AND DEFINED SHADERS_SPVASM)
338+ set (SPVASM_TARGET_NAME ${PROJECT_NAME} -SPVASM)
339+ set (OUTPUT_FILES "" )
340+ foreach (SHADER_FILE_SPVASM ${TARGET_SHADERS_SPVASM} )
341+ get_filename_component (SPVASM_FILE ${SHADER_FILE_SPVASM} NAME_WLE)
342+ get_filename_component (bare_name ${SPVASM_FILE} NAME_WLE)
343+ get_filename_component (extension ${SHADER_FILE_SPVASM} LAST_EXT)
344+ get_filename_component (directory ${SHADER_FILE_SPVASM} DIRECTORY )
345+ set (OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR} /shader-spvasm-spv" )
346+ set (OUTPUT_FILE ${OUTPUT_DIR} /${bare_name}${extension} .spv)
347+ file (MAKE_DIRECTORY ${OUTPUT_DIR} )
348+ add_custom_command (
349+ OUTPUT ${OUTPUT_FILE}
350+ COMMAND ${Vulkan_spirvas_EXECUTABLE} ${SHADER_FILE_SPVASM} -o ${OUTPUT_FILE} ${TARGET_SPVASM_ADDITIONAL_ARGUMENTS}
351+ COMMAND ${CMAKE_COMMAND} -E copy ${OUTPUT_FILE} ${directory}
352+ MAIN_DEPENDENCY ${SHADER_FILE_SPVASM}
353+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
354+ )
355+ list (APPEND OUTPUT_FILES ${OUTPUT_FILE} )
356+ set_source_files_properties (${OUTPUT_FILE} PROPERTIES
357+ MACOSX_PACKAGE_LOCATION Resources
358+ )
359+ endforeach ()
360+ add_custom_target (${SPVASM_TARGET_NAME} DEPENDS ${OUTPUT_FILES} )
361+ set_property (TARGET ${SPVASM_TARGET_NAME} PROPERTY FOLDER "Shaders-SPVASM" )
362+ add_dependencies (${PROJECT_NAME} ${SPVASM_TARGET_NAME} )
363+
364+ endif ()
365+
313366endfunction ()
0 commit comments