Archived
1
Fork 0
This repository has been archived on 2025-04-12. You can view files and clone it, but cannot push or open issues or pull requests.
prism/cmake/BuildShaders.cmake
Joshua Goins fb5558b076 A huge overhaul of how hosted shader compilers work
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!
2022-02-20 22:51:05 -05:00

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)