1+ # ===========================================================================
2+ #
3+ # Daemon BSD Source Code
4+ # Copyright (c) 2025 Daemon Developers
5+ # All rights reserved.
6+ #
7+ # This file is part of the Daemon BSD Source Code (Daemon Source Code).
8+ #
9+ # Redistribution and use in source and binary forms, with or without
10+ # modification, are permitted provided that the following conditions are met:
11+ # * Redistributions of source code must retain the above copyright
12+ # notice, this list of conditions and the following disclaimer.
13+ # * Redistributions in binary form must reproduce the above copyright
14+ # notice, this list of conditions and the following disclaimer in the
15+ # documentation and/or other materials provided with the distribution.
16+ # * Neither the name of the Daemon developers nor the
17+ # names of its contributors may be used to endorse or promote products
18+ # derived from this software without specific prior written permission.
19+ #
20+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23+ # DISCLAIMED. IN NO EVENT SHALL DAEMON DEVELOPERS BE LIABLE FOR ANY
24+ # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27+ # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30+ #
31+ # ===========================================================================
32+
33+ option ( VULKAN_SPIRV_OUT "Output text SPIR-V files alongside the binary format." ON )
34+ option ( VULKAN_SPIRV_OPTIMISE "Enable SPIR-V optimisations." ON )
35+ option ( VULKAN_SPIRV_LTO "Enable link-time SPIR-V optimisations." ON )
36+
37+ set ( VULKAN_SPIRV_DEBUG "default" CACHE STRING "glslangValidator debug options (remove: g0, non-semantic: gV)" )
38+ set_property ( CACHE VULKAN_SPIRV_DEBUG PROPERTY STRINGS default remove non-semantic )
39+
40+ if ( USE_VULKAN )
41+ add_executable ( VulkanShaderParser "${DAEMON_DIR} /cmake/DaemonVulkan/VulkanShaderParser.cpp" )
42+
43+ set ( GRAPHICS_ENGINE_PATH ${DAEMON_DIR} /src/engine/renderer-vulkan/GraphicsEngine/ )
44+ set ( GRAPHICS_ENGINE_PROCESSED_PATH ${DAEMON_GENERATED_DIR} /DaemonVulkan/GraphicsEngine/ )
45+ target_compile_definitions ( VulkanShaderParser PRIVATE "-DDAEMON_VULKAN_GRAPHICS_ENGINE_PATH=\" ${GRAPHICS_ENGINE_PATH} \" " )
46+ target_compile_definitions ( VulkanShaderParser PRIVATE "-DDAEMON_VULKAN_GRAPHICS_ENGINE_PROCESSED_PATH=\" ${GRAPHICS_ENGINE_PROCESSED_PATH} \" " )
47+
48+ file ( MAKE_DIRECTORY ${GRAPHICS_ENGINE_PROCESSED_PATH} )
49+
50+ file ( MAKE_DIRECTORY ${DAEMON_GENERATED_DIR} /DaemonVulkan/GraphicsEngine/processed/ )
51+ file ( MAKE_DIRECTORY ${DAEMON_GENERATED_DIR} /DaemonVulkan/GraphicsEngine/spirv/ )
52+ file ( MAKE_DIRECTORY ${DAEMON_GENERATED_DIR} /DaemonVulkan/GraphicsEngine/bin/ )
53+ endif ()
54+
55+ include ( DaemonEmbed )
56+
57+ macro ( GenerateVulkanShaders target )
58+ # Pre-processing for #insert/#include
59+ foreach ( src IN LISTS graphicsEngineList )
60+ set ( graphicsEngineProcessedList ${graphicsEngineProcessedList} ${src} )
61+ list ( APPEND graphicsEngineOutputList ${GRAPHICS_ENGINE_PROCESSED_PATH} processed/${src} )
62+
63+ get_filename_component ( name "${src} " NAME_WE )
64+
65+ if ( VULKAN_SPIRV_OUT )
66+ set ( spirvAsmPath ${DAEMON_GENERATED_DIR} /DaemonVulkan/GraphicsEngine/spirv/${name} .spirv )
67+ endif ()
68+
69+ set ( spirvBinPath ${DAEMON_GENERATED_DIR} /DaemonVulkan/GraphicsEngine/bin/${name} .spirvBin )
70+
71+ list ( APPEND graphicsEngineOutputList ${spirvAsmPath} )
72+ list ( APPEND graphicsEngineOutputList ${spirvBinPath} )
73+ endforeach ()
74+
75+ list ( APPEND graphicsEngineOutputList ${DAEMON_GENERATED_DIR} /DaemonVulkan/GraphicsEngine/spirv/spirv.h )
76+
77+ # glslangValidator
78+ find_program ( glslangV glslangValidator HINTS /usr/bin /usr/local/bin $ENV{VULKAN_SDK} /Bin/ $ENV{VULKAN_SDK} /Bin32/ )
79+
80+ if ( glslangV STREQUAL "glslangValidator-NOTFOUND" )
81+ message ( FATAL_ERROR "glslangValidator not found; make sure you have the Vulkan SDK installed" )
82+ endif ()
83+
84+ set ( spirvOptions --target -env vulkan1.3 --glsl-version 460 -e main -l -t )
85+
86+ if ( VULKAN_SPIRV_OUT )
87+ set ( spirvOut "ON" )
88+ else ()
89+ set ( spirvOut "OFF" )
90+ endif ()
91+
92+ if ( NOT VULKAN_SPIRV_OPTIMISE )
93+ set ( spirvOptions ${spirvOptions} -Od )
94+ endif ()
95+
96+ if ( VULKAN_SPIRV_LTO )
97+ set ( spirvOptions ${spirvOptions} --lto )
98+ endif ()
99+
100+ if ( VULKAN_SPIRV_DEBUG STREQUAL "remove" )
101+ set ( spirvOptions ${spirvOptions} -g0 )
102+ elseif ( VULKAN_SPIRV_DEBUG STREQUAL "non-semantic" )
103+ set ( spirvOptions ${spirvOptions} -gV )
104+ endif ()
105+
106+ add_custom_command (
107+ COMMAND VulkanShaderParser \"${glslangV} ${spirvOptions} \" ${spirvOut} ${graphicsEngineProcessedList}
108+ DEPENDS ${graphicsEngineIDEList} ${CMAKE_CURRENT_SOURCE_DIR} /cmake/DaemonVulkan.cmake
109+ OUTPUT ${graphicsEngineOutputList}
110+ COMMENT "Generating Vulkan Graphics Engine: ${graphicsEngineProcessedList} "
111+ )
112+
113+ add_custom_target ( VulkanShaderParserTarget ALL
114+ DEPENDS ${graphicsEngineOutputList}
115+ )
116+
117+ # file( STRINGS ${GRAPHICS_ENGINE_PROCESSED_PATH}ShaderStages stagesList )
118+
119+ foreach ( src IN LISTS graphicsEngineList )
120+ set ( srcPath ${GRAPHICS_ENGINE_PROCESSED_PATH} processed/${src} )
121+
122+ get_filename_component ( name "${src} " NAME_WE )
123+
124+ set ( spirvAsmPath ${DAEMON_GENERATED_DIR} /DaemonVulkan/GraphicsEngine/spirv/${name} .spirv )
125+
126+ set ( spirvBinPath ${DAEMON_GENERATED_DIR} /DaemonVulkan/GraphicsEngine/bin/${name} .spirvBin )
127+
128+ list ( POP_FRONT stagesList stage )
129+
130+ #add_custom_command(
131+ # OUTPUT ${spirvBinPath}
132+ # COMMAND ${glslangV} ${spirvOptions} -S ${stage} -V ${srcPath} -o ${spirvBinPath} -H > ${spirvAsmPath}
133+ # DEPENDS ${srcPath}
134+ # COMMENT "Generating Vulkan graphics engine binaries: ${src}"
135+ #)
136+
137+ list ( APPEND spirvBinList ${spirvBinPath} )
138+ endforeach ()
139+
140+ GenerateEmbedFilesConstexpr( "${spirvBinList} " ${DAEMON_GENERATED_DIR} /DaemonVulkan/GraphicsEngine/spirv/spirv.h BINARY client-objects )
141+
142+ add_custom_target ( VulkanShaderBin ALL
143+ DEPENDS ${spirvBinList} ${CMAKE_CURRENT_SOURCE_DIR} /cmake/DaemonVulkan.cmake
144+ )
145+
146+ target_sources ( ${target} PRIVATE ${graphicsEngineOutputList} )
147+ endmacro ()
0 commit comments