Skip to content

Commit 10ed57e

Browse files
committed
Daemon-vulkan infrastructure 2
1 parent ff5cf6c commit 10ed57e

File tree

6 files changed

+433
-4
lines changed

6 files changed

+433
-4
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,8 @@ external_deps/*
5757
.vs
5858
.vscode
5959

60+
#ignore python cache
61+
*.pyc
62+
6063
#ignore removed recastnavigation submodule
6164
libs/recastnavigation

CMakeLists.txt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,7 @@ endif()
641641
if (USE_VULKAN)
642642
add_definitions("-DDAEMON_RENDERER_VULKAN=1")
643643
add_definitions("-DVK_NO_PROTOTYPES=1")
644+
include(DaemonVulkan)
644645
else()
645646
add_definitions("-DDAEMON_RENDERER_OPENGL=1")
646647

@@ -1038,8 +1039,12 @@ if (BUILD_CLIENT)
10381039
Tests ${CLIENTTESTLIST}
10391040
)
10401041

1041-
# Generate GLSL include files.
1042-
daemon_embed_files("EngineShaders" "GLSL" "TEXT" "client-objects")
1042+
if (USE_VULKAN)
1043+
GenerateVulkanShaders( client-objects )
1044+
else()
1045+
# Generate GLSL include files.
1046+
daemon_embed_files("EngineShaders" "GLSL" "TEXT" "client-objects")
1047+
endif()
10431048
endif()
10441049

10451050
if (BUILD_SERVER)

cmake/DaemonSourceGenerator.cmake

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,37 @@ macro(daemon_write_buildinfo name)
5454
endforeach()
5555
endmacro()
5656

57+
function(GenerateEmbedFilesConstexpr srcPaths dstPath format target)
58+
set(first TRUE)
59+
foreach(srcPath IN LISTS srcPaths)
60+
get_filename_component(filename "${srcPath}" NAME_WE)
61+
62+
if(first)
63+
set(mode WRITE)
64+
set(first FALSE)
65+
else()
66+
set(mode APPEND)
67+
endif()
68+
69+
set(cmd ${CMAKE_COMMAND}
70+
"-DINPUT_FILE=${srcPath}"
71+
"-DOUTPUT_FILE=${dstPath}"
72+
"-DFILE_FORMAT=${format}"
73+
"-DVARIABLE_NAME=${filename}"
74+
"-DEMBED_MODE=${mode}"
75+
-P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/EmbedText.cmake" )
76+
list(APPEND cmdList ${cmd})
77+
endforeach()
78+
79+
add_custom_command(
80+
OUTPUT ${dstPath}
81+
COMMAND ${cmdList}
82+
MAIN_DEPENDENCY ${srcPath}
83+
)
84+
85+
target_sources(${target} PRIVATE ${dstPath})
86+
endfunction()
87+
5788
macro(daemon_embed_files basename slug format targetname)
5889
set(embed_source_dir "${slug}_EMBED_DIR")
5990
set(embed_source_list "${slug}_EMBED_LIST")
@@ -101,6 +132,7 @@ macro(daemon_embed_files basename slug format targetname)
101132
"-DOUTPUT_FILE=${outpath}"
102133
"-DFILE_FORMAT=${format}"
103134
"-DVARIABLE_NAME=${filename_symbol}"
135+
"-DEMBED_MODE=WRITE"
104136
-P "${DAEMON_TEXT_EMBEDDER}"
105137
MAIN_DEPENDENCY ${inpath}
106138
)

cmake/DaemonVulkan.cmake

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
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( graphicsProcessedList ${graphicsProcessedList} ${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} ${graphicsProcessedList}
108+
DEPENDS ${graphicsEngineIDEList}
109+
OUTPUT ${graphicsEngineOutputList}
110+
COMMENT "Generating Vulkan Graphics Engine: ${graphicsProcessedList}"
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}
144+
)
145+
146+
target_sources( ${target} PRIVATE ${graphicsEngineOutputList} )
147+
endmacro()

0 commit comments

Comments
 (0)