234 lines
8.4 KiB
CMake
234 lines
8.4 KiB
CMake
cmake_minimum_required (VERSION 3.29)
|
|
|
|
project (VulkanTutorial)
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMake")
|
|
|
|
# Add option to enable/disable C++ 20 module
|
|
option(ENABLE_CPP20_MODULE "Enable C++ 20 module support for Vulkan" OFF)
|
|
|
|
# Enable C++ module dependency scanning only if C++ 20 module is enabled
|
|
if(ENABLE_CPP20_MODULE)
|
|
set(CMAKE_CXX_SCAN_FOR_MODULES ON)
|
|
endif()
|
|
|
|
find_package (glfw3 REQUIRED)
|
|
find_package (glm REQUIRED)
|
|
find_package (Vulkan 1.4.335 REQUIRED) # Require Vulkan SDK version 1.4.335 or higher
|
|
find_package (tinyobjloader REQUIRED)
|
|
find_package (tinygltf REQUIRED)
|
|
find_package (nlohmann_json REQUIRED)
|
|
find_library(KTX_LIBRARY NAMES ktx REQUIRED)
|
|
find_path(KTX_INCLUDE_DIR NAMES ktx.h REQUIRED)
|
|
|
|
message(STATUS "KTX library found at: ${KTX_LIBRARY}")
|
|
message(STATUS "KTX include dir: ${KTX_INCLUDE_DIR}")
|
|
|
|
add_library(KTX::ktx SHARED IMPORTED GLOBAL)
|
|
set_target_properties(KTX::ktx PROPERTIES
|
|
IMPORTED_LOCATION "${KTX_LIBRARY}"
|
|
INTERFACE_INCLUDE_DIRECTORIES "${KTX_INCLUDE_DIR}"
|
|
)
|
|
|
|
# set up Vulkan C++ module only if enabled
|
|
if(ENABLE_CPP20_MODULE)
|
|
add_library(VulkanCppModule)
|
|
add_library(Vulkan::cppm ALIAS VulkanCppModule)
|
|
|
|
target_compile_definitions(VulkanCppModule
|
|
PUBLIC VULKAN_HPP_DISPATCH_LOADER_DYNAMIC=1 VULKAN_HPP_NO_STRUCT_CONSTRUCTORS=1
|
|
)
|
|
target_include_directories(VulkanCppModule
|
|
PUBLIC
|
|
"${Vulkan_INCLUDE_DIR}"
|
|
)
|
|
target_link_libraries(VulkanCppModule
|
|
PUBLIC
|
|
Vulkan::Vulkan
|
|
)
|
|
|
|
set_target_properties(VulkanCppModule PROPERTIES CXX_STANDARD 20)
|
|
|
|
# Add MSVC-specific compiler options for proper C++ module support
|
|
if(MSVC)
|
|
target_compile_options(VulkanCppModule PRIVATE
|
|
/std:c++latest # Use latest C++ standard for better module support
|
|
/permissive- # Standards conformance mode
|
|
/Zc:__cplusplus # Enable correct __cplusplus macro
|
|
/EHsc # Enable C++ exception handling
|
|
/Zc:preprocessor # Use conforming preprocessor
|
|
/translateInclude # Automatically translate #include to import for standard library
|
|
)
|
|
endif()
|
|
|
|
target_sources(VulkanCppModule
|
|
PUBLIC
|
|
FILE_SET cxx_modules TYPE CXX_MODULES
|
|
BASE_DIRS
|
|
"${Vulkan_INCLUDE_DIR}"
|
|
FILES
|
|
"${Vulkan_INCLUDE_DIR}/vulkan/vulkan.cppm"
|
|
)
|
|
|
|
|
|
# Add the vulkan.cppm file directly as a source file
|
|
target_sources(VulkanCppModule
|
|
PRIVATE
|
|
"${Vulkan_INCLUDE_DIR}/vulkan/vulkan.cppm"
|
|
)
|
|
else()
|
|
# Create a dummy interface library when C++ 20 module is disabled
|
|
add_library(VulkanCppModule INTERFACE)
|
|
add_library(Vulkan::cppm ALIAS VulkanCppModule)
|
|
target_link_libraries(VulkanCppModule INTERFACE Vulkan::Vulkan)
|
|
target_compile_definitions(VulkanCppModule
|
|
INTERFACE VULKAN_HPP_DISPATCH_LOADER_DYNAMIC=1 VULKAN_HPP_NO_STRUCT_CONSTRUCTORS=1
|
|
)
|
|
endif()
|
|
|
|
find_package(stb REQUIRED)
|
|
set(STB_INCLUDEDIR ${stb_INCLUDE_DIRS})
|
|
|
|
add_executable (glslang::validator IMPORTED)
|
|
find_program (GLSLANG_VALIDATOR "glslangValidator" HINTS $ENV{VULKAN_SDK}/bin REQUIRED)
|
|
set_property (TARGET glslang::validator PROPERTY IMPORTED_LOCATION "${GLSLANG_VALIDATOR}")
|
|
find_program(SLANGC_EXECUTABLE slangc HINTS $ENV{VULKAN_SDK}/bin REQUIRED)
|
|
|
|
include(CheckIPOSupported)
|
|
check_ipo_supported(RESULT LTO_SUPPORTED OUTPUT LTO_ERROR)
|
|
|
|
if(LTO_SUPPORTED AND CMAKE_BUILD_TYPE STREQUAL "Release")
|
|
message(STATUS "LTO activated")
|
|
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
|
|
else()
|
|
message(WARNING "LTO not supported : ${LTO_ERROR}")
|
|
endif()
|
|
|
|
function (add_shaders_target TARGET)
|
|
cmake_parse_arguments ("SHADER" "" "CHAPTER_NAME" "SOURCES" ${ARGN})
|
|
set (SHADERS_DIR ${SHADER_CHAPTER_NAME}/shaders)
|
|
add_custom_command (
|
|
OUTPUT ${SHADERS_DIR}
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${SHADERS_DIR}
|
|
)
|
|
add_custom_command (
|
|
OUTPUT ${SHADERS_DIR}/frag.spv ${SHADERS_DIR}/vert.spv
|
|
COMMAND glslang::validator
|
|
ARGS --target-env vulkan1.0 ${SHADER_SOURCES} --quiet
|
|
WORKING_DIRECTORY ${SHADERS_DIR}
|
|
DEPENDS ${SHADERS_DIR} ${SHADER_SOURCES}
|
|
COMMENT "Compiling Shaders"
|
|
VERBATIM
|
|
)
|
|
add_custom_target (${TARGET} DEPENDS ${SHADERS_DIR}/frag.spv ${SHADERS_DIR}/vert.spv)
|
|
endfunction ()
|
|
|
|
function (add_slang_shader_target TARGET)
|
|
cmake_parse_arguments ("SHADER" "" "CHAPTER_NAME" "SOURCES" ${ARGN})
|
|
set (SHADERS_DIR ${SHADER_CHAPTER_NAME}/shaders)
|
|
#file(GLOB HAS_COMPUTE ${CHAPTER_SHADER}.comp)
|
|
set (ENTRY_POINTS -entry vertMain -entry fragMain)
|
|
if(HAS_COMPUTE)
|
|
list(APPEND ENTRY_POINTS -entry compMain)
|
|
endif()
|
|
add_custom_command (
|
|
OUTPUT ${SHADERS_DIR}
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${SHADERS_DIR}
|
|
)
|
|
add_custom_command (
|
|
OUTPUT ${SHADERS_DIR}/slang.spv
|
|
COMMAND ${SLANGC_EXECUTABLE} ${SHADER_SOURCES} -target spirv -profile spirv_1_4+spvRayQueryKHR -emit-spirv-directly -fvk-use-entrypoint-name ${ENTRY_POINTS} -o slang.spv
|
|
WORKING_DIRECTORY ${SHADERS_DIR}
|
|
DEPENDS ${SHADERS_DIR} ${SHADER_SOURCES}
|
|
COMMENT "Compiling Slang Shaders"
|
|
VERBATIM
|
|
)
|
|
add_custom_target (${TARGET} DEPENDS ${SHADERS_DIR}/slang.spv)
|
|
endfunction()
|
|
|
|
function (add_chapter CHAPTER_NAME)
|
|
cmake_parse_arguments (CHAPTER "" "SHADER" "LIBS;TEXTURES;MODELS" ${ARGN})
|
|
add_executable (${CHAPTER_NAME} src/${CHAPTER_NAME}.cpp)
|
|
set_target_properties (${CHAPTER_NAME} PROPERTIES
|
|
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CHAPTER_NAME})
|
|
set_target_properties (${CHAPTER_NAME} PROPERTIES CXX_STANDARD 20)
|
|
target_link_libraries (${CHAPTER_NAME} Vulkan::cppm glfw)
|
|
target_include_directories (${CHAPTER_NAME} PRIVATE ${STB_INCLUDEDIR})
|
|
|
|
# Add compile definition if C++ 20 module is enabled
|
|
if(ENABLE_CPP20_MODULE)
|
|
target_compile_definitions(${CHAPTER_NAME} PRIVATE USE_CPP20_MODULES=1)
|
|
endif()
|
|
|
|
# Define VULKAN_HPP_HANDLE_ERROR_OUT_OF_DATE_AS_SUCCESS to treat VK_ERROR_OUT_OF_DATE_KHR as a success code
|
|
target_compile_definitions(${CHAPTER_NAME} PRIVATE "VULKAN_HPP_HANDLE_ERROR_OUT_OF_DATE_AS_SUCCESS" )
|
|
|
|
if(WIN32)
|
|
if(${CMAKE_GENERATOR} MATCHES "Visual Studio.*")
|
|
set_target_properties(${CHAPTER_NAME} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/${CHAPTER_NAME}")
|
|
endif()
|
|
endif()
|
|
|
|
if (DEFINED CHAPTER_SHADER)
|
|
set (CHAPTER_SHADER_TARGET ${CHAPTER_NAME}_shader)
|
|
file (GLOB SHADER_SOURCES ${CHAPTER_SHADER}.frag ${CHAPTER_SHADER}.vert ${CHAPTER_SHADER}.comp)
|
|
if (SHADER_SOURCES)
|
|
add_shaders_target (${CHAPTER_SHADER_TARGET} CHAPTER_NAME ${CHAPTER_NAME} SOURCES ${SHADER_SOURCES})
|
|
add_dependencies (${CHAPTER_NAME} ${CHAPTER_SHADER_TARGET})
|
|
endif()
|
|
|
|
set (CHAPTER_SHADER_SLANG_TARGET ${CHAPTER_NAME}_slang_shader)
|
|
file (GLOB SHADER_SLANG_SOURCES ${CHAPTER_SHADER}.slang)
|
|
if(SHADER_SLANG_SOURCES)
|
|
add_slang_shader_target( ${CHAPTER_SHADER_SLANG_TARGET} CHAPTER_NAME ${CHAPTER_NAME} SOURCES ${SHADER_SLANG_SOURCES})
|
|
add_dependencies(${CHAPTER_NAME} ${CHAPTER_SHADER_SLANG_TARGET})
|
|
endif()
|
|
endif ()
|
|
if (DEFINED CHAPTER_LIBS)
|
|
target_link_libraries (${CHAPTER_NAME} ${CHAPTER_LIBS})
|
|
endif ()
|
|
if (DEFINED CHAPTER_MODELS)
|
|
set(RESOLVED_MODELS "")
|
|
foreach(MODEL_PATTERN ${CHAPTER_MODELS})
|
|
file(GLOB MATCHED_MODELS CONFIGURE_DEPENDS
|
|
"${CMAKE_SOURCE_DIR}/models/${MODEL_PATTERN}"
|
|
)
|
|
list(APPEND RESOLVED_MODELS ${MATCHED_MODELS})
|
|
endforeach()
|
|
|
|
if (RESOLVED_MODELS)
|
|
file(COPY ${RESOLVED_MODELS} DESTINATION ${CMAKE_BINARY_DIR}/${CHAPTER_NAME}/models)
|
|
endif()
|
|
endif ()
|
|
if (DEFINED CHAPTER_TEXTURES)
|
|
set(RESOLVED_TEXTURES "")
|
|
foreach(TEX_PATTERN ${CHAPTER_TEXTURES})
|
|
file(GLOB MATCHED_TEXTURES CONFIGURE_DEPENDS
|
|
"${CMAKE_SOURCE_DIR}/textures/${TEX_PATTERN}"
|
|
)
|
|
list(APPEND RESOLVED_TEXTURES ${MATCHED_TEXTURES})
|
|
endforeach()
|
|
|
|
if (RESOLVED_TEXTURES)
|
|
file(COPY ${RESOLVED_TEXTURES} DESTINATION ${CMAKE_BINARY_DIR}/${CHAPTER_NAME}/textures)
|
|
endif()
|
|
endif ()
|
|
endfunction ()
|
|
|
|
add_chapter (main
|
|
SHADER shaders/main
|
|
TEXTURES *
|
|
MODELS *
|
|
LIBS nlohmann_json::nlohmann_json KTX::ktx
|
|
)
|
|
|
|
#add_chapter (38_ray_tracing
|
|
# SHADER 38_ray_tracing
|
|
# MODELS plant_on_table.obj
|
|
# MODELS plant_on_table.mtl
|
|
# TEXTURES plant_on_table_textures/nettle_plant_diff_4k.png
|
|
# TEXTURES plant_on_table_textures/potted_plant_02_pot_diff_1k.png
|
|
# TEXTURES plant_on_table_textures/wooden_picnic_table_bottom_diff_1k.png
|
|
# TEXTURES plant_on_table_textures/wooden_picnic_table_top_diff_1k.png
|
|
# LIBS glm::glm tinyobjloader::tinyobjloader)
|