mirror of
https://github.com/bkaradzic/bgfx.cmake.git
synced 2026-02-17 21:12:35 +01:00
ToolUtils: Add helper to compile shader to header
This commit is contained 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@")
|
||||
|
||||
@@ -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
|
||||
"$<$<CONFIG:debug>:DEBUG>$<$<CONFIG:relwithdebinfo>:DEBUG>"
|
||||
FILE ${SHADER_FILE_ABSOLUTE}
|
||||
OUTPUT ${OUTPUT}
|
||||
PROFILE ${PROFILE}
|
||||
O "$<$<CONFIG:debug>:0>$<$<CONFIG:release>:3>$<$<CONFIG:relwithdebinfo>:3>$<$<CONFIG:minsizerel>: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 ()
|
||||
|
||||
Reference in New Issue
Block a user