forked from NVIDIAGameWorks/RayTracingDenoiser
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathShaderCompilation.cmake
149 lines (134 loc) · 7.06 KB
/
ShaderCompilation.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# DXC on Windows does not like forward slashes
if(WIN32)
string(REPLACE "/" "\\" SHADER_INCLUDE_PATH "${SHADER_FILES}/Include")
# Needed only for WinSDK before 22000
string(REPLACE "/" "\\" MATHLIB_INCLUDE_PATH "${MATHLIB_INCLUDE_PATH}")
endif()
# Find FXC and DXC
if(WIN32)
if(DEFINED CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION)
set(WINDOWS_SDK_VERSION ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION})
elseif(DEFINED ENV{WindowsSDKLibVersion})
string(REGEX REPLACE "\\\\$" "" WINDOWS_SDK_VERSION "$ENV{WindowsSDKLibVersion}")
else()
message(FATAL_ERROR "WindowsSDK is not installed.(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION is not defined; WindowsSDKLibVersion is '$ENV{WindowsSDKLibVersion}')")
endif()
get_filename_component(WINDOWS_SDK_ROOT
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot10]" ABSOLUTE)
set(WINDOWS_SDK_BIN "${WINDOWS_SDK_ROOT}/bin/${WINDOWS_SDK_VERSION}/x64")
# On Windows, FXC and DXC are part of WindowsSDK and there's also DXC in VulkanSDK which supports SPIR-V
find_program(FXC_PATH "${WINDOWS_SDK_BIN}/fxc")
if(NOT FXC_PATH)
message(FATAL_ERROR "Can't find FXC: '${WINDOWS_SDK_BIN}/fxc'")
endif()
find_program(DXC_PATH "${WINDOWS_SDK_BIN}/dxc")
if(NOT DXC_PATH)
message(FATAL_ERROR "Can't find DXC: '${WINDOWS_SDK_BIN}/dxc'")
endif()
find_program(DXC_SPIRV_PATH "$ENV{VULKAN_SDK}/Bin/dxc")
if(NOT DXC_SPIRV_PATH)
message("Can't find VulkanSDK DXC: '$ENV{VULKAN_SDK}/Bin/dxc'")
find_program(DXC_SPIRV_PATH "dxc" "${NRD_DXC_CUSTOM_PATH}")
if(NOT DXC_SPIRV_PATH)
message(FATAL_ERROR "Can't find DXC: Specify custom path using 'NRD_DXC_CUSTOM_PATH' parameter or install VulkanSDK")
endif()
endif()
else()
# On Linux, VulkanSDK does not set VULKAN_SDK, but DXC can be called directly
find_program(DXC_SPIRV_PATH "dxc")
if(NOT DXC_SPIRV_PATH)
find_program(DXC_SPIRV_PATH "${NRD_DXC_CUSTOM_PATH}")
if(NOT DXC_SPIRV_PATH)
message(FATAL_ERROR "Can't find DXC: Specify custom path using 'NRD_DXC_CUSTOM_PATH' parameter or install VulkanSDK")
endif()
endif()
endif()
message("Using FXC path: '${FXC_PATH}'")
message("Using DXC path: '${DXC_PATH}'")
message("Using DXC(for SPIRV) path: '${DXC_SPIRV_PATH}'")
function(get_shader_profile_from_name FILE_NAME DXC_PROFILE FXC_PROFILE)
get_filename_component(EXTENSION ${FILE_NAME} EXT)
if("${EXTENSION}" STREQUAL ".cs.hlsl")
set(DXC_PROFILE "cs_6_3" PARENT_SCOPE)
set(FXC_PROFILE "cs_5_0" PARENT_SCOPE)
endif()
endfunction()
macro(list_hlsl_headers HLSL_FILES HEADER_FILES)
foreach(FILE_NAME ${HLSL_FILES})
set(DXC_PROFILE "")
set(FXC_PROFILE "")
get_shader_profile_from_name(${FILE_NAME} DXC_PROFILE FXC_PROFILE)
if("${DXC_PROFILE}" STREQUAL "" AND "${FXC_PROFILE}" STREQUAL "")
list(APPEND HEADER_FILES ${FILE_NAME})
set_source_files_properties(${FILE_NAME} PROPERTIES VS_TOOL_OVERRIDE "None")
endif()
endforeach()
endmacro()
set(VK_S_SHIFT 100)
set(VK_T_SHIFT 200)
set(VK_B_SHIFT 300)
set(VK_U_SHIFT 400)
set(DXC_VK_SHIFTS
-fvk-s-shift ${VK_S_SHIFT} 0 -fvk-s-shift ${VK_S_SHIFT} 1 -fvk-s-shift ${VK_S_SHIFT} 2
-fvk-t-shift ${VK_T_SHIFT} 0 -fvk-t-shift ${VK_T_SHIFT} 1 -fvk-t-shift ${VK_T_SHIFT} 2
-fvk-b-shift ${VK_B_SHIFT} 0 -fvk-b-shift ${VK_B_SHIFT} 1 -fvk-b-shift ${VK_B_SHIFT} 2
-fvk-u-shift ${VK_U_SHIFT} 0 -fvk-u-shift ${VK_U_SHIFT} 1 -fvk-u-shift ${VK_U_SHIFT} 2)
macro(list_hlsl_shaders HLSL_FILES HEADER_FILES SHADER_FILES)
foreach(FILE_NAME ${HLSL_FILES})
get_filename_component(NAME_ONLY ${FILE_NAME} NAME)
string(REGEX REPLACE "\\.[^.]*$" "" NAME_ONLY ${NAME_ONLY})
string(REPLACE "." "_" BYTECODE_ARRAY_NAME "${NAME_ONLY}")
set(DXC_PROFILE "")
set(FXC_PROFILE "")
set(OUTPUT_PATH_DXBC "${NRD_SHADERS_PATH}/${NAME_ONLY}.dxbc")
set(OUTPUT_PATH_DXIL "${NRD_SHADERS_PATH}/${NAME_ONLY}.dxil")
set(OUTPUT_PATH_SPIRV "${NRD_SHADERS_PATH}/${NAME_ONLY}.spirv")
get_shader_profile_from_name(${FILE_NAME} DXC_PROFILE FXC_PROFILE)
# DXBC
if(NOT "${FXC_PROFILE}" STREQUAL "" AND NOT "${FXC_PATH}" STREQUAL "")
add_custom_command(
OUTPUT ${OUTPUT_PATH_DXBC} ${OUTPUT_PATH_DXBC}.h
COMMAND ${FXC_PATH} /nologo /E main /T ${FXC_PROFILE} /WX /O3 /all_resources_bound
/DNRD_COMPILER_FXC=1 /DNRD_NORMAL_ENCODING=${NRD_NORMAL_ENCODING} /DNRD_ROUGHNESS_ENCODING=${NRD_ROUGHNESS_ENCODING}
/I "${MATHLIB_INCLUDE_PATH}" /I "${SHADER_INCLUDE_PATH}"
"${FILE_NAME}" /Vn g_${BYTECODE_ARRAY_NAME}_dxbc /Fh ${OUTPUT_PATH_DXBC}.h /Fo ${OUTPUT_PATH_DXBC}
MAIN_DEPENDENCY ${FILE_NAME}
DEPENDS ${HEADER_FILES}
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Shaders"
VERBATIM
)
list(APPEND SHADER_FILES ${OUTPUT_PATH_DXBC} ${OUTPUT_PATH_DXBC}.h)
endif()
# DXIL
if(NOT "${DXC_PROFILE}" STREQUAL "" AND NOT "${DXC_PATH}" STREQUAL "")
add_custom_command(
OUTPUT ${OUTPUT_PATH_DXIL} ${OUTPUT_PATH_DXIL}.h
COMMAND ${DXC_PATH} -E main -T ${DXC_PROFILE} -WX -O3 -enable-16bit-types -all_resources_bound
-DNRD_COMPILER_DXC=1 -DNRD_NORMAL_ENCODING=${NRD_NORMAL_ENCODING} -DNRD_ROUGHNESS_ENCODING=${NRD_ROUGHNESS_ENCODING}
-I "${MATHLIB_INCLUDE_PATH}" -I "${SHADER_INCLUDE_PATH}"
"${FILE_NAME}" -Vn g_${BYTECODE_ARRAY_NAME}_dxil -Fh ${OUTPUT_PATH_DXIL}.h -Fo ${OUTPUT_PATH_DXIL}
MAIN_DEPENDENCY ${FILE_NAME}
DEPENDS ${HEADER_FILES}
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Shaders"
VERBATIM
)
list(APPEND SHADER_FILES ${OUTPUT_PATH_DXIL} ${OUTPUT_PATH_DXIL}.h)
endif()
# SPIRV
if(NOT "${DXC_PROFILE}" STREQUAL "" AND NOT "${DXC_SPIRV_PATH}" STREQUAL "")
add_custom_command(
OUTPUT ${OUTPUT_PATH_SPIRV} ${OUTPUT_PATH_SPIRV}.h
COMMAND ${DXC_SPIRV_PATH} -E main -T ${DXC_PROFILE} -WX -O3 -enable-16bit-types -all_resources_bound
-DNRD_COMPILER_DXC=1 -DVULKAN=1 -DNRD_NORMAL_ENCODING=${NRD_NORMAL_ENCODING} -DNRD_ROUGHNESS_ENCODING=${NRD_ROUGHNESS_ENCODING}
-I "${MATHLIB_INCLUDE_PATH}" -I "${SHADER_INCLUDE_PATH}"
"${FILE_NAME}" -Vn g_${BYTECODE_ARRAY_NAME}_spirv -Fh ${OUTPUT_PATH_SPIRV}.h -Fo ${OUTPUT_PATH_SPIRV} ${DXC_VK_SHIFTS}
-spirv
MAIN_DEPENDENCY ${FILE_NAME}
DEPENDS ${HEADER_FILES}
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/Shaders"
VERBATIM
)
list(APPEND SHADER_FILES ${OUTPUT_PATH_SPIRV} ${OUTPUT_PATH_SPIRV}.h)
endif()
endforeach()
endmacro()