107 lines
3.0 KiB
CMake
107 lines
3.0 KiB
CMake
|
|
# Ref.: https://stackoverflow.com/questions/67040258/cmake-compile-glsl-shaders
|
|
# Ref.: https://cmake.org/cmake/help/latest/command/add_custom_command.html
|
|
|
|
set(SHADER_SOURCE_DIR ${PROJECT_SOURCE_DIR}/shaders)
|
|
set(SHADER_BIN_DIR ${PROJECT_SOURCE_DIR}/assets/shaders)
|
|
file(GLOB VERTEX_SHADERS ${SHADER_SOURCE_DIR}/vs_*.sc)
|
|
file(GLOB FRAGMENT_SHADERS ${SHADER_SOURCE_DIR}/fs_*.sc)
|
|
file(GLOB COMPUTE_SHADERS ${SHADER_SOURCE_DIR}/cs_*.sc)
|
|
|
|
# vertex shaders
|
|
foreach(SHADER_IN IN LISTS VERTEX_SHADERS)
|
|
cmake_path(GET SHADER_IN FILENAME SHADER_NAME) # ex. SHADER_NAME==vs_cubes.sc
|
|
|
|
# output file
|
|
string(REPLACE ".sc" ".spv" SHADER_OUT ${SHADER_NAME})
|
|
set(SHADER_OUT ${SHADER_BIN_DIR}/${SHADER_OUT})
|
|
|
|
# varying file
|
|
string(REPLACE "vs" "varying" SHADER_VARYING ${SHADER_IN})
|
|
|
|
# message("SHADER_IN: " ${SHADER_IN} " - SHADER_VARYING: " ${SHADER_VARYING} " - SHADER_OUT: " ${SHADER_OUT})
|
|
|
|
_bgfx_shaderc_parse(CLI
|
|
FILE ${SHADER_IN}
|
|
OUTPUT ${SHADER_OUT}
|
|
VERTEX
|
|
LINUX
|
|
PROFILE spirv
|
|
VARYINGDEF ${SHADER_VARYING}
|
|
INCLUDES ${SHADER_BIN_DIR}
|
|
)
|
|
|
|
add_custom_command(
|
|
OUTPUT ${SHADER_OUT}
|
|
COMMAND ${SHADERC} ${CLI}
|
|
DEPENDS ${SHADER_IN}
|
|
COMMENT "Compiling shader ${SHADER_NAME}"
|
|
)
|
|
|
|
list(APPEND SPV_SHADERS ${SHADER_OUT})
|
|
endforeach()
|
|
|
|
# fragment shaders
|
|
foreach(SHADER_IN IN LISTS FRAGMENT_SHADERS)
|
|
cmake_path(GET SHADER_IN FILENAME SHADER_NAME) # ex. SHADER_NAME==vs_cubes.sc
|
|
|
|
# output file
|
|
string(REPLACE ".sc" ".spv" SHADER_OUT ${SHADER_NAME})
|
|
set(SHADER_OUT ${SHADER_BIN_DIR}/${SHADER_OUT})
|
|
|
|
# varying file
|
|
string(REPLACE "fs" "varying" SHADER_VARYING ${SHADER_IN})
|
|
|
|
# message("SHADER_IN: " ${SHADER_IN} " - SHADER_VARYING: " ${SHADER_VARYING} " - SHADER_OUT: " ${SHADER_OUT})
|
|
|
|
_bgfx_shaderc_parse(CLI
|
|
FILE ${SHADER_IN}
|
|
OUTPUT ${SHADER_OUT}
|
|
FRAGMENT
|
|
LINUX
|
|
PROFILE spirv
|
|
VARYINGDEF ${SHADER_VARYING}
|
|
INCLUDES ${SHADER_BIN_DIR}
|
|
)
|
|
|
|
add_custom_command(
|
|
OUTPUT ${SHADER_OUT}
|
|
COMMAND ${SHADERC} ${CLI}
|
|
DEPENDS ${SHADER_IN}
|
|
COMMENT "Compiling shader ${SHADER_NAME}"
|
|
)
|
|
|
|
list(APPEND SPV_SHADERS ${SHADER_OUT})
|
|
endforeach()
|
|
|
|
# compute shaders
|
|
foreach(SHADER_IN IN LISTS COMPUTE_SHADERS)
|
|
cmake_path(GET SHADER_IN FILENAME SHADER_NAME) # ex. SHADER_NAME==vs_cubes.sc
|
|
|
|
# output file
|
|
string(REPLACE ".sc" ".spv" SHADER_OUT ${SHADER_NAME})
|
|
set(SHADER_OUT ${SHADER_BIN_DIR}/${SHADER_OUT})
|
|
|
|
# message("SHADER_IN: " ${SHADER_IN} " - "SHADER_OUT: " ${SHADER_OUT})
|
|
|
|
_bgfx_shaderc_parse(CLI
|
|
FILE ${SHADER_IN}
|
|
OUTPUT ${SHADER_OUT}
|
|
COMPUTE
|
|
LINUX
|
|
PROFILE spirv
|
|
INCLUDES ${SHADER_BIN_DIR}
|
|
)
|
|
|
|
add_custom_command(
|
|
OUTPUT ${SHADER_OUT}
|
|
COMMAND ${SHADERC} ${CLI}
|
|
DEPENDS ${SHADER_IN}
|
|
COMMENT "Compiling shader ${SHADER_NAME}"
|
|
)
|
|
|
|
list(APPEND SPV_SHADERS ${SHADER_OUT})
|
|
endforeach()
|
|
|
|
add_custom_target(shaders ALL DEPENDS ${SPV_SHADERS})
|