1+ set (_NBL_DXC_CT_INCLUDE_ROOT_ "${NBL_ROOT_PATH} /include" ) # Nabla include root path
2+ set (_NBL_DXC_CT_BINARY_BIN_ "${CMAKE_CURRENT_BINARY_DIR} " ) # compile-test directory
3+
4+ if (_NBL_DXC_COMPILE_TESTS_ENABLE_CMAKE_LOG_)
5+ message ("${_NBL_DXC_CT_PREFIX_CMAKE_LOG_DEBUG_} _NBL_DXC_CT_INCLUDE_ROOT_ = '${_NBL_DXC_CT_INCLUDE_ROOT_} '" )
6+ message ("${_NBL_DXC_CT_PREFIX_CMAKE_LOG_DEBUG_} _NBL_DXC_CT_BINARY_BIN_ = '${_NBL_DXC_CT_BINARY_BIN_} '" )
7+ endif ()
8+
9+ ####################################
10+ # NBL_DXC_CT_ADD_INPUT_FILE function
11+ # @_NBL_INPUT_REL_FILEPATH_@ is path relative to _NBL_DXC_CT_INCLUDE_ROOT_, the file must be nested in _NBL_DXC_CT_INCLUDE_ROOT_ as well to follow Nabla include rules
12+ # @_NBL_PROFILE_@ is DXC target profile, e.g "lib_6_7"
13+ # @_NBL_ENTRY_POINT_@ is entry point name for both HLSL and SPIRV if enabled. Leave it as empty "" string to not specify the entry point explicitly
14+ # @_NBL_GENERATE_SPIRV_@ is a bool option for enabling SPIRV code generation
15+ #############################################################################
16+
17+ function (NBL_DXC_CT_ADD_INPUT_FILE _NBL_INPUT_REL_FILEPATH_ _NBL_PROFILE_ _NBL_ENTRY_POINT_ _NBL_GENERATE_SPIRV_)
18+ set (_SHADER_FILE_PATH_ "${_NBL_DXC_CT_INCLUDE_ROOT_} /${_NBL_INPUT_REL_FILEPATH_} " )
19+
20+ if (_NBL_DXC_COMPILE_TESTS_ENABLE_CMAKE_LOG_)
21+ message ("${_NBL_DXC_CT_PREFIX_CMAKE_LOG_DEBUG_} adding _SHADER_FILE_PATH_ = '${_SHADER_FILE_PATH_} ' as INPUT of DXC CT target" )
22+ endif ()
23+
24+ cmake_path(RELATIVE_PATH _SHADER_FILE_PATH_ BASE_DIRECTORY "${_NBL_DXC_CT_INCLUDE_ROOT_} " OUTPUT_VARIABLE _SHADER_NEW_RELATIVE_FILE_PATH_)
25+ cmake_path(GET _SHADER_NEW_RELATIVE_FILE_PATH_ STEM LAST_ONLY _SHADER_NEW_STEAM_)
26+ cmake_path(REMOVE_EXTENSION _SHADER_NEW_RELATIVE_FILE_PATH_ LAST_ONLY OUTPUT_VARIABLE _SHADER_NEW_RELATIVE_OUTPUT_DIR_)
27+
28+ set (_NBL_DXC_CT_CURRENT_OUTPUT_BIN_DIR_ "${_NBL_DXC_CT_BINARY_BIN_} /${_SHADER_NEW_RELATIVE_OUTPUT_DIR_} /bin" )
29+ set (_NBL_DXC_CT_CURRENT_OUTPUT_FILEPATH_ "${_NBL_DXC_CT_CURRENT_OUTPUT_BIN_DIR_} /${_SHADER_NEW_STEAM_} .bin" )
30+
31+ string (FIND "${_NBL_PROFILE_} " "lib" _TMP_FOUND_LIB_PROFILE_)
32+ if ("${_TMP_FOUND_LIB_PROFILE_} " STREQUAL "-1" )
33+ if (_NBL_GENERATE_SPIRV_)
34+ cmake_path(REPLACE_EXTENSION _NBL_DXC_CT_CURRENT_OUTPUT_FILEPATH_ "spv" )
35+ endif ()
36+ else ()
37+ cmake_path(REPLACE_EXTENSION _NBL_DXC_CT_CURRENT_OUTPUT_FILEPATH_ "dxil" )
38+ endif ()
39+ unset (_TMP_FOUND_LIB_PROFILE_)
40+
41+ # MSVC and other generators have "SetEnv" task - we need to make sure our enviroment is clean while invoking DXC compilation
42+ string (APPEND _TMP_CLEAN_ENV_ "set PATH=$ENV{PATH} \n set CAExcludePath=\n set LIB=\n set LIBPATH=\n set INCLUDE=\n set EXTERNAL_INCLUDE=\n " )
43+
44+ if (NOT "${_NBL_ENTRY_POINT_} " STREQUAL "" )
45+ string (APPEND _TMP_ENTRY_POINT_ARG_ "-E ${_NBL_ENTRY_POINT_} " )
46+ endif ()
47+
48+ if (_NBL_GENERATE_SPIRV_)
49+ string (APPEND _TMP_ENABLE_SPIRV_GEN_ARG_ "-spirv" )
50+ endif ()
51+
52+ # include-dependency input file chain
53+ set (_NBL_DXC_CT_CURRENT_DEPENDS_FILEPATH_ "${_NBL_DXC_CT_CURRENT_OUTPUT_BIN_DIR_} /depends.txt" )
54+ set (_NBL_DXC_CT_CURRENT_IDC_FILEPATH_ "${_NBL_DXC_CT_CURRENT_OUTPUT_BIN_DIR_} /depends.cmd" )
55+ string (APPEND _NBL_DXC_CT_WRAPPER_IDC_COMMAND_ "${_TMP_CLEAN_ENV_} \" ${DXC_EXT_EXECUTABLE} \" -HV 2021 -T ${_NBL_PROFILE_} ${_TMP_ENTRY_POINT_ARG_} ${_TMP_ENABLE_SPIRV_GEN_ARG_} -I\" ${_NBL_DXC_CT_INCLUDE_ROOT_} \" -Zi -MF \" ${_NBL_DXC_CT_CURRENT_DEPENDS_FILEPATH_} \" \" ${_SHADER_FILE_PATH_} \" " )
56+ file (WRITE "${_NBL_DXC_CT_CURRENT_IDC_FILEPATH_} " "${_NBL_DXC_CT_WRAPPER_IDC_COMMAND_} " )
57+
58+ # create a file contating paths to all input file's dependencies scanned recursively
59+ if (_NBL_DXC_COMPILE_TESTS_ENABLE_CMAKE_LOG_)
60+ execute_process (COMMAND "${_NBL_DXC_CT_CURRENT_IDC_FILEPATH_} " )
61+ else ()
62+ execute_process (COMMAND "${_NBL_DXC_CT_CURRENT_IDC_FILEPATH_} "
63+ OUTPUT_QUIET
64+ ERROR_QUIET
65+ )
66+ endif ()
67+
68+ file (READ "${_NBL_DXC_CT_CURRENT_DEPENDS_FILEPATH_} " _NBL_DXC_CT_DEPENDENCIES_)
69+ unset (_NBL_DXC_CT_WRAPPER_IDC_COMMAND_)
70+
71+ # filter DXC output MF's file dependencies and put them into CMake list
72+ string (REPLACE ": " ";" _NBL_DXC_CT_DEPENDENCIES_S_ "${_NBL_DXC_CT_DEPENDENCIES_} " )
73+ string (REPLACE " \\ " ";" _NBL_DXC_CT_DEPENDENCIES_S_ "${_NBL_DXC_CT_DEPENDENCIES_S_} " )
74+ string (REPLACE "\r " "" _NBL_DXC_CT_DEPENDENCIES_S_ "${_NBL_DXC_CT_DEPENDENCIES_S_} " )
75+ string (REPLACE "\n " "" _NBL_DXC_CT_DEPENDENCIES_S_ "${_NBL_DXC_CT_DEPENDENCIES_S_} " )
76+ string (STRIP "${_NBL_DXC_CT_DEPENDENCIES_S_} " _NBL_DXC_CT_DEPENDENCIES_S_)
77+ list (APPEND _NBL_DXC_CT_DEPENDENCIES_L_ "${_NBL_DXC_CT_DEPENDENCIES_S_} " )
78+ list (TRANSFORM _NBL_DXC_CT_DEPENDENCIES_L_ STRIP)
79+ list (REMOVE_DUPLICATES _NBL_DXC_CT_DEPENDENCIES_L_)
80+
81+ set (_NBL_DXC_CT_CURRENT_DEPS_LIST_ ${_NBL_DXC_CT_DEPENDENCIES_L_} )
82+ unset (_NBL_DXC_CT_DEPENDENCIES_)
83+ unset (_NBL_DXC_CT_DEPENDENCIES_S_)
84+ unset (_NBL_DXC_CT_DEPENDENCIES_L_)
85+
86+ # compile command
87+ string (APPEND _NBL_DXC_CT_WRAPPER_COMPILE_COMMAND_ "${_TMP_CLEAN_ENV_} \" ${DXC_EXT_EXECUTABLE} \" -HV 2021 -T ${_NBL_PROFILE_} ${_TMP_ENTRY_POINT_ARG_} ${_TMP_ENABLE_SPIRV_GEN_ARG_} -I\" ${_NBL_DXC_CT_INCLUDE_ROOT_} \" -Zi -Fo \" ${_NBL_DXC_CT_CURRENT_OUTPUT_FILEPATH_} \" \" ${_SHADER_FILE_PATH_} \" " )
88+ set (_NBL_DXC_CT_CURRENT_SHADER_COMPILE_FILEPATH_ "${_NBL_DXC_CT_CURRENT_OUTPUT_BIN_DIR_} /compile.cmd" )
89+ file (WRITE "${_NBL_DXC_CT_CURRENT_SHADER_COMPILE_FILEPATH_} " "${_NBL_DXC_CT_WRAPPER_COMPILE_COMMAND_} " )
90+
91+ unset (_NBL_DXC_CT_WRAPPER_COMPILE_COMMAND_)
92+ unset (_TMP_CLEAN_ENV_)
93+ unset (_TMP_ENTRY_POINT_ARG_)
94+ unset (_TMP_ENABLE_SPIRV_GEN_ARG_)
95+
96+ if (_NBL_DXC_COMPILE_TESTS_ENABLE_CMAKE_LOG_)
97+ message ("${_NBL_DXC_CT_PREFIX_CMAKE_LOG_DEBUG_} adding _NBL_DXC_CT_CURRENT_OUTPUT_FILEPATH_ = '${_NBL_DXC_CT_CURRENT_OUTPUT_FILEPATH_} ' as OUTPUT of DXC CT target" )
98+ endif ()
99+
100+ set (_NBL_DXC_CT_BIN_OUTPUTS_
101+ ${_NBL_DXC_CT_BIN_OUTPUTS_}
102+ "${_NBL_DXC_CT_CURRENT_OUTPUT_FILEPATH_} "
103+ PARENT_SCOPE)
104+
105+ # create custom command per input file with it's all dependencies listed as DEPENDS
106+ add_custom_command (
107+ OUTPUT "${_NBL_DXC_CT_CURRENT_OUTPUT_FILEPATH_} "
108+ COMMAND "${_NBL_DXC_CT_CURRENT_SHADER_COMPILE_FILEPATH_} "
109+ DEPENDS ${_NBL_DXC_CT_CURRENT_DEPS_LIST_}
110+ WORKING_DIRECTORY "${_NBL_DXC_CT_CURRENT_OUTPUT_BIN_DIR_} "
111+ USES_TERMINAL
112+ VERBATIM
113+ )
114+
115+ unset (_SHADER_FILE_PATH_)
116+ unset (_NBL_DXC_CT_CURRENT_OUTPUT_FILEPATH_)
117+ unset (_NBL_DXC_CT_CURRENT_SHADER_COMPILE_FILEPATH_)
118+ unset (_NBL_DXC_CT_CURRENT_DEPS_LIST_)
119+ endfunction ()
120+
121+ ###############################################################################
122+ # list files you would like to compile with DXC using NBL_DXC_CT_ADD_INPUT_FILE
123+ ###############################################################################
124+
125+ NBL_DXC_CT_ADD_INPUT_FILE("nbl/builtin/hlsl/barycentric/utils.hlsl" "lib_6_7" "" OFF )
126+
127+ # create custom targets for which DEPENDS are all of input files for DXC compile test
128+ add_custom_target (HLSL_NABLA_COMPILE_TEST DEPENDS ${_NBL_DXC_CT_BIN_OUTPUTS_}
129+ COMMENT "${CMAKE_COMMAND} " -E echo "Launching Nabla HLSL compile test..."
130+ )
131+
132+ unset (_NBL_DXC_CT_BIN_OUTPUTS_)
133+ unset (_NBL_DXC_CT_BINARY_BIN_)
134+ unset (_NBL_DXC_CT_INCLUDE_ROOT_)
0 commit comments