From e4e935c7aed9e6f5932d42ee364af0066321826c Mon Sep 17 00:00:00 2001 From: Sandy Carter Date: Tue, 16 Aug 2022 21:18:55 -0400 Subject: [PATCH] ToolUtils: Add helper to compile shader to header --- cmake/Config.cmake.in | 3 ++ cmake/bgfxToolUtils.cmake | 111 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) diff --git a/cmake/Config.cmake.in b/cmake/Config.cmake.in index 58a739f..017597f 100644 --- a/cmake/Config.cmake.in +++ b/cmake/Config.cmake.in @@ -1,5 +1,8 @@ @PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/@TARGETS_EXPORT_NAME@.cmake") +get_target_property(BGFX_INCLUDE_PATH bgfx::bgfx INTERFACE_INCLUDE_DIRECTORIES) +list(GET BGFX_INCLUDE_PATH 0 BGFX_INCLUDE_PATH_1) # bgfx::bgfx exports include directory twice? +set(BGFX_SHADER_INCLUDE_PATH ${BGFX_INCLUDE_PATH_1}/bgfx) include("${CMAKE_CURRENT_LIST_DIR}/bgfxToolUtils.cmake") check_required_components("@PROJECT_NAME@") diff --git a/cmake/bgfxToolUtils.cmake b/cmake/bgfxToolUtils.cmake index 8de7ceb..29ff20b 100644 --- a/cmake/bgfxToolUtils.cmake +++ b/cmake/bgfxToolUtils.cmake @@ -164,3 +164,114 @@ function( shaderc_parse ARG_OUT ) set( ${ARG_OUT} ${CLI} PARENT_SCOPE ) endfunction() + +function (_get_profile_ext PROFILE PROFILE_EXT) + string(REPLACE 300_es essl PROFILE ${PROFILE}) + string(REPLACE 120 glsl PROFILE ${PROFILE}) + string(REPLACE spirv spv PROFILE ${PROFILE}) + string(REPLACE metal mtl PROFILE ${PROFILE}) + string(REPLACE vs_3_0 dx9 PROFILE ${PROFILE}) + string(REPLACE vs_4_0 dx10 PROFILE ${PROFILE}) + string(REPLACE vs_5_0 dx11 PROFILE ${PROFILE}) + string(REPLACE ps_3_0 dx9 PROFILE ${PROFILE}) + string(REPLACE ps_4_0 dx10 PROFILE ${PROFILE}) + string(REPLACE ps_5_0 dx11 PROFILE ${PROFILE}) + string(REPLACE cs_4_0 dx10 PROFILE ${PROFILE}) + string(REPLACE cs_5_0 dx11 PROFILE ${PROFILE}) + + set(${PROFILE_EXT} + ${PROFILE} + PARENT_SCOPE + ) +endfunction () + +# compile_shader_to_header( +# TYPE VERTEX|FRAGMENT|COMPUTE +# SHADERS filenames +# VARYING_DEF filename +# OUTPUT_DIR directory +#) +# +function (compile_shader_to_header) + set(options "") + set(oneValueArgs TYPE VARYING_DEF OUTPUT_DIR) + set(multiValueArgs SHADERS) + cmake_parse_arguments( + ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}" + ) + + set(PROFILES 120 300_es spirv) # pssl + if (UNIX AND NOT APPLE) + set(PLATFORM LINUX) + elseif (EMSCRIPTEN) + set(PLATFORM ASM_JS) + elseif (APPLE) + set(PLATFORM OSX) + list(APPEND PROFILES metal) + elseif ( + WIN32 + OR MINGW + OR MSYS + OR CYGWIN + ) + set(PLATFORM WINDOWS) + if (ARGS_TYPE STREQUAL "VERTEX") + list(APPEND PROFILES vs_3_0) + list(APPEND PROFILES vs_4_0) + list(APPEND PROFILES vs_5_0) + elseif (ARGS_TYPE STREQUAL "FRAGMENT") + list(APPEND PROFILES ps_3_0) + list(APPEND PROFILES ps_4_0) + list(APPEND PROFILES ps_5_0) + elseif (ARGS_TYPE STREQUAL "COMPUTE") + list(APPEND PROFILES cs_4_0) + list(APPEND PROFILES cs_5_0) + else () + message(error "shaderc: Unsupported type") + endif () + else () + message(error "shaderc: Unsupported platform") + endif () + + foreach (SHADER_FILE ${ARGS_SHADERS}) + source_group("Shaders" FILES "${SHADER}") + get_filename_component(SHADER_FILE_BASENAME ${SHADER_FILE} NAME) + get_filename_component(SHADER_FILE_NAME_WE ${SHADER_FILE} NAME_WE) + get_filename_component(SHADER_FILE_ABSOLUTE ${SHADER_FILE} ABSOLUTE) + + # Build output targets and their commands + set(OUTPUTS "") + set(COMMANDS "") + foreach (PROFILE ${PROFILES}) + _get_profile_ext(${PROFILE} PROFILE_EXT) + set(OUTPUT + ${ARGS_OUTPUT_DIR}/${SHADER_FILE_BASENAME}.${PROFILE_EXT}.bin.h + ) + set(PLATFORM_I ${PLATFORM}) + if (PROFILE STREQUAL "spirv") + set(PLATFORM_I LINUX) + endif () + shaderc_parse( + CLI # + ${ARGS_TYPE} ${PLATFORM_I} WERROR + "$<$:DEBUG>$<$:DEBUG>" + FILE ${SHADER_FILE_ABSOLUTE} + OUTPUT ${OUTPUT} + PROFILE ${PROFILE} + O "$<$:0>$<$:3>$<$:3>$<$:3>" + VARYINGDEF ${ARGS_VARYING_DEF} + INCLUDES ${BGFX_SHADER_INCLUDE_PATH} + BIN2C BIN2C ${SHADER_FILE_NAME_WE}_${PROFILE_EXT} + ) + list(APPEND OUTPUTS ${OUTPUT}) + list(APPEND COMMANDS COMMAND bgfx::shaderc ${CLI}) + endforeach () + + add_custom_command( + OUTPUT ${OUTPUTS} + COMMAND ${CMAKE_COMMAND} -E make_directory ${ARGS_OUTPUT_DIR} ${COMMANDS} + MAIN_DEPENDENCY ${SHADER_FILE_ABSOLUTE} + DEPENDS ${ARGS_VARYING_DEF} + ) + endforeach () +endfunction ()