Now it's much more usable, you are forced to use a hosted shader compiler on a platform that needs it (for example, iOS) and now CMake will error when it's missing. Now every platform is very specific on which languages it needs to be translated to, and whether a hosted compiler is needed. No more manually copying over shaders!
56 lines
2 KiB
CMake
Executable file
56 lines
2 KiB
CMake
Executable file
# add custom command to output compiled shader
|
|
function(add_shader_command)
|
|
cmake_parse_arguments(ARGS "" "FILENAME;OUT" "" ${ARGN})
|
|
|
|
cmake_path(REMOVE_EXTENSION ARGS_FILENAME LAST_ONLY OUTPUT_VARIABLE FILENAME_WITHOUT_EXT)
|
|
|
|
set(SRC_FILENAME ${CMAKE_CURRENT_SOURCE_DIR}/${ARGS_FILENAME})
|
|
set(OUTPUT_FILENAME ${CMAKE_BINARY_DIR}/${FILENAME_WITHOUT_EXT})
|
|
|
|
if(NEEDS_HOSTED_SHADER_COMPILER)
|
|
set(SHADER_COMPILER_COMMAND ${SHADER_COMPILER_LOCATION})
|
|
else()
|
|
set(SHADER_COMPILER_COMMAND $<TARGET_FILE:ShaderCompilerTool>)
|
|
endif()
|
|
|
|
# we want to remove the .nocompile extension just like the tool does, if it exists
|
|
cmake_path(GET FILENAME_WITHOUT_EXT EXTENSION LAST_ONLY LAST_EXT)
|
|
|
|
if(LAST_EXT STREQUAL ".nocompile")
|
|
cmake_path(REPLACE_EXTENSION OUTPUT_FILENAME LAST_ONLY glsl)
|
|
endif()
|
|
|
|
add_custom_command(
|
|
OUTPUT ${OUTPUT_FILENAME}
|
|
COMMAND ${SHADER_COMPILER_COMMAND} ${SRC_FILENAME} ${OUTPUT_FILENAME} ${REQUIRED_SHADER_LANGUAGE} ${EXTRA_PLATFORM_ARG}
|
|
DEPENDS ${SRC_FILENAME}
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/shaders)
|
|
|
|
# return the actual filename
|
|
set(${ARGS_OUT} ${OUTPUT_FILENAME} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# add shaders to target
|
|
function(add_shaders)
|
|
cmake_parse_arguments(ARGS "" "TARGET" "SHADERS" ${ARGN})
|
|
|
|
foreach(SHADER_FILENAME ${ARGS_SHADERS})
|
|
cmake_path(REMOVE_EXTENSION SHADER_FILENAME LAST_ONLY OUTPUT_VARIABLE FILENAME_WITHOUT_EXT)
|
|
|
|
add_shader_command(FILENAME ${SHADER_FILENAME} OUT DST_FILENAME)
|
|
|
|
list(APPEND SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/${SHADER_FILENAME})
|
|
list(APPEND DST_FILES ${DST_FILENAME})
|
|
endforeach()
|
|
|
|
if(NOT NEEDS_HOSTED_SHADER_COMPILER)
|
|
add_custom_target(BuildShaders DEPENDS ShaderCompilerTool ${DST_FILES})
|
|
else()
|
|
add_custom_target(BuildShaders DEPENDS ${DST_FILES})
|
|
endif()
|
|
|
|
add_dependencies(${ARGS_TARGET} BuildShaders)
|
|
endfunction()
|
|
|
|
# make the shader directory if it doesnt exist already
|
|
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/shaders)
|