yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Lujin WangUpdate build to allow setting external mimalloc path (#8676)d0641da8c

master
10.8 KiB340 linesraw
1# Don't let all these packages spam up with status messages, filter to only the
2# important stuff.
3# Don't change things however if the user has explicitly set
4# CMAKE_MESSAGE_LOG_LEVEL
5set(set_cmake_log_level FALSE)
6if(NOT CMAKE_MESSAGE_LOG_LEVEL)
7    set(set_cmake_log_level TRUE)
8    set(CMAKE_MESSAGE_LOG_LEVEL NOTICE)
9endif()
10
11if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25")
12    set(system SYSTEM)
13else()
14    message(
15        STATUS
16        "CMake 3.25 is required to suppress warnings originating in headers in external/ but you are using ${CMAKE_VERSION}, be prepared for some warnings"
17    )
18    set(system)
19endif()
20
21# Similarly, disable warnings for external projects
22if(NOT SLANG_ENABLE_EXTERNAL_COMPILER_WARNINGS)
23    if(NOT MSVC)
24        add_compile_options(-w)
25    endif()
26endif()
27
28# Unordered dense
29if(NOT ${SLANG_USE_SYSTEM_UNORDERED_DENSE})
30    if(NOT SLANG_OVERRIDE_UNORDERED_DENSE_PATH)
31        add_subdirectory(unordered_dense EXCLUDE_FROM_ALL ${system})
32    else()
33        add_subdirectory(
34            ${SLANG_OVERRIDE_UNORDERED_DENSE_PATH}/unordered_dense
35            unordered_dense
36            EXCLUDE_FROM_ALL
37            ${system}
38        )
39    endif()
40endif()
41
42# Miniz
43if(NOT ${SLANG_USE_SYSTEM_MINIZ})
44    if(NOT SLANG_OVERRIDE_MINIZ_PATH)
45        add_subdirectory(miniz EXCLUDE_FROM_ALL ${system})
46    else()
47        add_subdirectory(
48            ${SLANG_OVERRIDE_MINIZ_PATH}/miniz
49            miniz
50            EXCLUDE_FROM_ALL
51            ${system}
52        )
53    endif()
54    set_property(TARGET miniz PROPERTY POSITION_INDEPENDENT_CODE ON)
55    # Work around https://github.com/richgel999/miniz/pull/292
56    get_target_property(miniz_c_launcher miniz C_COMPILER_LAUNCHER)
57    if(MSVC AND miniz_c_launcher MATCHES "ccache")
58        set_property(TARGET miniz PROPERTY C_COMPILER_LAUNCHER)
59        set_property(TARGET miniz PROPERTY MSVC_DEBUG_INFORMATION_FORMAT "")
60    endif()
61endif()
62
63# LZ4
64if(NOT ${SLANG_USE_SYSTEM_LZ4})
65    set(LZ4_BUNDLED_MODE ON)
66    if(NOT SLANG_OVERRIDE_LZ4_PATH)
67        add_subdirectory(lz4/build/cmake EXCLUDE_FROM_ALL ${system})
68    else()
69        add_subdirectory(
70            ${SLANG_OVERRIDE_LZ4_PATH}/lz4/build/cmake
71            lz4/build/cmake
72            EXCLUDE_FROM_ALL
73            ${system}
74        )
75    endif()
76    if(MSVC)
77        target_compile_options(
78            lz4_static
79            PRIVATE /wd5045 /wd4820 /wd4711 /wd6385 /wd6262
80        )
81    endif()
82endif()
83
84# Vulkan headers
85if(NOT TARGET Vulkan::Headers)
86    if(NOT ${SLANG_USE_SYSTEM_VULKAN_HEADERS})
87        if(NOT SLANG_OVERRIDE_VULKAN_HEADERS_PATH)
88            add_subdirectory(vulkan EXCLUDE_FROM_ALL ${system})
89        else()
90            add_subdirectory(
91                ${SLANG_OVERRIDE_VULKAN_HEADERS_PATH}/vulkan
92                vulkan
93                EXCLUDE_FROM_ALL
94                ${system}
95            )
96        endif()
97    endif()
98endif()
99
100# metal-cpp headers
101add_library(metal-cpp INTERFACE)
102target_include_directories(
103    metal-cpp
104    INTERFACE "${CMAKE_CURRENT_LIST_DIR}/metal-cpp"
105)
106
107# SPIRV-Headers
108# Avoid using ${system} intentionally in `add_subdirectory`, because if we do, it will end up using
109# spirv.h installed in the system directory on MacOS.
110if(NOT TARGET SPIRV-Headers)
111    if(SLANG_USE_SYSTEM_SPIRV_HEADERS)
112        if(SLANG_OVERRIDE_SPIRV_HEADERS_PATH)
113            message(
114                WARNING
115                "SLANG_OVERRIDE_SPIRV_HEADERS_PATH does nothing when SLANG_USE_SPIRV_HEADERS is set"
116            )
117        endif()
118    elseif(SLANG_OVERRIDE_SPIRV_HEADERS_PATH)
119        add_subdirectory(
120            ${SLANG_OVERRIDE_SPIRV_HEADERS_PATH}/spirv-headers
121            spirv-headers
122            EXCLUDE_FROM_ALL
123        )
124    else()
125        add_subdirectory(spirv-headers EXCLUDE_FROM_ALL)
126    endif()
127endif()
128
129if(SLANG_ENABLE_SLANG_GLSLANG)
130    # When using spirv headers via find_package, SPIRV-Headers_SOURCE_DIR is not set
131    # SPIRV-Tools requires that variable, as it uses it to detect if SPIRV-Headers is provided by the consumer.
132    # Fake a source build by setting it here. Ideally SPIRV-Tools should not depend on _SOURCE_DIR
133    if(${SLANG_USE_SYSTEM_SPIRV_HEADERS})
134        get_target_property(
135            SPIRV-Headers_SOURCE_DIR
136            SPIRV-Headers::SPIRV-Headers
137            INTERFACE_INCLUDE_DIRECTORIES
138        )
139        cmake_path(
140            GET
141            SPIRV-Headers_SOURCE_DIR
142            PARENT_PATH SPIRV-Headers_SOURCE_DIR
143        )
144    endif()
145
146    if(NOT ${SLANG_USE_SYSTEM_SPIRV_TOOLS})
147        # SPIRV-Tools
148        set(SPIRV_TOOLS_BUILD_STATIC ON)
149        set(SPIRV_WERROR OFF)
150        set(SPIRV_SKIP_TESTS ON)
151
152        # Enable mimalloc for SPIRV-Tools to improve compilation performance
153        # Based on SPIRV-Tools PR #6267: https://github.com/KhronosGroup/SPIRV-Tools/pull/6267
154        if(SLANG_ENABLE_SPIRV_TOOLS_MIMALLOC)
155            if(NOT SLANG_OVERRIDE_MIMALLOC_PATH)
156                # Place mimalloc in slang/external instead of spirv-tools/external for better organization
157                set(MIMALLOC_PATH "${CMAKE_CURRENT_SOURCE_DIR}/mimalloc")
158            else()
159                set(MIMALLOC_PATH "${SLANG_OVERRIDE_MIMALLOC_PATH}/mimalloc")
160            endif()
161
162            # Download mimalloc if it's not available
163            if(NOT EXISTS "${MIMALLOC_PATH}/CMakeLists.txt")
164                message(
165                    STATUS
166                    "mimalloc not found at ${MIMALLOC_PATH} - downloading..."
167                )
168                execute_process(
169                    COMMAND
170                        ${GIT_EXECUTABLE} clone --depth 1 --branch v2.1.7
171                        https://github.com/microsoft/mimalloc.git
172                        "${MIMALLOC_PATH}"
173                    RESULT_VARIABLE git_result
174                    OUTPUT_QUIET
175                    ERROR_QUIET
176                )
177                if(git_result EQUAL 0)
178                    # Point SPIRV-Tools to our mimalloc location
179                    set(mimalloc_SOURCE_DIR "${MIMALLOC_PATH}")
180                    set(SPIRV_TOOLS_USE_MIMALLOC ON)
181                    set(SPIRV_TOOLS_USE_MIMALLOC_IN_STATIC_BUILD ON)
182                    # set(MI_INSTALL_TOPLEVEL OFF)
183                    message(
184                        STATUS
185                        "Successfully downloaded and enabled mimalloc for SPIRV-Tools at ${MIMALLOC_PATH}"
186                    )
187                else()
188                    message(
189                        WARNING
190                        "Failed to download mimalloc. Building SPIRV-Tools without mimalloc support."
191                    )
192                endif()
193            endif()
194
195            # Check if mimalloc is available now
196            if(EXISTS "${MIMALLOC_PATH}/CMakeLists.txt")
197                # Point SPIRV-Tools to our mimalloc location
198                set(mimalloc_SOURCE_DIR "${MIMALLOC_PATH}")
199                set(SPIRV_TOOLS_USE_MIMALLOC ON)
200                # Also enable mimalloc in static builds for better performance
201                set(SPIRV_TOOLS_USE_MIMALLOC_IN_STATIC_BUILD ON)
202                # Disable mimalloc installation to avoid install target conflicts
203                # set(MI_INSTALL_TOPLEVEL OFF)
204                message(
205                    STATUS
206                    "Enabling mimalloc for SPIRV-Tools (including static builds) from ${MIMALLOC_PATH}"
207                )
208            endif()
209        endif()
210
211        # Tools
212        if(NOT SLANG_OVERRIDE_SPIRV_TOOLS_PATH)
213            add_subdirectory(spirv-tools EXCLUDE_FROM_ALL)
214        else()
215            add_subdirectory(
216                ${SLANG_OVERRIDE_SPIRV_TOOLS_PATH}/spirv-tools
217                spirv-tools
218                EXCLUDE_FROM_ALL
219            )
220        endif()
221    endif()
222
223    if(NOT ${SLANG_USE_SYSTEM_GLSLANG})
224        # glslang
225        set(SKIP_GLSLANG_INSTALL ON)
226        set(ENABLE_OPT ON)
227        set(ENABLE_PCH OFF)
228        set(ALLOW_EXTERNAL_SPIRV_TOOLS ${SLANG_USE_SYSTEM_SPIRV_TOOLS})
229        if(NOT SLANG_OVERRIDE_GLSLANG_PATH)
230            add_subdirectory(glslang EXCLUDE_FROM_ALL ${system})
231        else()
232            add_subdirectory(
233                ${SLANG_OVERRIDE_GLSLANG_PATH}/glslang
234                glslang
235                EXCLUDE_FROM_ALL
236                ${system}
237            )
238        endif()
239    endif()
240endif()
241
242# imgui
243add_library(imgui INTERFACE)
244if(NOT SLANG_OVERRIDE_IMGUI_PATH)
245    target_include_directories(
246        imgui
247        ${system}
248        INTERFACE "${CMAKE_CURRENT_LIST_DIR}/imgui"
249    )
250else()
251    target_include_directories(
252        imgui
253        ${system}
254        INTERFACE "${SLANG_OVERRIDE_IMGUI_PATH}/imgui"
255    )
256endif()
257
258# stb
259add_library(stb INTERFACE)
260target_include_directories(
261    stb
262    ${system}
263    INTERFACE "${CMAKE_CURRENT_LIST_DIR}/stb"
264)
265
266# slang-rhi
267if(SLANG_ENABLE_SLANG_RHI)
268    set(SLANG_RHI_BUILD_FROM_SLANG_REPO ON)
269    set(SLANG_RHI_BUILD_TESTS ON)
270    set(SLANG_RHI_BUILD_TESTS_WITH_GLFW OFF)
271    set(SLANG_RHI_INSTALL OFF)
272    set(SLANG_RHI_BINARY_DIR ${CMAKE_BINARY_DIR}/$<CONFIG>/bin)
273    set(SLANG_RHI_FETCH_SLANG OFF)
274    set(SLANG_RHI_SLANG_INCLUDE_DIR ${slang_SOURCE_DIR}/include)
275    set(SLANG_RHI_SLANG_BINARY_DIR ${CMAKE_BINARY_DIR})
276    set(SLANG_RHI_ENABLE_NVAPI ${SLANG_ENABLE_NVAPI})
277
278    # CoopVec requires 1.717.0-preview, but we cannot use the version until slang-rhi
279    # allow slang to override D3D12Version value
280    #set(SLANG_RHI_AGILITY_SDK_VERSION D3D12_PREVIEW_SDK_VERSION)
281    #set(SLANG_RHI_FETCH_AGILITY_SDK_VERSION
282    #    "1.717.0-preview"
283    #    CACHE STRING
284    #    "Agility SDK version to fetch"
285    #    FORCE
286    #)
287
288    if(SLANG_ENABLE_DX_ON_VK)
289        set(SLANG_RHI_HAS_D3D12 ON)
290    endif()
291    if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
292        set(SLANG_RHI_ENABLE_WGPU OFF)
293    endif()
294    if(MINGW)
295        set(SLANG_RHI_ENABLE_D3D11 OFF)
296        set(SLANG_RHI_ENABLE_D3D12 OFF)
297    endif()
298    if(NOT SLANG_OVERRIDE_SLANG_RHI_PATH)
299        add_subdirectory(slang-rhi)
300    else()
301        add_subdirectory(
302            ${SLANG_OVERRIDE_SLANG_RHI_PATH}/slang-rhi
303            slang-rhi
304            EXCLUDE_FROM_ALL
305            ${system}
306        )
307    endif()
308
309    # Output slang-rhi-tests to the bin directory so we can run it easily.
310    set_target_properties(
311        slang-rhi-tests
312        PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/$<CONFIG>/bin
313    )
314endif()
315
316# Tidy things up:
317
318# Restore log level if we set it
319if(set_cmake_log_level)
320    unset(CMAKE_MESSAGE_LOG_LEVEL)
321endif()
322
323# for this directory and all subdirectories, prepend
324# `external/` to the IDE FOLDER property to every target
325function(make_external dir)
326    get_property(external_targets DIRECTORY ${dir} PROPERTY BUILDSYSTEM_TARGETS)
327    foreach(external_target ${external_targets})
328        get_property(folder TARGET ${external_target} PROPERTY FOLDER)
329        set_property(
330            TARGET ${external_target}
331            PROPERTY FOLDER "external/${folder}"
332        )
333    endforeach()
334
335    get_property(subdirs DIRECTORY ${dir} PROPERTY SUBDIRECTORIES)
336    foreach(subdir ${subdirs})
337        make_external(${subdir})
338    endforeach()
339endfunction()
340make_external(.)