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