diff --git a/CMakeLists.txt b/CMakeLists.txt index f3cf7cc..8ae7986 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,6 +28,8 @@ set(NOVA_LIBRARY_INSTALL OFF CACHE BOOL "Enable library installation targets") set(NOVA_BACKEND_VULKAN ON CACHE BOOL "Enable Vulkan backend") # set(NOVA_BACKEND_WEBGPU ON CACHE BOOL "Enable WebGPU backend") +set(NOVA_USE_VOLK ON CACHE BOOL "Use volk for Vulkan function loading") + add_compile_definitions( NOVA_VERSION_MAJOR=${PROJECT_VERSION_MAJOR} NOVA_VERSION_MINOR=${PROJECT_VERSION_MINOR} diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index 832bb1c..283046e 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -1,6 +1,8 @@ # Copyright (c) 2025, Jayden Grubb # SPDX-License-Identifier: BSD-3-Clause +include(FetchContent) + set(NOVA_ENGINE_SRC core/debug.cpp graphics/context.cpp @@ -31,7 +33,21 @@ if (NOVA_BACKEND_VULKAN) target_sources(nova PRIVATE ${NOVA_VULKAN_SRC}) target_compile_definitions(nova PRIVATE NOVA_BACKEND_VULKAN) target_include_directories(nova PRIVATE ${Vulkan_INCLUDE_DIRS}) - target_link_libraries(nova PRIVATE Vulkan::Vulkan) + + if (NOVA_USE_VOLK) + FetchContent_Declare( + volk + GIT_REPOSITORY https://github.com/zeux/volk.git + GIT_TAG f30088b3f4160810b53e19258dd2f7395e5f0ba3 # 1.4.328.1 + ) + FetchContent_MakeAvailable(volk) + + target_compile_definitions(nova PRIVATE NOVA_USE_VOLK) + target_include_directories(nova PRIVATE ${volk_INCLUDE_DIRS}) + target_link_libraries(nova PRIVATE volk::volk) + else() + target_link_libraries(nova PRIVATE Vulkan::Vulkan) + endif() endif() set_target_properties(nova PROPERTIES diff --git a/engine/src/backends/vulkan/context.cpp b/engine/src/backends/vulkan/context.cpp index fc242ba..5ca4504 100644 --- a/engine/src/backends/vulkan/context.cpp +++ b/engine/src/backends/vulkan/context.cpp @@ -4,6 +4,10 @@ * SPDX-License-Identifier: BSD-3-Clause */ +#if defined(NOVA_USE_VOLK) + #include +#endif + #include #include @@ -13,6 +17,14 @@ namespace nova::gfx { +VulkanContext::VulkanContext() { +#if defined(NOVA_USE_VOLK) + if (volkInitialize() != VK_SUCCESS) { + throw std::runtime_error("Failed to initialize volk"); + } +#endif +} + API VulkanContext::get_api() const { return API::VULKAN; } diff --git a/engine/src/backends/vulkan/context.hpp b/engine/src/backends/vulkan/context.hpp index cbd095a..53cb814 100644 --- a/engine/src/backends/vulkan/context.hpp +++ b/engine/src/backends/vulkan/context.hpp @@ -14,6 +14,8 @@ namespace nova::gfx { class VulkanContext final : public IContext { public: + VulkanContext(); + API get_api() const override; std::string get_api_name() const override;