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:
+39
-36
@@ -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
Reference in New Issue
Block a user