Skip to content

Commit 40906a4

Browse files
CMake: added FindWindowsSDK.cmake utility
copy_required_dlls: always copy dxc dlls when WebGPU is enabled
1 parent 86f8fe9 commit 40906a4

File tree

4 files changed

+150
-145
lines changed

4 files changed

+150
-145
lines changed

BuildTools/CMake/BuildUtils.cmake

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -52,44 +52,39 @@ if(PLATFORM_WIN32)
5252
endforeach(DLL)
5353

5454
# Copy D3Dcompiler_47.dll, dxcompiler.dll, and dxil.dll
55-
if(MSVC)
56-
if ((D3D11_SUPPORTED OR D3D12_SUPPORTED) AND D3D_COMPILER_PATH)
57-
list(APPEND SHADER_COMPILER_DLLS "${D3D_COMPILER_PATH}")
58-
endif()
55+
if ((D3D11_SUPPORTED OR D3D12_SUPPORTED) AND D3D_COMPILER_PATH)
56+
list(APPEND SHADER_COMPILER_DLLS "${D3D_COMPILER_PATH}")
57+
endif()
5958

60-
if(arg_DXC_REQUIRED AND D3D12_SUPPORTED AND DXC_COMPILER_PATH AND DXIL_SIGNER_PATH)
61-
# For the compiler to sign the bytecode, you have to have a copy of dxil.dll in
62-
# the same folder as the dxcompiler.dll at runtime.
59+
# Dawn uses DXC, so we need to copy the DXC dlls even if DXC_REQUIRED is not set
60+
# to get consistent shader compilation results
61+
if(((arg_DXC_REQUIRED AND D3D12_SUPPORTED) OR WEBGPU_SUPPORTED) AND DXC_COMPILER_PATH AND DXIL_SIGNER_PATH)
62+
# For the compiler to sign the bytecode, you have to have a copy of dxil.dll in
63+
# the same folder as the dxcompiler.dll at runtime.
6364

64-
list(APPEND SHADER_COMPILER_DLLS "${DXC_COMPILER_PATH}")
65-
list(APPEND SHADER_COMPILER_DLLS "${DXIL_SIGNER_PATH}")
66-
endif()
65+
list(APPEND SHADER_COMPILER_DLLS "${DXC_COMPILER_PATH}")
66+
list(APPEND SHADER_COMPILER_DLLS "${DXIL_SIGNER_PATH}")
67+
endif()
6768

68-
foreach(DLL ${SHADER_COMPILER_DLLS})
69-
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
70-
COMMAND ${CMAKE_COMMAND} -E copy_if_different
71-
${DLL}
72-
"\"$<TARGET_FILE_DIR:${TARGET_NAME}>\"")
73-
endforeach(DLL)
74-
75-
if(D3D12_SUPPORTED AND EXISTS ${DILIGENT_PIX_EVENT_RUNTIME_DLL_PATH})
76-
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
77-
COMMAND ${CMAKE_COMMAND} -E copy_if_different
78-
${DILIGENT_PIX_EVENT_RUNTIME_DLL_PATH}
79-
"\"$<TARGET_FILE_DIR:${TARGET_NAME}>\"")
80-
endif()
69+
foreach(DLL ${SHADER_COMPILER_DLLS})
70+
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
71+
COMMAND ${CMAKE_COMMAND} -E copy_if_different
72+
${DLL}
73+
"\"$<TARGET_FILE_DIR:${TARGET_NAME}>\"")
74+
endforeach(DLL)
8175

82-
if(arg_DXC_REQUIRED AND VULKAN_SUPPORTED)
83-
if(NOT DEFINED DILIGENT_DXCOMPILER_FOR_SPIRV_PATH)
84-
message(FATAL_ERROR "DILIGENT_DXCOMPILER_FOR_SPIRV_PATH is undefined, check order of cmake includes")
85-
endif()
86-
if(EXISTS ${DILIGENT_DXCOMPILER_FOR_SPIRV_PATH})
87-
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
88-
COMMAND ${CMAKE_COMMAND} -E copy_if_different
89-
${DILIGENT_DXCOMPILER_FOR_SPIRV_PATH}
90-
"\"$<TARGET_FILE_DIR:${TARGET_NAME}>/spv_dxcompiler.dll\"")
91-
endif()
92-
endif()
76+
if(D3D12_SUPPORTED AND EXISTS "${DILIGENT_PIX_EVENT_RUNTIME_DLL_PATH}")
77+
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
78+
COMMAND ${CMAKE_COMMAND} -E copy_if_different
79+
"${DILIGENT_PIX_EVENT_RUNTIME_DLL_PATH}"
80+
"\"$<TARGET_FILE_DIR:${TARGET_NAME}>\"")
81+
endif()
82+
83+
if(arg_DXC_REQUIRED AND VULKAN_SUPPORTED AND EXISTS "${DILIGENT_DXCOMPILER_FOR_SPIRV_PATH}")
84+
add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
85+
COMMAND ${CMAKE_COMMAND} -E copy_if_different
86+
"${DILIGENT_DXCOMPILER_FOR_SPIRV_PATH}"
87+
"\"$<TARGET_FILE_DIR:${TARGET_NAME}>/spv_dxcompiler.dll\"")
9388
endif()
9489
endfunction()
9590

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# Finds Windows SDK and sets the following cache variables:
2+
# - WINDOWS_SDK_VERSION (e.g. 10.0.22621.0). If not found, set to 0.0
3+
# - WINDOWS_SDK_BIN_DIR (e.g. C:/Program Files (x86)/Windows Kits/10/bin/10.0.22621.0/x64)
4+
# - D3D_COMPILER_PATH (e.g. C:/Program Files (x86)/Windows Kits/10/bin/10.0.22621.0/x64/D3Dcompiler_47.dll)
5+
# - DXC_COMPILER_PATH (e.g. C:/Program Files (x86)/Windows Kits/10/bin/10.0.22621.0/x64/dxcompiler.dll)
6+
# - DXIL_SIGNER_PATH (e.g. C:/Program Files (x86)/Windows Kits/10/bin/10.0.22621.0/x64/dxil.dll)
7+
function(find_windows_sdk)
8+
# Determine Windows SDK version
9+
if (CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION)
10+
set(WINDOWS_SDK_VERSION ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION} CACHE INTERNAL "Windows SDK version")
11+
elseif(DEFINED ENV{WindowsSDKVersion})
12+
set(WINDOWS_SDK_VERSION $ENV{WindowsSDKVersion})
13+
# For unbeknown reason, the value ends with a backslash, so we need to remove it
14+
string(REPLACE "\\" "" WINDOWS_SDK_VERSION ${WINDOWS_SDK_VERSION})
15+
set(WINDOWS_SDK_VERSION ${WINDOWS_SDK_VERSION} CACHE INTERNAL "Windows SDK version")
16+
else()
17+
set(WINDOWS_SDK_VERSION "0.0" CACHE INTERNAL "Windows SDK version")
18+
message(WARNING "Unable to determine Windows SDK version: neither the CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION CMake variable nor the WindowsSDKVersion environment variable is set")
19+
endif()
20+
21+
if ("${WINDOWS_SDK_VERSION}" VERSION_GREATER "0.0")
22+
message("")
23+
message("Windows SDK version: ${WINDOWS_SDK_VERSION}")
24+
endif()
25+
26+
unset(WINDOWS_SDK_BIN_DIR CACHE)
27+
unset(D3D_COMPILER_PATH CACHE)
28+
unset(DXC_COMPILER_PATH CACHE)
29+
unset(DXIL_SIGNER_PATH CACHE)
30+
31+
if ("${WINDOWS_SDK_VERSION}" VERSION_GREATER_EQUAL "10.0")
32+
# Get Windows SDK root directory from registry
33+
get_filename_component(
34+
WINDOWS_KITS_ROOT
35+
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot10]"
36+
ABSOLUTE
37+
)
38+
if (NOT WINDOWS_KITS_ROOT)
39+
message(WARNING "Unable to read Windows SDK root directory from registry")
40+
elseif(NOT EXISTS "${WINDOWS_KITS_ROOT}")
41+
message(WARNING "Windows SDK root directory does not exist: ${WINDOWS_KITS_ROOT}")
42+
unset(WINDOWS_KITS_ROOT)
43+
endif()
44+
45+
if(WINDOWS_KITS_ROOT)
46+
# NOTE: CMAKE_GENERATOR_PLATFORM is not set for single-configuration generators (e.g. Makefile, Ninja)
47+
if (${CMAKE_SIZEOF_VOID_P} EQUAL 8)
48+
if (("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64") OR ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AARCH64"))
49+
set(ARCH_SUFFIX "arm64")
50+
else()
51+
set(ARCH_SUFFIX "x64")
52+
endif()
53+
else()
54+
if (("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm") OR ("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "ARM"))
55+
set(ARCH_SUFFIX "arm")
56+
else()
57+
set(ARCH_SUFFIX "x86")
58+
endif()
59+
endif()
60+
61+
set(WINDOWS_SDK_BIN_DIR "${WINDOWS_KITS_ROOT}/bin/${WINDOWS_SDK_VERSION}/${ARCH_SUFFIX}")
62+
if (EXISTS "${WINDOWS_SDK_BIN_DIR}")
63+
set(WINDOWS_SDK_BIN_DIR "${WINDOWS_SDK_BIN_DIR}" CACHE INTERNAL "Windows SDK bin directory")
64+
message(STATUS "Windows SDK bin directory: " ${WINDOWS_SDK_BIN_DIR})
65+
66+
set(D3D_COMPILER_PATH "${WINDOWS_SDK_BIN_DIR}/D3Dcompiler_47.dll")
67+
68+
# DXC is only present in Windows SDK starting with version 10.0.17763.0
69+
if("${WINDOWS_SDK_VERSION}" VERSION_GREATER_EQUAL "10.0.17763.0")
70+
set(DXC_COMPILER_PATH "${WINDOWS_SDK_BIN_DIR}/dxcompiler.dll")
71+
set(DXIL_SIGNER_PATH "${WINDOWS_SDK_BIN_DIR}/dxil.dll")
72+
endif()
73+
else()
74+
message(WARNING "Windows SDK bin directory does not exist: ${WINDOWS_SDK_BIN_DIR}")
75+
unset(WINDOWS_SDK_BIN_DIR)
76+
endif()
77+
endif()
78+
elseif("${WINDOWS_SDK_VERSION}" VERSION_EQUAL "8.1")
79+
# D3Dcompiler_47.dll from Win8.1 SDK is ancient (from 2013) and fails to
80+
# compile a number of test shaders. Use the compiler from Visual Studio
81+
# executable path instead
82+
if(CMAKE_AR AND IS_ABSOLUTE "${CMAKE_AR}")
83+
get_filename_component(CMAKE_AR_DIR "${CMAKE_AR}" DIRECTORY)
84+
set(D3D_COMPILER_PATH "${CMAKE_AR_DIR}/D3Dcompiler_47.dll")
85+
endif()
86+
endif()
87+
88+
if(D3D_COMPILER_PATH)
89+
if(EXISTS "${D3D_COMPILER_PATH}")
90+
message(STATUS "Found D3Dcompiler_47.dll: ${D3D_COMPILER_PATH}")
91+
set(D3D_COMPILER_PATH "${D3D_COMPILER_PATH}" CACHE INTERNAL "D3Dcompiler_47.dll path")
92+
else()
93+
message(WARNING "Cannot find D3Dcompiler_47.dll. File does not exist: ${D3D_COMPILER_PATH}")
94+
endif()
95+
endif()
96+
97+
if (DXC_COMPILER_PATH)
98+
if (EXISTS "${DXC_COMPILER_PATH}")
99+
message(STATUS "Found dxcompiler.dll: ${DXC_COMPILER_PATH}")
100+
set(DXC_COMPILER_PATH "${DXC_COMPILER_PATH}" CACHE INTERNAL "dxcompiler.dll path")
101+
else()
102+
message(WARNING "Cannot find dxcompiler.dll. File does not exist: ${DXC_COMPILER_PATH}")
103+
endif()
104+
endif()
105+
106+
if (DXIL_SIGNER_PATH)
107+
if (EXISTS "${DXIL_SIGNER_PATH}")
108+
message(STATUS "Found dxil.dll: ${DXIL_SIGNER_PATH}")
109+
set(DXIL_SIGNER_PATH "${DXIL_SIGNER_PATH}" CACHE INTERNAL "dxil.dll path")
110+
else()
111+
message(WARNING "Cannot find dxil.dll. File does not exist: ${DXIL_SIGNER_PATH}")
112+
endif()
113+
endif()
114+
115+
message("")
116+
117+
endfunction() # find_windows_sdk

CMakeLists.txt

Lines changed: 4 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -101,69 +101,15 @@ endif()
101101
message("CMake generator: " ${CMAKE_GENERATOR})
102102

103103
if(WIN32)
104-
# Determine Windows SDK version
105-
if (CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION)
106-
set(WINDOWS_SDK_VERSION ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION} CACHE INTERNAL "Windows SDK version")
107-
elseif(DEFINED ENV{WindowsSDKVersion})
108-
set(WINDOWS_SDK_VERSION $ENV{WindowsSDKVersion})
109-
# For unbeknown reason, the value ends with a backslash, so we need to remove it
110-
string(REPLACE "\\" "" WINDOWS_SDK_VERSION ${WINDOWS_SDK_VERSION})
111-
set(WINDOWS_SDK_VERSION ${WINDOWS_SDK_VERSION} CACHE INTERNAL "Windows SDK version")
112-
else()
113-
set(WINDOWS_SDK_VERSION "0.0" CACHE INTERNAL "Windows SDK version")
114-
message(WARNING "Unable to determine Windows SDK version: neither the CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION CMake variable nor the WindowsSDKVersion environment variable is set")
115-
endif()
116-
117-
# Get Windows SDK bin directory
118-
unset(WINDOWS_SDK_BIN_DIR CACHE)
119-
if ("${WINDOWS_SDK_VERSION}" VERSION_GREATER_EQUAL "10.0")
120-
get_filename_component(
121-
WINDOWS_KITS_ROOT
122-
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot10]"
123-
ABSOLUTE
124-
)
125-
if (NOT WINDOWS_KITS_ROOT)
126-
message(WARNING "Unable to read Windows SDK root directory from registry")
127-
elseif(NOT EXISTS "${WINDOWS_KITS_ROOT}")
128-
message(WARNING "Windows SDK root directory does not exist: ${WINDOWS_KITS_ROOT}")
129-
unset(WINDOWS_KITS_ROOT)
130-
endif()
131-
132-
if(WINDOWS_KITS_ROOT)
133-
# NOTE: CMAKE_GENERATOR_PLATFORM is not set for single-configuration generators (e.g. Makefile, Ninja)
134-
if (${CMAKE_SIZEOF_VOID_P} EQUAL 8)
135-
if ("${TARGET_CPU}" STREQUAL "arm")
136-
set(ARCH_SUFFIX "arm64")
137-
else()
138-
set(ARCH_SUFFIX "x64")
139-
endif()
140-
else()
141-
if ("${TARGET_CPU}" STREQUAL "arm")
142-
set(ARCH_SUFFIX "arm")
143-
else()
144-
set(ARCH_SUFFIX "x86")
145-
endif()
146-
endif()
147-
148-
set(WINDOWS_SDK_BIN_DIR "${WINDOWS_KITS_ROOT}/bin/${WINDOWS_SDK_VERSION}/${ARCH_SUFFIX}")
149-
if (EXISTS "${WINDOWS_SDK_BIN_DIR}")
150-
set(WINDOWS_SDK_BIN_DIR "${WINDOWS_SDK_BIN_DIR}" CACHE INTERNAL "Windows SDK bin directory")
151-
else()
152-
message(WARNING "Windows SDK bin directory does not exist: ${WINDOWS_SDK_BIN_DIR}")
153-
unset(WINDOWS_SDK_BIN_DIR)
154-
endif()
155-
endif()
156-
endif()
104+
include(BuildTools/CMake/FindWindowsSDK.cmake)
105+
find_windows_sdk()
157106

158107
if(${CMAKE_SYSTEM_NAME} STREQUAL "WindowsStore")
159108
set(PLATFORM_UNIVERSAL_WINDOWS TRUE CACHE INTERNAL "Target platform: Windows Store")
160-
message("Target platform: Universal Windows " ${ARCH} ". Windows SDK Version: " ${WINDOWS_SDK_VERSION})
109+
message("Target platform: Universal Windows " ${ARCH})
161110
else()
162111
set(PLATFORM_WIN32 TRUE CACHE INTERNAL "Target platform: Win32") #WIN32 is a variable, so we cannot use string "WIN32"
163-
message("Target platform: Win32 " ${ARCH} ". Windows SDK Version: " ${WINDOWS_SDK_VERSION})
164-
endif()
165-
if(WINDOWS_SDK_BIN_DIR)
166-
message(STATUS "Windows SDK bin directory: " ${WINDOWS_SDK_BIN_DIR})
112+
message("Target platform: Win32 " ${ARCH})
167113
endif()
168114
else()
169115
if(${CMAKE_SYSTEM_NAME} STREQUAL "Android")

Graphics/GraphicsEngineD3DBase/CMakeLists.txt

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -71,59 +71,6 @@ if(DILIGENT_INSTALL_CORE)
7171
install_core_lib(Diligent-GraphicsEngineD3DBase)
7272
endif()
7373

74-
# Set paths to D3Dcompiler_47.dll, dxcompiler.dll, and dxil.dll
75-
if(WIN32)
76-
unset(D3D_COMPILER_PATH CACHE)
77-
unset(DXC_COMPILER_PATH CACHE)
78-
unset(DXIL_SIGNER_PATH CACHE)
79-
80-
if("${WINDOWS_SDK_VERSION}" VERSION_GREATER_EQUAL "10.0" AND WINDOWS_SDK_BIN_DIR)
81-
set(D3D_COMPILER_PATH "${WINDOWS_SDK_BIN_DIR}/D3Dcompiler_47.dll")
82-
83-
# DXC is only present in Windows SDK starting with version 10.0.17763.0
84-
if("${WINDOWS_SDK_VERSION}" VERSION_GREATER_EQUAL "10.0.17763.0")
85-
set(DXC_COMPILER_PATH "${WINDOWS_SDK_BIN_DIR}/dxcompiler.dll")
86-
set(DXIL_SIGNER_PATH "${WINDOWS_SDK_BIN_DIR}/dxil.dll")
87-
endif()
88-
elseif("${WINDOWS_SDK_VERSION}" VERSION_EQUAL "8.1")
89-
# D3Dcompiler_47.dll from Win8.1 SDK is ancient (from 2013) and fails to
90-
# compile a number of test shaders. Use the compiler from Visual Studio
91-
# executable path instead
92-
if(CMAKE_AR AND IS_ABSOLUTE "${CMAKE_AR}")
93-
get_filename_component(CMAKE_AR_DIR "${CMAKE_AR}" DIRECTORY)
94-
set(D3D_COMPILER_PATH "${CMAKE_AR_DIR}/D3Dcompiler_47.dll")
95-
endif()
96-
endif()
97-
98-
if(D3D_COMPILER_PATH)
99-
if(EXISTS "${D3D_COMPILER_PATH}")
100-
message(STATUS "Found D3Dcompiler_47.dll: ${D3D_COMPILER_PATH}")
101-
set(D3D_COMPILER_PATH "${D3D_COMPILER_PATH}" CACHE INTERNAL "D3Dcompiler_47.dll path")
102-
else()
103-
message(WARNING "Cannot find D3Dcompiler_47.dll. File does not exist: ${D3D_COMPILER_PATH}")
104-
endif()
105-
endif()
106-
107-
if (DXC_COMPILER_PATH)
108-
if (EXISTS "${DXC_COMPILER_PATH}")
109-
message(STATUS "Found dxcompiler.dll: ${DXC_COMPILER_PATH}")
110-
set(DXC_COMPILER_PATH "${DXC_COMPILER_PATH}" CACHE INTERNAL "dxcompiler.dll path")
111-
else()
112-
message(WARNING "Cannot find dxcompiler.dll. File does not exist: ${DXC_COMPILER_PATH}")
113-
endif()
114-
endif()
115-
116-
if (DXIL_SIGNER_PATH)
117-
if (EXISTS "${DXIL_SIGNER_PATH}")
118-
message(STATUS "Found dxil.dll: ${DXIL_SIGNER_PATH}")
119-
set(DXIL_SIGNER_PATH "${DXIL_SIGNER_PATH}" CACHE INTERNAL "dxil.dll path")
120-
else()
121-
message(WARNING "Cannot find dxil.dll. File does not exist: ${DXIL_SIGNER_PATH}")
122-
endif()
123-
endif()
124-
endif()
125-
126-
12774
if(EXISTS "${DILIGENT_NVAPI_PATH}/nvapi.h")
12875
message(STATUS "Using NVApi from ${DILIGENT_NVAPI_PATH}")
12976
if(${CMAKE_SIZEOF_VOID_P} EQUAL 8)

0 commit comments

Comments
 (0)