59 lines
2.5 KiB
CMake
59 lines
2.5 KiB
CMake
function(add_shader TARGET SHADER)
|
|
find_package(Vulkan REQUIRED COMPONENTS dxc)
|
|
|
|
get_filename_component(vulkan-bin-dir ${Vulkan_GLSLC_EXECUTABLE} DIRECTORY)
|
|
|
|
find_program(slangc_exe NAMES "slangc")
|
|
if (NOT slangc_exe STREQUAL "slangc_exe-NOTFOUND")
|
|
set(slangc_exe_FOUND true)
|
|
endif()
|
|
|
|
get_filename_component(shader-ext ${SHADER} LAST_EXT)
|
|
|
|
set(current-shader-path ${CMAKE_CURRENT_SOURCE_DIR}/${SHADER})
|
|
set(current-output-path ${CMAKE_CURRENT_BINARY_DIR}/${SHADER}.spv)
|
|
|
|
get_filename_component(current-output-dir ${current-output-path} DIRECTORY)
|
|
file(MAKE_DIRECTORY ${current-output-dir})
|
|
|
|
if (Vulkan_dxc_exe_FOUND AND ${shader-ext} STREQUAL ".hlsl")
|
|
message("Marked as hlsl file. ${current-output-path}")
|
|
|
|
get_filename_component(shader-inner ${SHADER} NAME_WLE)
|
|
get_filename_component(shader-type ${shader-inner} LAST_EXT)
|
|
string(REPLACE "." "" shader-type ${shader-type})
|
|
|
|
add_custom_command(
|
|
OUTPUT ${current-output-path}
|
|
COMMAND Vulkan::dxc_exe ${DXC_SHADER_FLAGS} -spirv -T "${shader-type}_6_0" -E main ${current-shader-path} -Fo ${current-output-path}
|
|
DEPENDS ${current-shader-path}
|
|
IMPLICIT_DEPENDS CXX ${current-shader-path}
|
|
VERBATIM)
|
|
elseif (Vulkan_glslc_FOUND AND ${shader-ext} STREQUAL ".glsl")
|
|
message("Marked as glsl file. ${current-output-path}")
|
|
add_custom_command(
|
|
OUTPUT ${current-output-path}
|
|
COMMAND Vulkan::glslc ${GLSLC_SHADER_FLAGS} -o ${current-output-path} ${current-shader-path}
|
|
DEPENDS ${current-shader-path}
|
|
IMPLICIT_DEPENDS CXX ${current-shader-path}
|
|
VERBATIM)
|
|
elseif (${shader-ext} STREQUAL ".slang")
|
|
message("Marked as slang file. ${current-output-path}")
|
|
add_custom_command(
|
|
OUTPUT ${current-output-path}
|
|
COMMAND ${slangc_exe} -target spirv -o ${current-output-path} ${current-shader-path}
|
|
DEPENDS ${current-shader-path}
|
|
IMPLICIT_DEPENDS CXX ${current-shader-path}
|
|
VERBATIM)
|
|
endif ()
|
|
|
|
# Make sure our build depends on this output.
|
|
set_source_files_properties(${current-output-path} PROPERTIES GENERATED TRUE)
|
|
target_sources(${TARGET} PRIVATE ${current-output-path})
|
|
endfunction(add_shader)
|
|
|
|
function(add_shaders TARGET SHADERS)
|
|
foreach(shader IN ${SHADERS})
|
|
add_shader(TARGET ${shader})
|
|
endforeach()
|
|
endfunction(add_shaders) |