Skip to content

Commit a92d908

Browse files
committed
Fix shader build MAIN_DEPENDENCY and add conditional GLSL/struct generation
Introduce SHADERS_GL_SHARED and SHADERS_NEED_STRUCT_GEN lists to control which shaders get GLSL decompilation and C++ struct generation. Currently all four shaders are in both lists, so behavior is identical. This prepares for adding Vulkan-only shaders that need SPIR-V compilation but not GLSL decompilation or struct generation. Removes the decompiled vulkan shaders (as they're not actually shared with GL), and Vulkan shader structs (never used). Fix typo: MAIN_DEPENDENCY referenced undefined ${shader} instead of the loop variable ${_shader}, silently breaking the dependency tracking for shader recompilation.
1 parent 7f7c958 commit a92d908

5 files changed

Lines changed: 56 additions & 53 deletions

File tree

code/graphics/shaders/compiled/vulkan.frag.spv.glsl

Lines changed: 0 additions & 10 deletions
This file was deleted.

code/graphics/shaders/compiled/vulkan.vert.spv.glsl

Lines changed: 0 additions & 13 deletions
This file was deleted.

code/graphics/shaders/compiled/vulkan_structs.frag.h

Lines changed: 0 additions & 6 deletions
This file was deleted.

code/graphics/shaders/compiled/vulkan_structs.vert.h

Lines changed: 0 additions & 6 deletions
This file was deleted.

code/shaders.cmake

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
1328
target_sources(code PRIVATE ${SHADERS})
1429
source_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()
77115
endforeach ()
78116

0 commit comments

Comments
 (0)