Files
QuaternionEngine/src/CMakeLists.txt
2025-12-27 21:41:14 +09:00

384 lines
12 KiB
CMake

# Add source to this project's executable.
add_executable (vulkan_engine
main.cpp
# core root
core/types.h
core/world.h
core/config.h
core/context.h
core/context.cpp
core/engine.h
core/engine.cpp
core/engine_ui.cpp
core/input/input_system.h
core/input/input_system.cpp
core/ui/imgui_system.h
core/ui/imgui_system.cpp
core/picking/picking_system.h
core/picking/picking_system.cpp
core/debug_draw/debug_draw.h
core/debug_draw/debug_draw.cpp
core/game_api.h
core/game_api.cpp
# core/device
core/device/device.h
core/device/device.cpp
core/device/swapchain.h
core/device/swapchain.cpp
core/device/resource.h
core/device/resource.cpp
core/device/images.h
core/device/images.cpp
# core/descriptor
core/descriptor/descriptors.h
core/descriptor/descriptors.cpp
core/descriptor/manager.h
core/descriptor/manager.cpp
# core/pipeline
core/pipeline/manager.h
core/pipeline/manager.cpp
core/pipeline/sampler.h
core/pipeline/sampler.cpp
# core/assets
core/assets/locator.h
core/assets/locator.cpp
core/assets/manager.h
core/assets/manager.cpp
core/assets/async_loader.h
core/assets/async_loader.cpp
core/assets/texture_cache.h
core/assets/texture_cache.cpp
core/assets/ktx_loader.h
core/assets/ktx_loader.cpp
core/assets/ibl_manager.h
core/assets/ibl_manager.cpp
# core/frame
core/frame/resources.h
core/frame/resources.cpp
# core/util
core/util/initializers.h
core/util/initializers.cpp
core/util/debug.h
core/util/debug.cpp
# core/raytracing
core/raytracing/raytracing.h
core/raytracing/raytracing.cpp
# render
render/pipelines.h
render/pipelines.cpp
render/renderpass.h
render/renderpass.cpp
render/materials.h
render/materials.cpp
render/primitives.h
# render passes
render/passes/background.h
render/passes/background.cpp
render/passes/geometry.h
render/passes/geometry.cpp
render/passes/lighting.h
render/passes/lighting.cpp
render/passes/shadow.h
render/passes/shadow.cpp
render/passes/fxaa.h
render/passes/fxaa.cpp
render/passes/ssr.h
render/passes/ssr.cpp
render/passes/clouds.h
render/passes/clouds.cpp
render/passes/particles.h
render/passes/particles.cpp
render/passes/transparent.h
render/passes/transparent.cpp
render/passes/imgui_pass.h
render/passes/imgui_pass.cpp
render/passes/tonemap.h
render/passes/tonemap.cpp
render/passes/debug_draw.h
render/passes/debug_draw.cpp
# render graph
render/graph/types.h
render/graph/graph.h
render/graph/graph.cpp
render/graph/builder.h
render/graph/builder.cpp
render/graph/resources.h
render/graph/resources.cpp
# scene
scene/vk_scene.h
scene/vk_scene.cpp
scene/vk_scene_picking.cpp
scene/mesh_bvh.h
scene/mesh_bvh.cpp
scene/vk_loader.h
scene/vk_loader.cpp
scene/tangent_space.h
scene/tangent_space.cpp
scene/camera.h
scene/camera.cpp
scene/camera/icamera_mode.h
scene/camera/camera_rig.h
scene/camera/camera_rig.cpp
scene/camera/mode_free.h
scene/camera/mode_free.cpp
scene/camera/mode_orbit.h
scene/camera/mode_orbit.cpp
scene/camera/mode_follow.h
scene/camera/mode_follow.cpp
scene/camera/mode_chase.h
scene/camera/mode_chase.cpp
scene/camera/mode_fixed.h
scene/camera/mode_fixed.cpp
# compute
compute/vk_compute.h
compute/vk_compute.cpp
# runtime
runtime/i_game_callbacks.h
runtime/time_manager.h
runtime/time_manager.cpp
runtime/game_runtime.h
runtime/game_runtime.cpp
)
set_property(TARGET vulkan_engine PROPERTY CXX_STANDARD 20)
target_compile_definitions(vulkan_engine PUBLIC GLM_FORCE_DEPTH_ZERO_TO_ONE)
# ==============================================================================
# Compiler/OS-specific optimization flags
# ==============================================================================
# Detect clang-cl (Clang with MSVC frontend)
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC")
set(USING_CLANG_CL TRUE)
else()
set(USING_CLANG_CL FALSE)
endif()
# --- Release build optimizations ---
if (CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
if (MSVC AND NOT USING_CLANG_CL)
# MSVC (cl.exe)
target_compile_options(vulkan_engine PRIVATE
/O2 # Maximum speed optimization
/Ob2 # Inline expansion (any suitable)
/Oi # Enable intrinsic functions
/Ot # Favor fast code
/Oy # Omit frame pointers
/GL # Whole program optimization
/fp:fast # Fast floating-point
/GS- # Disable buffer security checks (perf)
)
target_link_options(vulkan_engine PRIVATE
/LTCG # Link-time code generation
/OPT:REF # Remove unreferenced functions
/OPT:ICF # Identical COMDAT folding
)
# Optional: AVX2 for modern CPUs (uncomment if needed)
# target_compile_options(vulkan_engine PRIVATE /arch:AVX2)
elseif (USING_CLANG_CL)
# Clang-cl (Clang with MSVC-compatible flags)
target_compile_options(vulkan_engine PRIVATE
/O2
/Ob2
/Oi
/Ot
/fp:fast
-flto=thin # ThinLTO for faster link times
-fno-strict-aliasing
)
target_link_options(vulkan_engine PRIVATE
-flto=thin
/OPT:REF
/OPT:ICF
)
# Optional: AVX2
target_compile_options(vulkan_engine PRIVATE /arch:AVX2)
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
# GCC (g++)
target_compile_options(vulkan_engine PRIVATE
-O3 # High optimization level
-march=native # Optimize for host CPU
-mtune=native # Tune for host CPU
-flto # Link-time optimization
-ffast-math # Fast floating-point
-funroll-loops # Loop unrolling
-fomit-frame-pointer # Omit frame pointers
-fno-strict-aliasing
)
target_link_options(vulkan_engine PRIVATE
-flto
-s # Strip symbols
)
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
# Clang (non-Windows / Linux/macOS)
target_compile_options(vulkan_engine PRIVATE
-O3
-march=native
-mtune=native
-flto=thin
-ffast-math
-funroll-loops
-fomit-frame-pointer
-fno-strict-aliasing
)
target_link_options(vulkan_engine PRIVATE
-flto=thin
)
endif()
endif()
# --- Debug build options ---
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
if (MSVC)
# MSVC / Clang-cl debug
target_compile_options(vulkan_engine PRIVATE
/Od # Disable optimization
/Zi # Debug information
/RTC1 # Runtime checks
/GS # Buffer security checks
)
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
# GCC / Clang debug
target_compile_options(vulkan_engine PRIVATE
-O0 # No optimization
-g3 # Maximum debug info
-fno-omit-frame-pointer # Keep frame pointers for debugging
-fsanitize=address,undefined # Optional: sanitizers
)
target_link_options(vulkan_engine PRIVATE
-fsanitize=address,undefined
)
endif()
endif()
# --- Platform-specific flags ---
if (WIN32)
target_compile_definitions(vulkan_engine PRIVATE
WIN32_LEAN_AND_MEAN
NOMINMAX
_CRT_SECURE_NO_WARNINGS
)
endif()
if (UNIX AND NOT APPLE)
# Linux-specific
target_link_libraries(vulkan_engine PRIVATE pthread dl)
endif()
if (APPLE)
# macOS-specific (if needed)
target_compile_options(vulkan_engine PRIVATE
-Wno-deprecated-declarations
)
endif()
target_include_directories(vulkan_engine PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}/core"
"${CMAKE_CURRENT_SOURCE_DIR}/core/device"
"${CMAKE_CURRENT_SOURCE_DIR}/core/descriptor"
"${CMAKE_CURRENT_SOURCE_DIR}/core/pipeline"
"${CMAKE_CURRENT_SOURCE_DIR}/core/assets"
"${CMAKE_CURRENT_SOURCE_DIR}/core/frame"
"${CMAKE_CURRENT_SOURCE_DIR}/core/util"
"${CMAKE_CURRENT_SOURCE_DIR}/core/raytracing"
"${CMAKE_CURRENT_SOURCE_DIR}/render"
"${CMAKE_CURRENT_SOURCE_DIR}/render/passes"
"${CMAKE_CURRENT_SOURCE_DIR}/render/graph"
"${CMAKE_CURRENT_SOURCE_DIR}/scene"
"${CMAKE_CURRENT_SOURCE_DIR}/compute"
"${CMAKE_CURRENT_SOURCE_DIR}/runtime"
)
option(ENABLE_MIKKTS "Use MikkTSpace for tangent generation" ON)
target_link_libraries(vulkan_engine PUBLIC vma glm Vulkan::Vulkan fmt::fmt stb_image SDL2::SDL2 vkbootstrap imgui fastgltf::fastgltf ImGuizmo BVH2)
if (ENABLE_MIKKTS)
target_link_libraries(vulkan_engine PUBLIC mikktspace)
target_compile_definitions(vulkan_engine PUBLIC MIKKTS_ENABLE=1)
endif()
add_library(vma_impl OBJECT vma_impl.cpp)
target_include_directories(vma_impl PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../third_party/vma")
target_link_libraries(vma_impl PRIVATE Vulkan::Vulkan)
target_link_libraries(vulkan_engine PUBLIC $<TARGET_OBJECTS:vma_impl>)
target_precompile_headers(vulkan_engine PRIVATE
<optional>
<vector>
<memory>
<string>
<unordered_map>
<glm/mat4x4.hpp>
<glm/vec4.hpp>
<vulkan/vulkan.h>
)
if(WIN32)
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21)
add_custom_command(TARGET vulkan_engine POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_RUNTIME_DLLS:vulkan_engine> $<TARGET_FILE_DIR:vulkan_engine>
COMMAND_EXPAND_LISTS
)
else()
message(WARNING "CMake < 3.21: skipping runtime DLL copy step for vulkan_engine")
endif()
endif()
# KTX (libktx)
# NOTE: Under WSL it's easy to accidentally pick up the Windows KTX package (ktx.dll),
# which will configure but fail to link on Linux. Prefer the native library when needed.
find_package(ktx CONFIG QUIET)
set(_KTX_CMAKE_TARGET "")
if(TARGET ktx::ktx)
set(_KTX_CMAKE_TARGET ktx::ktx)
elseif(TARGET KTX::ktx)
set(_KTX_CMAKE_TARGET KTX::ktx)
elseif(TARGET ktx)
set(_KTX_CMAKE_TARGET ktx)
endif()
set(_KTX_USE_FALLBACK OFF)
if(_KTX_CMAKE_TARGET STREQUAL "")
set(_KTX_USE_FALLBACK ON)
else()
get_target_property(_KTX_IMPORTED "${_KTX_CMAKE_TARGET}" IMPORTED)
if(_KTX_IMPORTED)
set(_KTX_IMPORTED_LOCATION "")
get_target_property(_KTX_IMPORTED_LOCATION "${_KTX_CMAKE_TARGET}" IMPORTED_LOCATION)
if(NOT _KTX_IMPORTED_LOCATION)
get_target_property(_KTX_IMPORTED_LOCATION "${_KTX_CMAKE_TARGET}" IMPORTED_LOCATION_RELEASE)
endif()
if(NOT _KTX_IMPORTED_LOCATION)
get_target_property(_KTX_IMPORTED_LOCATION "${_KTX_CMAKE_TARGET}" IMPORTED_LOCATION_DEBUG)
endif()
if(NOT _KTX_IMPORTED_LOCATION)
set(_KTX_USE_FALLBACK ON)
elseif(NOT WIN32 AND _KTX_IMPORTED_LOCATION MATCHES "\\.dll$|\\.lib$")
set(_KTX_USE_FALLBACK ON)
endif()
endif()
endif()
if(_KTX_USE_FALLBACK)
find_path(KTX_INCLUDE_DIR NAMES ktx.h)
find_library(KTX_LIBRARY NAMES ktx)
if(NOT KTX_INCLUDE_DIR OR NOT KTX_LIBRARY)
message(FATAL_ERROR "libktx not found; please install KTX v2 and make it discoverable via ktx_DIR or CMAKE_PREFIX_PATH")
endif()
target_include_directories(vulkan_engine PUBLIC "${KTX_INCLUDE_DIR}")
target_link_libraries(vulkan_engine PUBLIC "${KTX_LIBRARY}")
else()
target_link_libraries(vulkan_engine PUBLIC "${_KTX_CMAKE_TARGET}")
endif()