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