cmake_minimum_required(VERSION 3.31.0)
project(vk-renderer)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/build)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/build)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/build)
find_package(Vulkan REQUIRED)
# glfw
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
add_subdirectory(${CMAKE_SOURCE_DIR}/third-party/glfw)
# VMA
add_subdirectory(${CMAKE_SOURCE_DIR}/third-party/VMA)
# KTX
set(KTX_FEATURE_TESTS OFF CACHE BOOL "" FORCE)
set(KTX_FEATURE_TOOLS OFF CACHE BOOL "" FORCE)
set(KTX_FEATURE_DOC OFF CACHE BOOL "" FORCE)
set(KTX_FEATURE_GL_UPLOAD OFF CACHE BOOL "" FORCE)
set(KTX_FEATURE_VK_UPLOAD OFF CACHE BOOL "" FORCE)
set(KTX_FEATURE_LOADTEST_APPS OFF CACHE BOOL "" FORCE)
add_subdirectory(${CMAKE_SOURCE_DIR}/third-party/KTX-Software)
# plog
add_subdirectory(${CMAKE_SOURCE_DIR}/third-party/plog)
# rtm (header-only math library)
add_library(rtm INTERFACE)
target_include_directories(rtm INTERFACE ${CMAKE_SOURCE_DIR}/third-party/rtm/includes)
# tracy
set(ENABLE_TRACY OFF)
if(ENABLE_TRACY)
add_subdirectory(${CMAKE_SOURCE_DIR}/third-party/tracy)
add_compile_definitions(TRACY_ENABLE)
endif()
set(ENABLE_EDITOR ON)
if(ENABLE_EDITOR)
add_compile_definitions(ENABLE_EDITOR)
endif()
# slang
include(FetchContent)
set(SLANG_VERSION "2026.17.1")
if(WIN32)
set(SLANG_URL "https://github.com/shader-slang/slang/releases/download/v${SLANG_VERSION}/slang-${SLANG_VERSION}-windows-x86_64.zip")
elseif(APPLE)
set(SLANG_URL "https://github.com/shader-slang/slang/releases/download/v${SLANG_VERSION}/slang-${SLANG_VERSION}-macos-aarch64.tar.gz")
else()
set(SLANG_URL "https://github.com/shader-slang/slang/releases/download/v${SLANG_VERSION}/slang-${SLANG_VERSION}-linux-x86_64.tar.gz")
endif()
FetchContent_Declare(slang URL ${SLANG_URL})
FetchContent_MakeAvailable(slang)
set(SLANG_ROOT ${slang_SOURCE_DIR})
if(WIN32)
set(SLANG_LIB ${SLANG_ROOT}/lib/slang.lib)
elseif(APPLE)
set(SLANG_LIB ${SLANG_ROOT}/lib/libslang.dylib)
else()
set(SLANG_LIB ${SLANG_ROOT}/lib/libslang.so)
endif()
set(IMGUI_DIR ${CMAKE_SOURCE_DIR}/third-party/imgui)
add_executable(${PROJECT_NAME}
src/renderer.cpp
src/quick_submit.cpp
src/pipelines.cpp
src/passes/fg.cpp
#
src/asset/asset.cpp
src/asset/texture.cpp
src/asset/gltf.cpp
#
third-party/mikktspace.c
#
src/scene/scene.cpp
src/scene/ibl.cpp
#
src/backend/vulkan/context.cpp
src/backend/vulkan/swapchain.cpp
src/backend/vulkan/pipeline.cpp
src/backend/vulkan/descriptors.cpp
src/backend/vulkan/debug.cpp
src/backend/vulkan/query_pool.cpp
src/backend/vulkan/cmd_pool.cpp
src/backend/vulkan/cmd_buffer.cpp
src/backend/vulkan/allocator.cpp
src/backend/vulkan/queue.cpp
src/backend/vulkan/buffer.cpp
src/backend/vulkan/image.cpp
src/backend/vulkan/sampler.cpp
src/backend/vulkan/shader.cpp
src/backend/vulkan/accel_struct.cpp
src/backend/vulkan/vk_conversion.cpp
src/backend/vulkan/rhi_helpers.cpp
#
src/core/arena.cpp
src/core/platform.cpp
src/core/math_rtm.cpp
src/core/logger.cpp
#
src/passes/ssr/ssr.cpp
# src/passes/pass_frustum_debug.cpp
src/passes/depth_pre/depth_normal.cpp
src/passes/dispatch_mdi/build_indirect.cpp
src/passes/forward/forward.cpp
src/passes/fwd_cpu/fwd_cpu.cpp
src/passes/shadow/shadow.cpp
src/passes/grid/grid.cpp
src/passes/id_blit/id_blit.cpp
src/passes/fullscreen/fullscreen.cpp
src/passes/cluster/cluster_bounds.cpp
src/passes/cluster/light_cull.cpp
src/passes/hiz/hiz.cpp
src/passes/imgui/imgui.cpp
src/passes/skybox/skybox.cpp
src/passes/rt_build.cpp
src/passes/ddgi/ddgi_trace.cpp
src/passes/ddgi/ddgi_update.cpp
src/passes/ddgi/ddgi_classify.cpp
src/passes/ddgi/ddgi_relocate.cpp
src/passes/ddgi/ddgi_probes_dbg.cpp
src/passes/debug/debug_lines.cpp
)
if(ENABLE_EDITOR)
target_sources(${PROJECT_NAME} PRIVATE
src/editor/editor.cpp
src/editor/debug_draw.cpp
src/editor/frame.cpp
src/editor/gizmo.cpp
src/editor/style.cpp
src/editor/viewport.cpp
src/editor/log_viewer.cpp
src/editor/texture_viewer.cpp
src/editor/targets.cpp
src/editor/timings.cpp
src/editor/hierarchy.cpp
src/editor/inspector.cpp
src/backend/imgui_backend.cpp
${IMGUI_DIR}/imgui.cpp
${IMGUI_DIR}/imgui_draw.cpp
${IMGUI_DIR}/imgui_tables.cpp
${IMGUI_DIR}/imgui_widgets.cpp
${IMGUI_DIR}/imgui_demo.cpp
${IMGUI_DIR}/backends/imgui_impl_glfw.cpp
)
endif()
file(GLOB_RECURSE THIRD_PARTY_SOURCES
"${CMAKE_SOURCE_DIR}/third-party/*.c"
"${CMAKE_SOURCE_DIR}/third-party/*.cc"
"${CMAKE_SOURCE_DIR}/third-party/*.cpp"
"${CMAKE_SOURCE_DIR}/third-party/*.cxx"
)
file(TO_CMAKE_PATH "${CMAKE_SOURCE_DIR}/src" CLANG_TIDY_SRC_DIR)
set_target_properties(${PROJECT_NAME} PROPERTIES CXX_CLANG_TIDY "clang-tidy;--header-filter=${CLANG_TIDY_SRC_DIR}/.*")
set_source_files_properties(
${THIRD_PARTY_SOURCES}
PROPERTIES SKIP_LINTING ON
)
target_link_libraries(${PROJECT_NAME} PRIVATE
Vulkan::Vulkan
glfw
VulkanMemoryAllocator
plog::plog
ktx
rtm
${SLANG_LIB}
)
if(WIN32)
target_link_libraries(${PROJECT_NAME} PRIVATE
dwmapi
)
endif()
if(ENABLE_TRACY)
target_link_libraries(${PROJECT_NAME} PRIVATE TracyClient)
endif()
target_include_directories(${PROJECT_NAME} PRIVATE
${SLANG_ROOT}/include
${IMGUI_DIR}
${IMGUI_DIR}/backends
${CMAKE_SOURCE_DIR}/src
${CMAKE_SOURCE_DIR}/third-party
)
target_compile_definitions(${PROJECT_NAME} PRIVATE VK_NO_PROTOTYPES IMGUI_IMPL_VULKAN_USE_VOLK)
include(CheckIPOSupported)
check_ipo_supported(RESULT ipo_supported OUTPUT ipo_output)
if(ipo_supported)
message(STATUS "IPO/LTO is supported. Enabling it for Release builds.")
set_target_properties(${PROJECT_NAME} PROPERTIES
INTERPROCEDURAL_OPTIMIZATION_RELEASE TRUE
INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO TRUE
)
else()
message(STATUS "IPO/LTO is not supported: ${ipo_output}")
endif()
if(MSVC)
target_compile_options(${PROJECT_NAME} PRIVATE
$<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:
/O2
/Ot
/fp:fast
/arch:AVX2
/GL
>
)
set_property(TARGET ${PROJECT_NAME} PROPERTY
LINK_FLAGS_RELEASE "/LTCG"
)
set_property(TARGET ${PROJECT_NAME} PROPERTY
LINK_FLAGS_RELWITHDEBINFO "/LTCG"
)
else()
target_compile_options(${PROJECT_NAME} PRIVATE
$<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:
-O3
-march=native
-flto
>
)
endif()
add_compile_definitions(
FMT_USE_CONSTEXPR=0
FMT_ENFORCE_COMPILE_STRING=0
)
if(WIN32)
target_compile_definitions(${PROJECT_NAME} PRIVATE
_CRT_SECURE_NO_WARNINGS
)
endif()
if(WIN32 OR UNIX)
target_compile_definitions(${PROJECT_NAME} PRIVATE
RHI_BACKEND_VULKAN
)
elseif(APPLE)
target_compile_definitions(${PROJECT_NAME} PRIVATE
RHI_BACKEND_METAL
)
endif()