Skip to content

Commit 2f82ad3

Browse files
committed
Daemon-vulkan infrastructure 2
1 parent 2bdccd1 commit 2f82ad3

File tree

6 files changed

+434
-5
lines changed

6 files changed

+434
-5
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
@@ -530,6 +530,7 @@ endif()
530530
if (USE_VULKAN)
531531
add_definitions("-DDAEMON_RENDERER_VULKAN=1")
532532
add_definitions("-DVK_NO_PROTOTYPES=1")
533+
include(DaemonVulkan)
533534
else()
534535
add_definitions("-DDAEMON_RENDERER_OPENGL=1")
535536

@@ -927,8 +928,12 @@ if (BUILD_CLIENT)
927928
Tests ${CLIENTTESTLIST}
928929
)
929930

930-
# Generate GLSL include files.
931-
daemon_embed_files("EngineShaders" "${GLSL_EMBED_DIR}" "${GLSL_EMBED_LIST}" "TEXT" "client-objects")
931+
if (USE_VULKAN)
932+
GenerateVulkanShaders( client-objects )
933+
else()
934+
# Generate GLSL include files.
935+
daemon_embed_files("EngineShaders" "${GLSL_EMBED_DIR}" "${GLSL_EMBED_LIST}" "TEXT" "client-objects")
936+
endif()
932937
endif()
933938

934939
if (BUILD_SERVER)

cmake/DaemonFileEmbedder.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Converts a text file into a C-language char array definition.
22
# For use in CMake script mode (cmake -P).
33
# Required definitions on command line:
4-
# INPUT_FILE, OUTPUT_FILE, FILE_FORMAT, VARIABLE_NAME
4+
# INPUT_FILE, OUTPUT_FILE, VARIABLE_NAME, FILE_FORMAT, EMBED_MODE
55

66
# Inspired by:
77
# https://stackoverflow.com/questions/11813271/embed-resources-eg-shader-code-images-into-executable-library-with-cmake/27206982#27206982
@@ -30,7 +30,7 @@ string(REGEX REPLACE
3030
# A bit more of beautification.
3131
string(REGEX REPLACE ",$" ",\n" contents "${contents}")
3232

33-
file(WRITE ${OUTPUT_FILE}
33+
file(${EMBED_MODE} ${OUTPUT_FILE}
3434
"constexpr unsigned char ${VARIABLE_NAME}[] =\n"
3535
"{\n"
3636
"${contents}"

cmake/DaemonSourceGenerator.cmake

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,37 @@ macro(daemon_write_buildinfo name)
6767
endforeach()
6868
endmacro()
6969

70+
function(GenerateEmbedFilesConstexpr srcPaths dstPath format target)
71+
set(first TRUE)
72+
foreach(srcPath IN LISTS srcPaths)
73+
get_filename_component(filename "${srcPath}" NAME_WE)
74+
75+
if(first)
76+
set(mode WRITE)
77+
set(first FALSE)
78+
else()
79+
set(mode APPEND)
80+
endif()
81+
82+
set(cmd ${CMAKE_COMMAND}
83+
"-DINPUT_FILE=${srcPath}"
84+
"-DOUTPUT_FILE=${dstPath}"
85+
"-DFILE_FORMAT=${format}"
86+
"-DVARIABLE_NAME=${filename}"
87+
"-DEMBED_MODE=${mode}"
88+
-P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/EmbedText.cmake" )
89+
list(APPEND cmdList ${cmd})
90+
endforeach()
91+
92+
add_custom_command(
93+
OUTPUT ${dstPath}
94+
COMMAND ${cmdList}
95+
DEPENDS ${srcPath} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/DaemonEmbed.cmake
96+
)
97+
98+
target_sources(${target} PRIVATE ${dstPath})
99+
endfunction()
100+
70101
macro(daemon_embed_files basename dir list format targetname)
71102
set(embed_subdir "${DAEMON_EMBEDDED_SUBDIR}/${basename}")
72103
set(embed_dir "${DAEMON_GENERATED_DIR}/${embed_subdir}")
@@ -109,7 +140,8 @@ macro(daemon_embed_files basename dir list format targetname)
109140
"-DOUTPUT_FILE=${outpath}"
110141
"-DFILE_FORMAT=${format}"
111142
"-DVARIABLE_NAME=${filename_symbol}"
112-
-P "${DAEMON_FILE_EMBEDDER}"
143+
"-DEMBED_MODE=WRITE"
144+
-P "${DAEMON_TEXT_EMBEDDER}"
113145
MAIN_DEPENDENCY ${inpath}
114146
DEPENDS
115147
"${DAEMON_FILE_EMBEDDER}"

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( 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

Comments
 (0)