Skip to content

Commit 270d8cb

Browse files
committed
Daemon-vulkan infrastructure 2
1 parent bd2e006 commit 270d8cb

File tree

4 files changed

+1472
-4
lines changed

4 files changed

+1472
-4
lines changed

.gitignore

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ build
2121
*.so
2222
*.a
2323

24+
# Ignore Daemon-Vulkan generated Graphics Engine files
25+
src/engine/renderer-vulkan/GraphicsCore/ExecutionGraph/SPIRV.h
26+
src/engine/renderer-vulkan/GraphicsCore/ExecutionGraph/SPIRVBin.h
27+
src/engine/renderer-vulkan/GraphicsEngine/Buffers.glsl
28+
src/engine/renderer-vulkan/GraphicsEngine/Images.glsl
29+
src/engine/renderer-vulkan/GraphicsShared/SPIRVIDs.h
30+
2431
#ignore editor temporary files
2532
.*.swp
2633
.#*
@@ -57,5 +64,8 @@ external_deps/*
5764
.vs
5865
.vscode
5966

67+
# Ignore python cache
68+
*.pyc
69+
6070
#ignore removed recastnavigation submodule
6171
libs/recastnavigation

CMakeLists.txt

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ endif()
7878
include(DaemonSourceGenerator)
7979
include(DaemonPlatform)
8080

81+
include( DaemonVulkan )
82+
8183
################################################################################
8284
# Configuration options
8385
################################################################################
@@ -108,7 +110,7 @@ if(NOT DAEMON_EXTERNAL_APP)
108110
endif()
109111

110112
if (BUILD_CLIENT)
111-
# option(USE_VULKAN "Use Vulkan rendering API instead of OpenGL." OFF)
113+
option(USE_VULKAN "Use Vulkan rendering API instead of OpenGL." OFF)
112114
endif()
113115

114116
option(USE_SMP "Compile with support for running the renderer in a separate thread" ON)
@@ -929,10 +931,14 @@ if (BUILD_CLIENT)
929931
Tests ${CLIENTTESTLIST}
930932
)
931933

932-
# Generate GLSL include files.
933-
daemon_embed_files("EngineShaders" "${GLSL_EMBED_DIR}" "${GLSL_EMBED_LIST}" "TEXT" "client-objects")
934+
if (USE_VULKAN)
935+
GenerateVulkanShaders( client-objects )
936+
else()
937+
# Generate GLSL include files.
938+
daemon_embed_files("EngineShaders" "${GLSL_EMBED_DIR}" "${GLSL_EMBED_LIST}" "TEXT" "client-objects")
934939

935-
daemon_embed_files(ConsoleFont "${CMAKE_CURRENT_SOURCE_DIR}/libs/unifont" unifont.otf BINARY client-objects)
940+
daemon_embed_files(ConsoleFont "${CMAKE_CURRENT_SOURCE_DIR}/libs/unifont" unifont.otf BINARY client-objects)
941+
endif()
936942
endif()
937943

938944
if (BUILD_SERVER)

cmake/DaemonVulkan.cmake

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
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

Comments
 (0)