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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long