mirror of
https://github.com/bkaradzic/bgfx.cmake.git
synced 2026-02-17 21:12:35 +01:00
Compare commits
27 Commits
v1.115.811
...
v1.115.826
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
06b995080d | ||
|
|
f5dc53db85 | ||
|
|
2051444e25 | ||
|
|
5ba5a38762 | ||
|
|
e4e935c7ae | ||
|
|
01c90714e1 | ||
|
|
6ecce2449d | ||
|
|
c717984be0 | ||
|
|
955d692550 | ||
|
|
12b75cc0ad | ||
|
|
65dde3874d | ||
|
|
f6a9fb1687 | ||
|
|
f1eed47138 | ||
|
|
9ac6e08121 | ||
|
|
6c75503da4 | ||
|
|
3dcf049202 | ||
|
|
3ec2a51aef | ||
|
|
26a0f1e54d | ||
|
|
896ab5478c | ||
|
|
23a1dc204a | ||
|
|
5fa58aad11 | ||
|
|
8dafd0d9e4 | ||
|
|
3bac602264 | ||
|
|
1b2b921bde | ||
|
|
374dcbba70 | ||
|
|
95af1cc54d | ||
|
|
e85f8c0f3c |
@@ -21,6 +21,10 @@ if( APPLE AND NOT XCODE )
|
||||
set( CMAKE_CXX_FLAGS "-ObjC++" )
|
||||
endif()
|
||||
|
||||
if (MSVC AND (MSVC_VERSION GREATER_EQUAL 1914))
|
||||
add_compile_options("/Zc:__cplusplus")
|
||||
endif()
|
||||
|
||||
option( BGFX_BUILD_TOOLS "Build bgfx tools." ON )
|
||||
option( BGFX_BUILD_EXAMPLES "Build bgfx examples." ON )
|
||||
option( BGFX_INSTALL "Create installation target." ON )
|
||||
@@ -30,6 +34,7 @@ option( BGFX_AMALGAMATED "Amalgamated bgfx build for faster compi
|
||||
option( BX_AMALGAMATED "Amalgamated bx build for faster compilation" OFF )
|
||||
option( BGFX_CONFIG_MULTITHREADED "Build bgfx with multithreaded configuration" ON )
|
||||
option( BGFX_CONFIG_RENDERER_WEBGPU "Enables the webgpu renderer" OFF )
|
||||
option( BX_CONFIG_DEBUG "Log debug messages (default: on in debug)" OFF )
|
||||
|
||||
set( BGFX_OPENGL_VERSION "" CACHE STRING "Specify minimum opengl version" )
|
||||
set( BGFX_OPENGLES_VERSION "" CACHE STRING "Specify minimum OpenGL ES version" )
|
||||
@@ -155,6 +160,8 @@ if( BGFX_INSTALL )
|
||||
)
|
||||
|
||||
# install tools
|
||||
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/bgfxToolUtils.cmake
|
||||
DESTINATION "${config_install_dir}")
|
||||
if( BGFX_BUILD_TOOLS )
|
||||
install( TARGETS shaderc
|
||||
EXPORT "${TARGETS_EXPORT_NAME}"
|
||||
|
||||
2
bgfx
2
bgfx
Submodule bgfx updated: 5ae2271667...8e94c8c2db
2
bimg
2
bimg
Submodule bimg updated: 663f724186...90ac47dfb0
2
bx
2
bx
Submodule bx updated: ad018d47c6...dbafa143d9
@@ -1,4 +1,25 @@
|
||||
@PACKAGE_INIT@
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/@TARGETS_EXPORT_NAME@.cmake")
|
||||
check_required_components("@PROJECT_NAME@")
|
||||
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)
|
||||
|
||||
# If cross compiling, we need a host-compatible version of shaderc to compile shaders
|
||||
if (@CMAKE_CROSSCOMPILING@ AND NOT TARGET bgfx::shaderc)
|
||||
find_program(
|
||||
shaderc_EXECUTABLE REQUIRED
|
||||
NAMES bgfx-shaderc shaderc
|
||||
PATHS /usr/bin
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/packages/bgfx_x64-linux/tools/bgfx
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/packages/bgfx_x64-windows/tools/bgfx
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/vcpkg/packages/bgfx_x64-osx/tools/bgfx
|
||||
)
|
||||
add_executable(bgfx::shaderc IMPORTED)
|
||||
set_target_properties(
|
||||
bgfx::shaderc PROPERTIES IMPORTED_LOCATION "${shaderc_EXECUTABLE}"
|
||||
)
|
||||
endif ()
|
||||
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/bgfxToolUtils.cmake")
|
||||
check_required_components("@PROJECT_NAME@")
|
||||
|
||||
@@ -56,6 +56,10 @@ if(BGFX_CONFIG_RENDERER_WEBGPU)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(EMSCRIPTEN)
|
||||
target_link_options(bgfx PUBLIC "-sMAX_WEBGL_VERSION=2")
|
||||
endif()
|
||||
|
||||
if( NOT ${BGFX_OPENGL_VERSION} STREQUAL "" )
|
||||
target_compile_definitions( bgfx PRIVATE BGFX_CONFIG_RENDERER_OPENGL_MIN_VERSION=${BGFX_OPENGL_VERSION} )
|
||||
endif()
|
||||
@@ -72,7 +76,7 @@ endif()
|
||||
# Add debug config required in bx headers since bx is private
|
||||
target_compile_definitions(bgfx
|
||||
PUBLIC
|
||||
"BX_CONFIG_DEBUG=$<CONFIG:Debug>"
|
||||
"BX_CONFIG_DEBUG=$<IF:$<CONFIG:Debug>,1,$<BOOL:${BX_CONFIG_DEBUG}>>"
|
||||
"BGFX_CONFIG_MULTITHREADED=$<BOOL:${BGFX_CONFIG_MULTITHREADED}>"
|
||||
)
|
||||
|
||||
|
||||
277
cmake/bgfxToolUtils.cmake
Normal file
277
cmake/bgfxToolUtils.cmake
Normal file
@@ -0,0 +1,277 @@
|
||||
# shaderc_parse(
|
||||
# FILE filename
|
||||
# OUTPUT filename
|
||||
# FRAGMENT|VERTEX|COMPUTE
|
||||
# ANDROID|ASM_JS|IOS|LINUX|NACL|OSX|WINDOWS
|
||||
# [PROFILE profile]
|
||||
# [O 0|1|2|3]
|
||||
# [VARYINGDEF filename]
|
||||
# [BIN2C filename]
|
||||
# [INCLUDES include;include]
|
||||
# [DEFINES include;include]
|
||||
# [DEPENDS]
|
||||
# [PREPROCESS]
|
||||
# [RAW]
|
||||
# [VERBOSE]
|
||||
# [DEBUG]
|
||||
# [DISASM]
|
||||
# [WERROR]
|
||||
# )
|
||||
function( shaderc_parse ARG_OUT )
|
||||
cmake_parse_arguments( ARG "DEPENDS;ANDROID;ASM_JS;IOS;LINUX;NACL;OSX;WINDOWS;PREPROCESS;RAW;FRAGMENT;VERTEX;COMPUTE;VERBOSE;DEBUG;DISASM;WERROR" "FILE;OUTPUT;VARYINGDEF;BIN2C;PROFILE;O" "INCLUDES;DEFINES" ${ARGN} )
|
||||
set( CLI "" )
|
||||
|
||||
# -f
|
||||
if( ARG_FILE )
|
||||
list( APPEND CLI "-f" "${ARG_FILE}" )
|
||||
endif()
|
||||
|
||||
# -i
|
||||
if( ARG_INCLUDES )
|
||||
foreach( INCLUDE ${ARG_INCLUDES} )
|
||||
list( APPEND CLI "-i" )
|
||||
list( APPEND CLI "${INCLUDE}" )
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
# -o
|
||||
if( ARG_OUTPUT )
|
||||
list( APPEND CLI "-o" "${ARG_OUTPUT}" )
|
||||
endif()
|
||||
|
||||
# --bin2c
|
||||
if( ARG_BIN2C )
|
||||
list( APPEND CLI "--bin2c" "${ARG_BIN2C}" )
|
||||
endif()
|
||||
|
||||
# --depends
|
||||
if( ARG_DEPENDS )
|
||||
list( APPEND CLI "--depends" )
|
||||
endif()
|
||||
|
||||
# --platform
|
||||
set( PLATFORM "" )
|
||||
set( PLATFORMS "ANDROID;ASM_JS;IOS;LINUX;NACL;OSX;WINDOWS" )
|
||||
foreach( P ${PLATFORMS} )
|
||||
if( ARG_${P} )
|
||||
if( PLATFORM )
|
||||
message( SEND_ERROR "Call to shaderc_parse() cannot have both flags ${PLATFORM} and ${P}." )
|
||||
return()
|
||||
endif()
|
||||
set( PLATFORM "${P}" )
|
||||
endif()
|
||||
endforeach()
|
||||
if( "${PLATFORM}" STREQUAL "" )
|
||||
message( SEND_ERROR "Call to shaderc_parse() must have a platform flag: ${PLATFORMS}" )
|
||||
return()
|
||||
elseif( "${PLATFORM}" STREQUAL "ANDROID" )
|
||||
list( APPEND CLI "--platform" "android" )
|
||||
elseif( "${PLATFORM}" STREQUAL "ASM_JS" )
|
||||
list( APPEND CLI "--platform" "asm.js" )
|
||||
elseif( "${PLATFORM}" STREQUAL "IOS" )
|
||||
list( APPEND CLI "--platform" "ios" )
|
||||
elseif( "${PLATFORM}" STREQUAL "LINUX" )
|
||||
list( APPEND CLI "--platform" "linux" )
|
||||
elseif( "${PLATFORM}" STREQUAL "NACL" )
|
||||
list( APPEND CLI "--platform" "nacl" )
|
||||
elseif( "${PLATFORM}" STREQUAL "OSX" )
|
||||
list( APPEND CLI "--platform" "osx" )
|
||||
elseif( "${PLATFORM}" STREQUAL "WINDOWS" )
|
||||
list( APPEND CLI "--platform" "windows" )
|
||||
endif()
|
||||
|
||||
# --preprocess
|
||||
if( ARG_PREPROCESS )
|
||||
list( APPEND CLI "--preprocess" )
|
||||
endif()
|
||||
|
||||
# --define
|
||||
if( ARG_DEFINES )
|
||||
list( APPEND CLI "--defines" )
|
||||
set( DEFINES "" )
|
||||
foreach( DEFINE ${ARG_DEFINES} )
|
||||
if( NOT "${DEFINES}" STREQUAL "" )
|
||||
set( DEFINES "${DEFINES}\\\\;${DEFINE}" )
|
||||
else()
|
||||
set( DEFINES "${DEFINE}" )
|
||||
endif()
|
||||
endforeach()
|
||||
list( APPEND CLI "${DEFINES}" )
|
||||
endif()
|
||||
|
||||
# --raw
|
||||
if( ARG_RAW )
|
||||
list( APPEND CLI "--raw" )
|
||||
endif()
|
||||
|
||||
# --type
|
||||
set( TYPE "" )
|
||||
set( TYPES "FRAGMENT;VERTEX;COMPUTE" )
|
||||
foreach( T ${TYPES} )
|
||||
if( ARG_${T} )
|
||||
if( TYPE )
|
||||
message( SEND_ERROR "Call to shaderc_parse() cannot have both flags ${TYPE} and ${T}." )
|
||||
return()
|
||||
endif()
|
||||
set( TYPE "${T}" )
|
||||
endif()
|
||||
endforeach()
|
||||
if( "${TYPE}" STREQUAL "" )
|
||||
message( SEND_ERROR "Call to shaderc_parse() must have a type flag: ${TYPES}" )
|
||||
return()
|
||||
elseif( "${TYPE}" STREQUAL "FRAGMENT" )
|
||||
list( APPEND CLI "--type" "fragment" )
|
||||
elseif( "${TYPE}" STREQUAL "VERTEX" )
|
||||
list( APPEND CLI "--type" "vertex" )
|
||||
elseif( "${TYPE}" STREQUAL "COMPUTE" )
|
||||
list( APPEND CLI "--type" "compute" )
|
||||
endif()
|
||||
|
||||
# --varyingdef
|
||||
if( ARG_VARYINGDEF )
|
||||
list( APPEND CLI "--varyingdef" "${ARG_VARYINGDEF}" )
|
||||
endif()
|
||||
|
||||
# --verbose
|
||||
if( ARG_VERBOSE )
|
||||
list( APPEND CLI "--verbose" )
|
||||
endif()
|
||||
|
||||
# --debug
|
||||
if( ARG_DEBUG )
|
||||
list( APPEND CLI "--debug" )
|
||||
endif()
|
||||
|
||||
# --disasm
|
||||
if( ARG_DISASM )
|
||||
list( APPEND CLI "--disasm" )
|
||||
endif()
|
||||
|
||||
# --profile
|
||||
if( ARG_PROFILE )
|
||||
list( APPEND CLI "--profile" "${ARG_PROFILE}" )
|
||||
endif()
|
||||
|
||||
# -O
|
||||
if( ARG_O )
|
||||
list( APPEND CLI "-O" "${ARG_O}" )
|
||||
endif()
|
||||
|
||||
# --Werror
|
||||
if( ARG_WERROR )
|
||||
list( APPEND CLI "--Werror" )
|
||||
endif()
|
||||
|
||||
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 ()
|
||||
@@ -30,6 +30,10 @@ endif()
|
||||
# Create the bx target
|
||||
add_library( bx STATIC ${BX_SOURCES} )
|
||||
|
||||
target_compile_features( bx PUBLIC cxx_std_14 )
|
||||
# (note: see bx\scripts\toolchain.lua for equivalent compiler flag)
|
||||
target_compile_options( bx PUBLIC $<$<CXX_COMPILER_ID:MSVC>:/Zc:__cplusplus> )
|
||||
|
||||
# Link against psapi on Windows
|
||||
if( WIN32 )
|
||||
target_link_libraries( bx PUBLIC psapi )
|
||||
@@ -67,7 +71,7 @@ target_compile_definitions( bx PUBLIC "__STDC_LIMIT_MACROS" )
|
||||
target_compile_definitions( bx PUBLIC "__STDC_FORMAT_MACROS" )
|
||||
target_compile_definitions( bx PUBLIC "__STDC_CONSTANT_MACROS" )
|
||||
|
||||
target_compile_definitions(bx PUBLIC "BX_CONFIG_DEBUG=$<CONFIG:Debug>")
|
||||
target_compile_definitions(bx PUBLIC "BX_CONFIG_DEBUG=$<IF:$<CONFIG:Debug>,1,$<BOOL:${BX_CONFIG_DEBUG}>>")
|
||||
|
||||
# Additional dependencies on Unix
|
||||
if (ANDROID)
|
||||
|
||||
@@ -14,6 +14,7 @@ include( ${CMAKE_CURRENT_LIST_DIR}/util/ConfigureDebugging.cmake )
|
||||
|
||||
include( ${CMAKE_CURRENT_LIST_DIR}/3rdparty/dear-imgui.cmake )
|
||||
include( ${CMAKE_CURRENT_LIST_DIR}/3rdparty/meshoptimizer.cmake )
|
||||
include( ${CMAKE_CURRENT_LIST_DIR}/bgfxToolUtils.cmake )
|
||||
|
||||
function( add_bgfx_shader FILE FOLDER )
|
||||
get_filename_component( FILENAME "${FILE}" NAME_WE )
|
||||
@@ -179,10 +180,12 @@ function( add_example ARG_NAME )
|
||||
endif()
|
||||
|
||||
if (NOT ARG_COMMON AND EMSCRIPTEN)
|
||||
target_link_libraries(example-${ARG_NAME}
|
||||
"-s PRECISE_F32=1"
|
||||
"-s TOTAL_MEMORY=268435456"
|
||||
"--memory-init-file 1")
|
||||
set_target_properties(example-${ARG_NAME}
|
||||
PROPERTIES
|
||||
LINK_FLAGS
|
||||
"-s PRECISE_F32=1 -s TOTAL_MEMORY=268435456 -s ENVIRONMENT=web --memory-init-file 1 --emrun"
|
||||
SUFFIX ".html"
|
||||
)
|
||||
endif()
|
||||
|
||||
# Directory name
|
||||
@@ -275,6 +278,7 @@ if( BGFX_BUILD_EXAMPLES )
|
||||
44-sss
|
||||
45-bokeh
|
||||
46-fsr
|
||||
47-pixelformats
|
||||
)
|
||||
|
||||
foreach( EXAMPLE ${BGFX_EXAMPLES} )
|
||||
|
||||
@@ -32,338 +32,3 @@ elseif (IOS)
|
||||
set_target_properties(shaderc PROPERTIES MACOSX_BUNDLE ON
|
||||
MACOSX_BUNDLE_GUI_IDENTIFIER shaderc)
|
||||
endif()
|
||||
|
||||
function( add_shader ARG_FILE )
|
||||
# Parse arguments
|
||||
cmake_parse_arguments( ARG "FRAGMENT;VERTEX;COMPUTE" "OUTPUT;GLSL_VERSION;DX9_MODEL;DX11_MODEL" "PLATFORMS" ${ARGN} )
|
||||
|
||||
# Get filename
|
||||
get_filename_component( FILENAME "${ARG_FILE}" NAME_WE )
|
||||
|
||||
# Determine if fragment or vertex or compute
|
||||
if( ARG_FRAGMENT AND ARG_VERTEX AND ARG_COMPUTE )
|
||||
message( SEND_ERROR "add_shader cannot be called with all FRAGMENT and VERTEX and COMPUTE." )
|
||||
return()
|
||||
elseif( ARG_FRAGMENT AND ARG_VERTEX )
|
||||
message( SEND_ERROR "add_shader cannot be called with both FRAGMENT and VERTEX." )
|
||||
return()
|
||||
elseif( ARG_FRAGMENT AND ARG_COMPUTE )
|
||||
message( SEND_ERROR "add_shader cannot be called with both FRAGMENT and COMPUTE." )
|
||||
return()
|
||||
elseif( ARG_VERTEX AND ARG_COMPUTE )
|
||||
message( SEND_ERROR "add_shader cannot be called with both VERTEX and COMPUTE." )
|
||||
return()
|
||||
endif()
|
||||
|
||||
if( ARG_FRAGMENT )
|
||||
set( TYPE "FRAGMENT" )
|
||||
set( D3D_PREFIX "ps" )
|
||||
elseif( ARG_VERTEX )
|
||||
set( TYPE "VERTEX" )
|
||||
set( D3D_PREFIX "vs" )
|
||||
elseif( ARG_COMPUTE )
|
||||
set( TYPE "COMPUTE" )
|
||||
set( D3D_PREFIX "cs" )
|
||||
else()
|
||||
message( SEND_ERROR "add_shader must be called with either FRAGMENT or VERTEX or COMPUTE." )
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Determine compatible platforms
|
||||
if( ARG_PLATFORMS )
|
||||
set( PLATFORMS ${ARG_PLATFORMS} )
|
||||
else()
|
||||
if( MSVC )
|
||||
set( PLATFORMS dx9 dx11 glsl essl asm.js spirv )
|
||||
elseif( APPLE )
|
||||
set( PLATFORMS metal glsl essl asm.js spirv )
|
||||
else()
|
||||
set( PLATFORMS glsl essl asm.js spirv )
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Build options
|
||||
set( BASE_OPTIONS
|
||||
FILE ${ARG_FILE}
|
||||
${TYPE}
|
||||
INCLUDES ${BGFX_DIR}/src
|
||||
)
|
||||
|
||||
# Parse profiles
|
||||
set( DX9_PROFILE PROFILE ${D3D_PREFIX}_3_0 )
|
||||
if( ARG_DX9_MODEL )
|
||||
set( DX9_PROFILE PROFILE ${D3D_PREFIX}_${ARG_DX9_MODEL} )
|
||||
endif()
|
||||
set( DX11_PROFILE PROFILE ${D3D_PREFIX}_5_0 )
|
||||
if( ARG_DX11_MODEL )
|
||||
set( DX11_PROFILE PROFILE ${D3D_PREFIX}_${ARG_DX11_MODEL} )
|
||||
endif()
|
||||
set( GLSL_PROFILE PROFILE 120 )
|
||||
if( ARG_COMPUTE )
|
||||
set( GLSL_PROFILE PROFILE 430 )
|
||||
endif()
|
||||
if( ARG_GLSL_VERSION )
|
||||
set( GLSL_PROFILE PROFILE ${ARG_GLSL_VERSION} )
|
||||
endif()
|
||||
set( SPIRV_PROFILE PROFILE spirv )
|
||||
|
||||
# Add commands
|
||||
set( OUTPUTS "" )
|
||||
set( COMMANDS "" )
|
||||
foreach( PLATFORM ${PLATFORMS} )
|
||||
set( OPTIONS ${BASE_OPTIONS} )
|
||||
set( OUTPUT "${ARG_OUTPUT}/${PLATFORM}/${FILENAME}.bin" )
|
||||
get_filename_component( OUTPUT "${OUTPUT}" ABSOLUTE )
|
||||
|
||||
if( "${PLATFORM}" STREQUAL "dx9" )
|
||||
list( APPEND OPTIONS
|
||||
WINDOWS
|
||||
${DX9_PROFILE}
|
||||
OUTPUT ${OUTPUT}
|
||||
)
|
||||
elseif( "${PLATFORM}" STREQUAL "dx11" )
|
||||
list( APPEND OPTIONS
|
||||
WINDOWS
|
||||
${DX11_PROFILE}
|
||||
OUTPUT ${OUTPUT}
|
||||
)
|
||||
elseif( "${PLATFORM}" STREQUAL "metal" )
|
||||
list( APPEND OPTIONS
|
||||
OSX
|
||||
PROFILE metal
|
||||
OUTPUT ${OUTPUT}
|
||||
)
|
||||
elseif( "${PLATFORM}" STREQUAL "glsl" )
|
||||
list( APPEND OPTIONS
|
||||
LINUX
|
||||
${GLSL_PROFILE}
|
||||
OUTPUT ${OUTPUT}
|
||||
)
|
||||
elseif( "${PLATFORM}" STREQUAL "essl" )
|
||||
list( APPEND OPTIONS
|
||||
ANDROID
|
||||
OUTPUT ${OUTPUT}
|
||||
)
|
||||
elseif( "${PLATFORM}" STREQUAL "asm.js" )
|
||||
list( APPEND OPTIONS
|
||||
ASM_JS
|
||||
OUTPUT ${OUTPUT}
|
||||
)
|
||||
elseif( "${PLATFORM}" STREQUAL "spirv" )
|
||||
list( APPEND OPTIONS
|
||||
LINUX
|
||||
${SPIRV_PROFILE}
|
||||
OUTPUT ${OUTPUT}
|
||||
)
|
||||
else()
|
||||
message( SEND_ERROR "add_shader given bad platform: ${PLATFORM}" )
|
||||
return()
|
||||
endif()
|
||||
|
||||
list( APPEND OUTPUTS ${OUTPUT} )
|
||||
shaderc_parse( CMD ${OPTIONS} )
|
||||
list( APPEND COMMANDS COMMAND "${CMAKE_COMMAND}" -E make_directory "${ARG_OUTPUT}/${PLATFORM}" )
|
||||
list( APPEND COMMANDS COMMAND "$<TARGET_FILE:shaderc>" ${CMD} )
|
||||
endforeach()
|
||||
|
||||
# Add command
|
||||
add_custom_command(
|
||||
MAIN_DEPENDENCY
|
||||
${ARG_FILE}
|
||||
OUTPUT
|
||||
${OUTPUTS}
|
||||
${COMMANDS}
|
||||
COMMENT "Compiling shader ${ARG_FILE}"
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
)
|
||||
|
||||
# Add to custom filter
|
||||
source_group( "Shader Files" FILES ${ARG_FILE} )
|
||||
endfunction()
|
||||
|
||||
# shaderc( FILE file OUTPUT file ... )
|
||||
# See shaderc_parse() below for inputs
|
||||
function( shaderc )
|
||||
cmake_parse_arguments( ARG "" "FILE;OUTPUT;LABEL" "" ${ARGN} )
|
||||
set( LABEL "" )
|
||||
if( ARG_LABEL )
|
||||
set( LABEL " (${ARG_LABEL})" )
|
||||
endif()
|
||||
shaderc_parse( CLI FILE ${ARG_FILE} OUTPUT ${ARG_OUTPUT} ${ARG_UNPARSED_ARGUMENTS} )
|
||||
get_filename_component( OUTDIR "${ARG_OUTPUT}" ABSOLUTE )
|
||||
get_filename_component( OUTDIR "${OUTDIR}" DIRECTORY )
|
||||
add_custom_command( OUTPUT ${ARG_OUTPUT}
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory "${OUTDIR}"
|
||||
COMMAND "$<TARGET_FILE:shaderc>" ${CLI}
|
||||
MAIN_DEPENDENCY ${ARG_FILE}
|
||||
COMMENT "Compiling shader ${ARG_FILE}${LABEL}"
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
)
|
||||
endfunction()
|
||||
|
||||
# shaderc_parse(
|
||||
# FILE filename
|
||||
# OUTPUT filename
|
||||
# FRAGMENT|VERTEX|COMPUTE
|
||||
# ANDROID|ASM_JS|IOS|LINUX|NACL|OSX|WINDOWS
|
||||
# [PROFILE profile]
|
||||
# [O 0|1|2|3]
|
||||
# [VARYINGDEF filename]
|
||||
# [BIN2C filename]
|
||||
# [INCLUDES include;include]
|
||||
# [DEFINES include;include]
|
||||
# [DEPENDS]
|
||||
# [PREPROCESS]
|
||||
# [RAW]
|
||||
# [VERBOSE]
|
||||
# [DEBUG]
|
||||
# [DISASM]
|
||||
# [WERROR]
|
||||
# )
|
||||
function( shaderc_parse ARG_OUT )
|
||||
cmake_parse_arguments( ARG "DEPENDS;ANDROID;ASM_JS;IOS;LINUX;NACL;OSX;WINDOWS;PREPROCESS;RAW;FRAGMENT;VERTEX;COMPUTE;VERBOSE;DEBUG;DISASM;WERROR" "FILE;OUTPUT;VARYINGDEF;BIN2C;PROFILE;O" "INCLUDES;DEFINES" ${ARGN} )
|
||||
set( CLI "" )
|
||||
|
||||
# -f
|
||||
if( ARG_FILE )
|
||||
list( APPEND CLI "-f" "${ARG_FILE}" )
|
||||
endif()
|
||||
|
||||
# -i
|
||||
if( ARG_INCLUDES )
|
||||
foreach( INCLUDE ${ARG_INCLUDES} )
|
||||
list( APPEND CLI "-i" )
|
||||
list( APPEND CLI "${INCLUDE}" )
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
# -o
|
||||
if( ARG_OUTPUT )
|
||||
list( APPEND CLI "-o" "${ARG_OUTPUT}" )
|
||||
endif()
|
||||
|
||||
# --bin2c
|
||||
if( ARG_BIN2C )
|
||||
list( APPEND CLI "--bin2c" "${ARG_BIN2C}" )
|
||||
endif()
|
||||
|
||||
# --depends
|
||||
if( ARG_DEPENDS )
|
||||
list( APPEND CLI "--depends" )
|
||||
endif()
|
||||
|
||||
# --platform
|
||||
set( PLATFORM "" )
|
||||
set( PLATFORMS "ANDROID;ASM_JS;IOS;LINUX;NACL;OSX;WINDOWS" )
|
||||
foreach( P ${PLATFORMS} )
|
||||
if( ARG_${P} )
|
||||
if( PLATFORM )
|
||||
message( SEND_ERROR "Call to shaderc_parse() cannot have both flags ${PLATFORM} and ${P}." )
|
||||
return()
|
||||
endif()
|
||||
set( PLATFORM "${P}" )
|
||||
endif()
|
||||
endforeach()
|
||||
if( "${PLATFORM}" STREQUAL "" )
|
||||
message( SEND_ERROR "Call to shaderc_parse() must have a platform flag: ${PLATFORMS}" )
|
||||
return()
|
||||
elseif( "${PLATFORM}" STREQUAL "ANDROID" )
|
||||
list( APPEND CLI "--platform" "android" )
|
||||
elseif( "${PLATFORM}" STREQUAL "ASM_JS" )
|
||||
list( APPEND CLI "--platform" "asm.js" )
|
||||
elseif( "${PLATFORM}" STREQUAL "IOS" )
|
||||
list( APPEND CLI "--platform" "ios" )
|
||||
elseif( "${PLATFORM}" STREQUAL "LINUX" )
|
||||
list( APPEND CLI "--platform" "linux" )
|
||||
elseif( "${PLATFORM}" STREQUAL "NACL" )
|
||||
list( APPEND CLI "--platform" "nacl" )
|
||||
elseif( "${PLATFORM}" STREQUAL "OSX" )
|
||||
list( APPEND CLI "--platform" "osx" )
|
||||
elseif( "${PLATFORM}" STREQUAL "WINDOWS" )
|
||||
list( APPEND CLI "--platform" "windows" )
|
||||
endif()
|
||||
|
||||
# --preprocess
|
||||
if( ARG_PREPROCESS )
|
||||
list( APPEND CLI "--preprocess" )
|
||||
endif()
|
||||
|
||||
# --define
|
||||
if( ARG_DEFINES )
|
||||
list( APPEND CLI "--defines" )
|
||||
set( DEFINES "" )
|
||||
foreach( DEFINE ${ARG_DEFINES} )
|
||||
if( NOT "${DEFINES}" STREQUAL "" )
|
||||
set( DEFINES "${DEFINES}\\\\;${DEFINE}" )
|
||||
else()
|
||||
set( DEFINES "${DEFINE}" )
|
||||
endif()
|
||||
endforeach()
|
||||
list( APPEND CLI "${DEFINES}" )
|
||||
endif()
|
||||
|
||||
# --raw
|
||||
if( ARG_RAW )
|
||||
list( APPEND CLI "--raw" )
|
||||
endif()
|
||||
|
||||
# --type
|
||||
set( TYPE "" )
|
||||
set( TYPES "FRAGMENT;VERTEX;COMPUTE" )
|
||||
foreach( T ${TYPES} )
|
||||
if( ARG_${T} )
|
||||
if( TYPE )
|
||||
message( SEND_ERROR "Call to shaderc_parse() cannot have both flags ${TYPE} and ${T}." )
|
||||
return()
|
||||
endif()
|
||||
set( TYPE "${T}" )
|
||||
endif()
|
||||
endforeach()
|
||||
if( "${TYPE}" STREQUAL "" )
|
||||
message( SEND_ERROR "Call to shaderc_parse() must have a type flag: ${TYPES}" )
|
||||
return()
|
||||
elseif( "${TYPE}" STREQUAL "FRAGMENT" )
|
||||
list( APPEND CLI "--type" "fragment" )
|
||||
elseif( "${TYPE}" STREQUAL "VERTEX" )
|
||||
list( APPEND CLI "--type" "vertex" )
|
||||
elseif( "${TYPE}" STREQUAL "COMPUTE" )
|
||||
list( APPEND CLI "--type" "compute" )
|
||||
endif()
|
||||
|
||||
# --varyingdef
|
||||
if( ARG_VARYINGDEF )
|
||||
list( APPEND CLI "--varyingdef" "${ARG_VARYINGDEF}" )
|
||||
endif()
|
||||
|
||||
# --verbose
|
||||
if( ARG_VERBOSE )
|
||||
list( APPEND CLI "--verbose" )
|
||||
endif()
|
||||
|
||||
# --debug
|
||||
if( ARG_DEBUG )
|
||||
list( APPEND CLI "--debug" )
|
||||
endif()
|
||||
|
||||
# --disasm
|
||||
if( ARG_DISASM )
|
||||
list( APPEND CLI "--disasm" )
|
||||
endif()
|
||||
|
||||
# --profile
|
||||
if( ARG_PROFILE )
|
||||
list( APPEND CLI "--profile" "${ARG_PROFILE}" )
|
||||
endif()
|
||||
|
||||
# -O
|
||||
if( ARG_O )
|
||||
list( APPEND CLI "-O" "${ARG_O}" )
|
||||
endif()
|
||||
|
||||
# --Werror
|
||||
if( ARG_WERROR )
|
||||
list( APPEND CLI "--Werror" )
|
||||
endif()
|
||||
|
||||
set( ${ARG_OUT} ${CLI} PARENT_SCOPE )
|
||||
endfunction()
|
||||
|
||||
Reference in New Issue
Block a user