Add volk for function loading (required on platforms such as Android)

This commit is contained in:
2025-11-26 00:10:58 +10:00
parent 952efa784b
commit cfcc0478dc
4 changed files with 33 additions and 1 deletions

View File

@@ -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}

View File

@@ -1,6 +1,8 @@
# Copyright (c) 2025, Jayden Grubb <contact@jaydengrubb.com>
# SPDX-License-Identifier: BSD-3-Clause
include(FetchContent)
set(NOVA_ENGINE_SRC
core/debug.cpp
graphics/context.cpp
@@ -31,8 +33,22 @@ 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})
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
DEFINE_SYMBOL NOVA_EXPORT_SYMBOLS

View File

@@ -4,6 +4,10 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
#if defined(NOVA_USE_VOLK)
#include <volk.h>
#endif
#include <vulkan/vulkan.h>
#include <format>
@@ -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;
}

View File

@@ -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;