@@ -10,6 +10,21 @@ set(SHADERS
1010 ${SHADER_DIR} /vulkan.vert
1111)
1212
13+ # Shaders shared with the OpenGL backend. These get GLSL decompilation (.spv.glsl)
14+ # and the decompiled GLSL is embedded for runtime use.
15+ # All other shaders are Vulkan-only: SPIR-V compilation and embedding only.
16+ set (SHADERS_GL_SHARED
17+ ${SHADER_DIR} /default-material.frag
18+ ${SHADER_DIR} /default-material.vert
19+ )
20+
21+ # Shaders that need C++ struct header generation from SPIR-V reflection.
22+ # Generated structs are included via shader_structs.h for compile-time layout validation.
23+ set (SHADERS_NEED_STRUCT_GEN
24+ ${SHADER_DIR} /default-material.frag
25+ ${SHADER_DIR} /default-material.vert
26+ )
27+
1328target_sources (code PRIVATE ${SHADERS} )
1429source_group ("Graphics\\ Shaders" FILES ${SHADERS} )
1530
@@ -31,6 +46,9 @@ foreach (_shader ${SHADERS})
3146 get_filename_component (_baseShaderName "${_shader} " NAME_WE )
3247 get_filename_component (_shaderExt "${_shader} " EXT )
3348
49+ list (FIND SHADERS_GL_SHARED "${_shader} " _isGlShared)
50+ list (FIND SHADERS_NEED_STRUCT_GEN "${_shader} " _needStructs)
51+
3452 if (TARGET glslc)
3553 set (_depFileDir "${CMAKE_CURRENT_BINARY_DIR } /shaders" )
3654 set (_depFile "${_depFileDir} /${_fileName} .spv.d" )
@@ -45,34 +63,54 @@ foreach (_shader ${SHADERS})
4563 COMMAND ${CMAKE_COMMAND } -E make_directory "${_depFileDir} "
4664 COMMAND glslc "${_shader} " -o "${_spirvFile} " --target-env=vulkan1.0 -O -g "-I${SHADER_DIR} "
4765 "-I${LEGACY_SHADER_DIR} " -MD -MF "${_depFile} " -MT "${_relativeSpirvPath} " -Werror -x glsl
48- MAIN_DEPENDENCY "${shader } "
66+ MAIN_DEPENDENCY "${_shader } "
4967 COMMENT "Compiling shader ${_fileName} "
5068 ${DEPFILE_PARAM}
5169 )
5270
5371 target_embed_files (code FILES "${_spirvFile} " RELATIVE_TO "${_shaderOutputDir} " PATH_TYPE_PREFIX "data/effects" )
5472
55- set (_glslOutput "${_spirvFile} .glsl" )
56- set (_structOutput "${_shaderOutputDir} /${_baseShaderName} _structs${_shaderExt} .h" )
57-
58- list (APPEND _structHeaderList "${_structOutput} " )
59-
60- add_custom_command (OUTPUT "${_glslOutput} " "${_structOutput} "
61- COMMAND shadertool --glsl "--glsl-output=${_glslOutput} " --structs "--structs-output=${_structOutput} " ${_spirvFile}
62- MAIN_DEPENDENCY "${_spirvFile} "
63- COMMENT "Processing shader ${_spirvFile} "
64- )
65-
66- target_embed_files (code FILES "${_glslOutput} " RELATIVE_TO "${_shaderOutputDir} " PATH_TYPE_PREFIX "data/effects" )
73+ # Build shadertool arguments based on what this shader needs
74+ set (_glslOutput)
75+ set (_shadertoolArgs)
76+ set (_shadertoolOutputs)
77+
78+ if (_isGlShared GREATER -1)
79+ set (_glslOutput "${_spirvFile} .glsl" )
80+ list (APPEND _shadertoolArgs --glsl "--glsl-output=${_glslOutput} " )
81+ list (APPEND _shadertoolOutputs "${_glslOutput} " )
82+ endif ()
83+ if (_needStructs GREATER -1)
84+ set (_structOutput "${_shaderOutputDir} /${_baseShaderName} _structs${_shaderExt} .h" )
85+ list (APPEND _shadertoolArgs --structs "--structs-output=${_structOutput} " )
86+ list (APPEND _shadertoolOutputs "${_structOutput} " )
87+ list (APPEND _structHeaderList "${_structOutput} " )
88+ endif ()
89+
90+ if (_shadertoolArgs)
91+ add_custom_command (OUTPUT ${_shadertoolOutputs}
92+ COMMAND shadertool ${_shadertoolArgs} ${_spirvFile}
93+ MAIN_DEPENDENCY "${_spirvFile} "
94+ COMMENT "Processing shader ${_spirvFile} "
95+ )
96+ endif ()
97+
98+ if (_glslOutput)
99+ target_embed_files (code FILES "${_glslOutput} " RELATIVE_TO "${_shaderOutputDir} " PATH_TYPE_PREFIX "data/effects" )
100+ endif ()
67101 else ()
102+ # No shader compiler available — use pre-compiled files from VCS
68103 target_embed_files (code FILES "${_spirvFile} " RELATIVE_TO "${_shaderOutputDir} " PATH_TYPE_PREFIX "data/effects" )
69104
70- set (_glslOutput " ${_spirvFile} .glsl" )
71- set (_structOutput "${_shaderOutputDir} /${_baseShaderName} _structs${_shaderExt} .h" )
72-
73- list ( APPEND _structHeaderList " ${_structOutput} " )
105+ if (_needStructs GREATER -1 )
106+ set (_structOutput "${_shaderOutputDir} /${_baseShaderName} _structs${_shaderExt} .h" )
107+ list ( APPEND _structHeaderList " ${_structOutput} " )
108+ endif ( )
74109
75- target_embed_files (code FILES "${_glslOutput} " RELATIVE_TO "${_shaderOutputDir} " PATH_TYPE_PREFIX "data/effects" )
110+ if (_isGlShared GREATER -1)
111+ set (_glslOutput "${_spirvFile} .glsl" )
112+ target_embed_files (code FILES "${_glslOutput} " RELATIVE_TO "${_shaderOutputDir} " PATH_TYPE_PREFIX "data/effects" )
113+ endif ()
76114 endif ()
77115endforeach ()
78116
0 commit comments