build: hacer Vulkan SDK opcional usando SPIR-V pre-compilados

Si glslc no está disponible, CMake usa los headers en shaders/precompiled/
en lugar de fallar. Los SPIR-V son portátiles entre Windows y Linux, por
lo que el build funciona sin instalar Vulkan SDK.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-21 01:38:09 +01:00
parent e13905567d
commit 2846987450
6 changed files with 64 additions and 36 deletions

View File

@@ -28,42 +28,43 @@ endif()
if(NOT APPLE)
find_program(GLSLC glslc HINTS "$ENV{VULKAN_SDK}/bin" "$ENV{VULKAN_SDK}/Bin")
if(NOT GLSLC)
message(FATAL_ERROR "glslc not found. Install the Vulkan SDK and ensure glslc is on PATH.")
message(STATUS "glslc not found — using precompiled SPIR-V headers from shaders/precompiled/")
set(SHADER_GEN_DIR "${CMAKE_SOURCE_DIR}/shaders/precompiled")
else()
set(SHADER_SRC_DIR "${CMAKE_SOURCE_DIR}/shaders")
set(SHADER_GEN_DIR "${CMAKE_BINARY_DIR}/generated_shaders")
file(MAKE_DIRECTORY "${SHADER_GEN_DIR}")
set(SPIRV_HEADERS)
foreach(SHADER sprite_vert sprite_frag postfx_vert postfx_frag ball_vert)
if(SHADER MATCHES "_vert$")
set(STAGE_FLAG "-fshader-stage=vertex")
else()
set(STAGE_FLAG "-fshader-stage=fragment")
endif()
string(REGEX REPLACE "_vert$" ".vert" GLSL_NAME "${SHADER}")
string(REGEX REPLACE "_frag$" ".frag" GLSL_NAME "${GLSL_NAME}")
set(GLSL_FILE "${SHADER_SRC_DIR}/${GLSL_NAME}")
set(SPV_FILE "${SHADER_GEN_DIR}/${SHADER}.spv")
set(H_FILE "${SHADER_GEN_DIR}/${SHADER}_spv.h")
add_custom_command(
OUTPUT "${H_FILE}"
COMMAND "${GLSLC}" ${STAGE_FLAG} -o "${SPV_FILE}" "${GLSL_FILE}"
COMMAND "${CMAKE_COMMAND}"
-DINPUT="${SPV_FILE}"
-DOUTPUT="${H_FILE}"
-DVAR_NAME="k${SHADER}_spv"
-P "${CMAKE_SOURCE_DIR}/cmake/spv_to_header.cmake"
DEPENDS "${GLSL_FILE}"
COMMENT "Compiling ${GLSL_NAME} to SPIRV"
)
list(APPEND SPIRV_HEADERS "${H_FILE}")
endforeach()
add_custom_target(shaders ALL DEPENDS ${SPIRV_HEADERS})
endif()
set(SHADER_SRC_DIR "${CMAKE_SOURCE_DIR}/shaders")
set(SHADER_GEN_DIR "${CMAKE_BINARY_DIR}/generated_shaders")
file(MAKE_DIRECTORY "${SHADER_GEN_DIR}")
set(SPIRV_HEADERS)
foreach(SHADER sprite_vert sprite_frag postfx_vert postfx_frag ball_vert)
if(SHADER MATCHES "_vert$")
set(STAGE_FLAG "-fshader-stage=vertex")
else()
set(STAGE_FLAG "-fshader-stage=fragment")
endif()
string(REGEX REPLACE "_vert$" ".vert" GLSL_NAME "${SHADER}")
string(REGEX REPLACE "_frag$" ".frag" GLSL_NAME "${GLSL_NAME}")
set(GLSL_FILE "${SHADER_SRC_DIR}/${GLSL_NAME}")
set(SPV_FILE "${SHADER_GEN_DIR}/${SHADER}.spv")
set(H_FILE "${SHADER_GEN_DIR}/${SHADER}_spv.h")
add_custom_command(
OUTPUT "${H_FILE}"
COMMAND "${GLSLC}" ${STAGE_FLAG} -o "${SPV_FILE}" "${GLSL_FILE}"
COMMAND "${CMAKE_COMMAND}"
-DINPUT="${SPV_FILE}"
-DOUTPUT="${H_FILE}"
-DVAR_NAME="k${SHADER}_spv"
-P "${CMAKE_SOURCE_DIR}/cmake/spv_to_header.cmake"
DEPENDS "${GLSL_FILE}"
COMMENT "Compiling ${GLSL_NAME} to SPIRV"
)
list(APPEND SPIRV_HEADERS "${H_FILE}")
endforeach()
add_custom_target(shaders ALL DEPENDS ${SPIRV_HEADERS})
endif()
# Archivos fuente (excluir main_old.cpp)
@@ -103,7 +104,9 @@ set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAK
target_link_libraries(${PROJECT_NAME} ${LINK_LIBS})
if(NOT APPLE)
add_dependencies(${PROJECT_NAME} shaders)
if(GLSLC)
add_dependencies(${PROJECT_NAME} shaders)
endif()
target_include_directories(${PROJECT_NAME} PRIVATE "${SHADER_GEN_DIR}")
endif()