CMakeLists.txt

cross platform rendering playground

CMakeLists.txt

7.26 KB
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()