Skip to content

Ex builtin archives #896

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 7 commits into
base: mesh_loaders
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions 3rdparty/boost/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,25 @@ add_subdirectory(superproject/libs/wave EXCLUDE_FROM_ALL)

list(APPEND NBL_BOOST_TARGETS boost_wave) # wave
foreach(BOOST_LIB IN LISTS NBL_BOOST_LIBS)
if(TARGET boost_${BOOST_LIB}) # wave's deps
list(APPEND NBL_BOOST_TARGETS boost_${BOOST_LIB})
set(lib boost_${BOOST_LIB})
if(TARGET ${lib}) # wave's deps
list(APPEND NBL_BOOST_TARGETS ${lib})
endif()
endforeach()

# NOTE: wave *must* be compiled with config definitions, inserting them just before wave
# include will lead to ABI mismatch hence we update the target and let inherit options
target_compile_definitions(boost_wave
PUBLIC BOOST_WAVE_ENABLE_COMMANDLINE_MACROS=1
PUBLIC BOOST_WAVE_SUPPORT_PRAGMA_ONCE=0
PUBLIC BOOST_WAVE_EMIT_PRAGMA_DIRECTIVES=1
PUBLIC BOOST_WAVE_SERIALIZATION=0
PUBLIC BOOST_WAVE_SUPPORT_INCLUDE_NEXT=0

# threading option: https://github.com/boostorg/wave/issues/237#issuecomment-2710251773
PUBLIC BOOST_WAVE_SUPPORT_THREADING=0
)

set(NBL_BOOST_TARGETS
${NBL_BOOST_TARGETS}
PARENT_SCOPE)
5 changes: 3 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ endif()
option(NBL_BUILD_BULLET "Enable Bullet Physics building and integration?" OFF)
option(NBL_BUILD_DOCS "Enable building documentation?" OFF) # No one has doxygen installed, plus we dont know when was the last time we generated working doxy and we'll use SphinX in the future
option(NBL_ENABLE_PROJECT_JSON_CONFIG_VALIDATION "" ON)
option(NBL_EMBED_BUILTIN_RESOURCES "Embed built-in resources?" ON)
option(NBL_EMBED_BUILTIN_RESOURCES "Embed built-in resources?" OFF)
option(NBL_ENABLE_DOCKER_INTEGRATION "Enables docker integration, if client is not found Docker Desktop will be installed" OFF)

if (NBL_ENABLE_DOCKER_INTEGRATION)
Expand Down Expand Up @@ -285,4 +285,5 @@ add_subdirectory(artifacts)
option(NBL_CPACK_INCLUDE_EXAMPLES "CPack with examples and media" ON)
include(cpack/package)
include(build/info)
export(TARGETS ${_NBL_3RDPARTY_TARGETS_} Nabla NAMESPACE Nabla:: APPEND FILE ${NBL_ROOT_PATH_BINARY}/NablaExport.cmake)
export(TARGETS ${_NBL_3RDPARTY_TARGETS_} Nabla NAMESPACE Nabla:: APPEND FILE ${NBL_ROOT_PATH_BINARY}/NablaExport.cmake)
NBL_ADJUST_FOLDERS(nabla)
1 change: 1 addition & 0 deletions CMakePresets.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"name": "ci-configure-base",
"hidden": true,
"cacheVariables": {
"NBL_EMBED_BUILTIN_RESOURCES": "ON",
"NBL_UPDATE_GIT_SUBMODULE": "OFF",
"NBL_COMPILE_WITH_CUDA": "OFF",
"NBL_BUILD_OPTIX": "OFF",
Expand Down
268 changes: 264 additions & 4 deletions cmake/common.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,7 @@ include(ProcessorCount)
macro(nbl_create_executable_project _EXTRA_SOURCES _EXTRA_OPTIONS _EXTRA_INCLUDES _EXTRA_LIBS)
get_filename_component(_NBL_PROJECT_DIRECTORY_ "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE)
get_filename_component(EXECUTABLE_NAME ${_NBL_PROJECT_DIRECTORY_} NAME)
string(REGEX REPLACE "^[0-9]+\." "" EXECUTABLE_NAME ${EXECUTABLE_NAME})
string(TOLOWER ${EXECUTABLE_NAME} EXECUTABLE_NAME)
string(MAKE_C_IDENTIFIER ${EXECUTABLE_NAME} EXECUTABLE_NAME)

project(${EXECUTABLE_NAME})
set_directory_properties(PROPERTIES VS_STARTUP_PROJECT ${EXECUTABLE_NAME})
Expand Down Expand Up @@ -1223,9 +1221,271 @@ function(NBL_ADJUST_FOLDERS NS)
get_target_property(NBL_FOLDER ${T} FOLDER)

if(NBL_FOLDER)
set_target_properties(${T} PROPERTIES FOLDER "nabla/${NS}/${NBL_FOLDER}")
set_target_properties(${T} PROPERTIES FOLDER "${NS}/${NBL_FOLDER}")
else()
set_target_properties(${T} PROPERTIES FOLDER "nabla/${NS}")
set_target_properties(${T} PROPERTIES FOLDER "${NS}")
endif()
endforeach()
endfunction()

function(NBL_REGISTER_SPIRV_SHADERS)
cmake_parse_arguments(IMPL "" "DISCARD;LINK_TO;MOUNT_POINT_DEFINE" "PERMUTE;REQUIRED;ARCHIVE;INPUTS" ${ARGN})

if(NOT IMPL_MOUNT_POINT_DEFINE)
message(FATAL_ERROR "MOUNT_POINT_DEFINE argument missing!")
endif()

if(NOT IMPL_ARCHIVE)
message(FATAL_ERROR "ARCHIVE arguments missing!")
endif()

cmake_parse_arguments(IMPL "" "TARGET;INPUT_DIRECTORY;NAMESPACE;PREFIX" "" ${IMPL_ARCHIVE})

if(NOT IMPL_TARGET)
message(FATAL_ERROR "Missing TARGET argument in ARCHIVE specification!")
endif()

if(NOT IMPL_INPUT_DIRECTORY)
message(FATAL_ERROR "Missing INPUT_DIRECTORY argument in ARCHIVE specification!")
endif()

if(NOT IMPL_NAMESPACE)
message(FATAL_ERROR "Missing NAMESPACE argument in ARCHIVE specification!")
endif()

set(_BUNDLE_ARCHIVE_ABSOLUTE_PATH_ ${IMPL_PREFIX})
get_filename_component(_BUNDLE_SEARCH_DIRECTORY_ "${CMAKE_CURRENT_BINARY_DIR}/builtin/spirv/shaders/mount-point" ABSOLUTE)
get_filename_component(_OUTPUT_DIRECTORY_SOURCE_ "${CMAKE_CURRENT_BINARY_DIR}/builtin/spirv/archive/src" ABSOLUTE)
get_filename_component(_OUTPUT_DIRECTORY_HEADER_ "${CMAKE_CURRENT_BINARY_DIR}/builtin/spirv/archive/include" ABSOLUTE)

set(_BUILTIN_RESOURCES_NAMESPACE_ ${IMPL_NAMESPACE})
set(_LINK_MODE_ STATIC)

get_filename_component(BUILTIN_ARCHIVE_INPUT_ABS_ENTRY "${IMPL_INPUT_DIRECTORY}" ABSOLUTE)
set(BUILTIN_KEY_ENTRY_ABS "${BUILTIN_ARCHIVE_INPUT_ABS_ENTRY}/${_BUNDLE_ARCHIVE_ABSOLUTE_PATH_}")

# REMOVE IT AND ADD "DEPENDS" to INPUTS
# file(GLOB_RECURSE _DEPENDS_ON_ CONFIGURE_DEPENDS "${BUILTIN_KEY_ENTRY_ABS}/*.hlsl")
# list(FILTER _DEPENDS_ON_ EXCLUDE REGEX /preprocessed.hlsl)
# and maybe extra DEPENDS shared for all inputs
####################

set(SPIRV_OUTPUT_ARCHIVE_KEY_ABS_ENTRY_DIR "${_BUNDLE_SEARCH_DIRECTORY_}/${_BUNDLE_ARCHIVE_ABSOLUTE_PATH_}")

set(DEVICE_CONFIG_ENTRY_DIR "${_BUNDLE_SEARCH_DIRECTORY_}/PermutationCaps")
set(DEVICE_CONFIG_TEMPLATE_PATH "${DEVICE_CONFIG_ENTRY_DIR}/DeviceConfig.hlsl")
file(REMOVE_RECURSE "${DEVICE_CONFIG_ENTRY_DIR}/")

set(DEVICE_CONFIG_VIEW
[=[

// -> this code has been autogenerated!
#ifndef _PERMUTATION_CAPS_AUTO_GEN_GLOBALS_INCLUDED_
#define _PERMUTATION_CAPS_AUTO_GEN_GLOBALS_INCLUDED_
#ifdef __HLSL_VERSION
#include <nbl/builtin/hlsl/cpp_compat/basic.h>
struct DeviceConfigCaps
{
@CAPS_EVAL@
};
#endif // __HLSL_VERSION
#endif // _PERMUTATION_CAPS_AUTO_GEN_GLOBALS_INCLUDED_
// <- this code has been autogenerated!

/*
note: (**)
we have a bug and I cannot use -D to create
define with dxc options, it gets ignored, so
temporary I will create .int input files to
glue device permutation caps config with input

#ifndef NBL_DYMANIC_INCLUDE
#error "NBL_DYMANIC_INCLUDE must be defined!"
#endif // NBL_DYMANIC_INCLUDE

// proxy HLSL input with #define
#include NBL_DYMANIC_INCLUDE
*/
]=]
)
set(KEY_EXTENSION .spv)

if(IMPL_PERMUTE)
list(LENGTH IMPL_PERMUTE KEYS_LENGTH)
math(EXPR TOTAL_INDEX_RANGE "(1 << ${KEYS_LENGTH}) - 1")
else()
set(TOTAL_INDEX_RANGE 0)
endif()

foreach(INDEX RANGE 0 ${TOTAL_INDEX_RANGE})
set(BIT_INDEX 0)
unset(CAPS_EVAL)
unset(POSTFIX_ACCESS_KEY)

foreach(KEY IN LISTS IMPL_PERMUTE)
math(EXPR BIT "((${INDEX} >> ${BIT_INDEX}) & 1)")
if(BIT EQUAL 1)
set(STATE "true")
else()
set(STATE "false")
endif()
string(APPEND POSTFIX_ACCESS_KEY "_${KEY}=${STATE}")
string(APPEND CAPS_EVAL "NBL_CONSTEXPR_STATIC_INLINE bool ${KEY} = ${STATE}; // got permuted\n")
math(EXPR BIT_INDEX "${BIT_INDEX} + 1")
endforeach()

foreach(KEY IN LISTS IMPL_REQUIRED)
string(APPEND CAPS_EVAL "NBL_CONSTEXPR_STATIC_INLINE bool ${KEY} = true; // always required\n")
endforeach()

# generate permuted config
set(PERMUTED_DEVICE_CONFIG "${DEVICE_CONFIG_TEMPLATE_PATH}${POSTFIX_ACCESS_KEY}")
list(APPEND DEVICE_CONFIG_FILES "${PERMUTED_DEVICE_CONFIG}")
string(CONFIGURE "${DEVICE_CONFIG_VIEW}" CONFIG_CONTENT @ONLY)
file(WRITE "${PERMUTED_DEVICE_CONFIG}" "${CONFIG_CONTENT}")

# create compile rules for given input with permuted config
set(i 0)
list(LENGTH IMPL_INPUTS LEN)
while(i LESS LEN)
list(GET IMPL_INPUTS ${i} TOKEN)
if(TOKEN STREQUAL "KEY")
math(EXPR i "${i} + 1")
list(GET IMPL_INPUTS ${i} FILEPATH)
set(COMPILE_OPTIONS "")
math(EXPR i "${i} + 1")

list(GET IMPL_INPUTS ${i} NEXT)
if(NOT NEXT STREQUAL "COMPILE_OPTIONS")
message(FATAL_ERROR "Expected COMPILE_OPTIONS after KEY ${FILEPATH}")
endif()
math(EXPR i "${i} + 1")

while(i LESS LEN)
list(GET IMPL_INPUTS ${i} ARG)
if(ARG STREQUAL "KEY")
break()
endif()
list(APPEND COMPILE_OPTIONS "${ARG}")
math(EXPR i "${i} + 1")
endwhile()

set(IMPL_KEY ${FILEPATH})
set(TARGET_KEY "${IMPL_KEY}${POSTFIX_ACCESS_KEY}${KEY_EXTENSION}")

if(IMPL_DISCARD AND "${POSTFIX_ACCESS_KEY}" MATCHES "${IMPL_DISCARD}")
if(NBL_LOG_VERBOSE)
message(STATUS "[Nabla Builtin SPIRV]: Discarded \"${TARGET_KEY}\" key for ${IMPL_TARGET}")
endif()
continue()
endif()

if(NBL_LOG_VERBOSE)
message(STATUS "[Nabla Builtin SPIRV]: Registered \"${TARGET_KEY}\" key ${IMPL_TARGET}")
endif()

set(TARGET_INPUT "${BUILTIN_KEY_ENTRY_ABS}/${IMPL_KEY}")
list(APPEND REQUESTED_INPUTS "${TARGET_INPUT}")
set(TAGET_OUTPUT "${SPIRV_OUTPUT_ARCHIVE_KEY_ABS_ENTRY_DIR}/${TARGET_KEY}")
list(APPEND SPIRV_OUTPUTS "${TAGET_OUTPUT}")

# doing as workaround for (**), dynamic define include could be better because then I don't have to generate intermediate files with glue at configure time
set(INT_INPUT "${SPIRV_OUTPUT_ARCHIVE_KEY_ABS_ENTRY_DIR}/.int/${TARGET_KEY}")
list(APPEND INT_FILES "${INT_INPUT}")
set(INT_INPUT_VIEW
[=[

@INPUT_CONFIG_CONTENT@

#include "@PERMUTED_DEVICE_CONFIG@"
#include "@TARGET_INPUT@"

]=]
)

string(CONFIGURE "${INT_INPUT_VIEW}" INT_CONTENT @ONLY)
file(WRITE "${INT_INPUT}" "${INT_CONTENT}")

set(REQUIRED_INCLUDES
-I "${NBL_ROOT_PATH}/include"
-I "${NBL_ROOT_PATH}/3rdparty/dxc/dxc/external/SPIRV-Headers/include"
-I "${NBL_ROOT_PATH}/3rdparty/boost/superproject/libs/preprocessor/include"
-I "${NBL_ROOT_PATH_BINARY}/src/nbl/device/include"
)

# would get added by NSC anyway and spam in output
set(REQUIRED_OPTIONS
-HV 202x
-Wno-c++14-extensions
-Wno-gnu-static-float-init
-Wno-c++1z-extensions
-Wno-c++11-extensions
-fvk-use-scalar-layout
-enable-16bit-types
-Zpr
-spirv
-fspv-target-env=vulkan1.3
)

if(NOT NBL_EMBED_BUILTIN_RESOURCES)
list(APPEND REQUIRED_OPTIONS ${REQUIRED_INCLUDES})
endif()

set(NBL_NSC_COMPILE_COMMAND
"$<TARGET_FILE:nsc>"
-Fc "${TAGET_OUTPUT}"
${COMPILE_OPTIONS} ${REQUIRED_OPTIONS}
# "-DNBL_DYMANIC_INCLUDE=<${TARGET_INPUT}>" # (**)!
"${INT_INPUT}"
)

add_custom_command(OUTPUT "${TAGET_OUTPUT}"
COMMAND ${NBL_NSC_COMPILE_COMMAND}
DEPENDS ${_DEPENDS_ON_} ${INT_INPUT}
COMMENT "Creating ${TAGET_OUTPUT}"
VERBATIM
COMMAND_EXPAND_LISTS
)

if(NBL_EMBED_BUILTIN_RESOURCES)
LIST_BUILTIN_RESOURCE(NBL_RESOURCES_TO_EMBED ${TARGET_KEY})
endif()
else()
math(EXPR i "${i} + 1")
endif()
endwhile()
endforeach()

if(NBL_EMBED_BUILTIN_RESOURCES)
ADD_CUSTOM_BUILTIN_RESOURCES(${IMPL_TARGET} NBL_RESOURCES_TO_EMBED "${_BUNDLE_SEARCH_DIRECTORY_}" "${_BUNDLE_ARCHIVE_ABSOLUTE_PATH_}" "${_BUILTIN_RESOURCES_NAMESPACE_}" "${_OUTPUT_DIRECTORY_HEADER_}" "${_OUTPUT_DIRECTORY_SOURCE_}" "${_LINK_MODE_}")
else()
add_library(${IMPL_TARGET} INTERFACE)
endif()

target_compile_definitions(${IMPL_TARGET} INTERFACE ${IMPL_MOUNT_POINT_DEFINE}="${_BUNDLE_SEARCH_DIRECTORY_}")

if(IMPL_LINK_TO)
if(NBL_EMBED_BUILTIN_RESOURCES)
LINK_BUILTIN_RESOURCES_TO_TARGET(${IMPL_LINK_TO} ${IMPL_TARGET})
else()
target_link_libraries(${IMPL_LINK_TO} INTERFACE ${IMPL_TARGET})
endif()
endif()

set(HEADER_ONLY ${INT_FILES} ${DEVICE_CONFIG_FILES} ${REQUESTED_INPUTS} ${SPIRV_OUTPUTS})
target_sources(${IMPL_TARGET} PRIVATE ${HEADER_ONLY})

set_source_files_properties(${HEADER_ONLY} PROPERTIES
HEADER_FILE_ONLY ON
VS_TOOL_OVERRIDE None
)

set(RTE "Resources to embed")
set(IN "${RTE}/In")
set(OUT "${RTE}/Out")

source_group("${IN}/Intermediate" FILES ${INT_FILES})
source_group("${IN}/Device Configs" FILES ${DEVICE_CONFIG_FILES})
source_group("${IN}" FILES ${REQUESTED_INPUTS})
source_group("${OUT}" FILES ${SPIRV_OUTPUTS})
endfunction()
2 changes: 1 addition & 1 deletion docker/compiler-explorer
3 changes: 2 additions & 1 deletion include/nbl/asset/IShader.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
#ifndef _NBL_ASSET_I_SHADER_H_INCLUDED_
#define _NBL_ASSET_I_SHADER_H_INCLUDED_


#include "nbl/asset/IAsset.h"
#include "nbl/asset/ICPUBuffer.h"
#include "nbl/core/declarations.h"
#include "nbl/builtin/hlsl/enums.hlsl"

Expand Down
Loading
Loading