feat(gpu): suport Metal/MSL a macOS i shaders SPIR-V embedits
This commit is contained in:
+37
-34
@@ -133,44 +133,47 @@ add_custom_command(
|
||||
add_custom_target(resource_pack ALL DEPENDS ${RESOURCE_PACK})
|
||||
add_dependencies(${PROJECT_NAME} resource_pack)
|
||||
|
||||
# --- COMPILACIÓ DE SHADERS GLSL → SPIR-V ---
|
||||
# Compila tots els shaders .glsl a SPIR-V (Vulkan/Linux/Windows).
|
||||
# macOS necessitarà MSL en el futur (Metal) — es generen amb spirv-cross
|
||||
# o glslang amb target distint en una etapa posterior.
|
||||
# Sortida: build/shaders/*.spv
|
||||
# --- COMPILACIÓ DE SHADERS GLSL → SPIR-V (headers C++ embedits) ---
|
||||
# Compila els shaders .glsl a SPIR-V i els converteix en headers C++ embedits
|
||||
# (source/core/rendering/gpu/spv/*.h). Aquests headers es commiteen al repo:
|
||||
# en macOS no cal glslc (els headers ja existeixen). En Linux/Windows glslc
|
||||
# és obligatori per regenerar els headers en cada canvi del GLSL.
|
||||
#
|
||||
# Per a macOS hi ha a més els headers MSL escrits a mà a source/core/rendering/gpu/msl/.
|
||||
set(SHADERS_DIR "${CMAKE_SOURCE_DIR}/shaders")
|
||||
set(HEADERS_DIR "${CMAKE_SOURCE_DIR}/source/core/rendering/gpu/spv")
|
||||
set(ALL_SHADER_HEADERS
|
||||
"${HEADERS_DIR}/line_vert_spv.h"
|
||||
"${HEADERS_DIR}/line_frag_spv.h"
|
||||
"${HEADERS_DIR}/postfx_vert_spv.h"
|
||||
"${HEADERS_DIR}/postfx_frag_spv.h"
|
||||
)
|
||||
set(ALL_SHADER_SOURCES
|
||||
"${SHADERS_DIR}/line.vert.glsl"
|
||||
"${SHADERS_DIR}/line.frag.glsl"
|
||||
"${SHADERS_DIR}/postfx.vert.glsl"
|
||||
"${SHADERS_DIR}/postfx.frag.glsl"
|
||||
)
|
||||
find_program(GLSLC_EXE NAMES glslc HINTS ${Vulkan_GLSLC_EXECUTABLE})
|
||||
if(GLSLC_EXE)
|
||||
file(GLOB SHADER_SOURCES CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/shaders/*.glsl")
|
||||
set(COMPILED_SHADERS "")
|
||||
foreach(SHADER ${SHADER_SOURCES})
|
||||
get_filename_component(SHADER_NAME ${SHADER} NAME)
|
||||
# Detectar stage del nom: line.vert.glsl → vert, line.frag.glsl → frag
|
||||
if(SHADER_NAME MATCHES "\\.vert\\.glsl$")
|
||||
set(SHADER_STAGE "vert")
|
||||
string(REPLACE ".glsl" ".spv" SPV_NAME ${SHADER_NAME})
|
||||
elseif(SHADER_NAME MATCHES "\\.frag\\.glsl$")
|
||||
set(SHADER_STAGE "frag")
|
||||
string(REPLACE ".glsl" ".spv" SPV_NAME ${SHADER_NAME})
|
||||
else()
|
||||
message(WARNING "Shader sense stage detectat: ${SHADER_NAME} (esperat .vert.glsl o .frag.glsl)")
|
||||
continue()
|
||||
endif()
|
||||
set(SPV_OUTPUT "${CMAKE_BINARY_DIR}/shaders/${SPV_NAME}")
|
||||
add_custom_command(
|
||||
OUTPUT ${SPV_OUTPUT}
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/shaders"
|
||||
COMMAND ${GLSLC_EXE} -fshader-stage=${SHADER_STAGE} -O ${SHADER} -o ${SPV_OUTPUT}
|
||||
DEPENDS ${SHADER}
|
||||
COMMENT "Compilant shader ${SHADER_NAME} → ${SPV_NAME}"
|
||||
VERBATIM
|
||||
)
|
||||
list(APPEND COMPILED_SHADERS ${SPV_OUTPUT})
|
||||
endforeach()
|
||||
add_custom_target(shaders ALL DEPENDS ${COMPILED_SHADERS})
|
||||
add_custom_command(
|
||||
OUTPUT ${ALL_SHADER_HEADERS}
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
-D GLSLC=${GLSLC_EXE}
|
||||
-D SHADERS_DIR=${SHADERS_DIR}
|
||||
-D HEADERS_DIR=${HEADERS_DIR}
|
||||
-P ${CMAKE_SOURCE_DIR}/tools/shaders/compile_spirv.cmake
|
||||
DEPENDS ${ALL_SHADER_SOURCES} ${CMAKE_SOURCE_DIR}/tools/shaders/compile_spirv.cmake
|
||||
COMMENT "Compilant shaders GLSL → headers SPIR-V embedits"
|
||||
VERBATIM
|
||||
)
|
||||
add_custom_target(shaders DEPENDS ${ALL_SHADER_HEADERS})
|
||||
add_dependencies(${PROJECT_NAME} shaders)
|
||||
message(STATUS "Shaders trobats: ${SHADER_SOURCES}")
|
||||
message(STATUS "Shaders: glslc trobat (${GLSLC_EXE}); headers SPV es regeneraran si canvia el GLSL")
|
||||
elseif(APPLE)
|
||||
message(STATUS "Shaders: glslc no trobat en macOS — s'usaran els headers SPV ja commiteats")
|
||||
else()
|
||||
message(FATAL_ERROR "glslc no trobat: instal·la 'shaderc' o 'vulkan-sdk' per compilar shaders SPIR-V")
|
||||
message(FATAL_ERROR "glslc no trobat: instal·la 'shaderc' o 'vulkan-sdk' per compilar shaders SPIR-V (obligatori a Linux/Windows)")
|
||||
endif()
|
||||
|
||||
# --- STATIC ANALYSIS / FORMAT TARGETS ---
|
||||
|
||||
Reference in New Issue
Block a user