diff --git a/include/vulkan/funcs.hpp b/include/vulkan/funcs.hpp new file mode 100644 index 0000000..9a2428a --- /dev/null +++ b/include/vulkan/funcs.hpp @@ -0,0 +1,26 @@ +#ifndef FUNCS_HPP +#define FUNCS_HPP + +#include + +namespace Vulkan::Funcs { + + /// + /// Initialize the global Vulkan function pointers. + /// + void initialize(); + + /// Call to the original vkCreateInstance function. + VkResult vkCreateInstanceOriginal( + const VkInstanceCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkInstance* pInstance + ); + /// Call to the original vkDestroyInstance function. + void vkDestroyInstanceOriginal( + VkInstance instance, + const VkAllocationCallbacks* pAllocator + ); +} + +#endif // FUNCS_HPP diff --git a/src/vulkan/funcs.cpp b/src/vulkan/funcs.cpp new file mode 100644 index 0000000..31edaf9 --- /dev/null +++ b/src/vulkan/funcs.cpp @@ -0,0 +1,44 @@ +#include "vulkan/funcs.hpp" +#include "loader/dl.hpp" +#include "log.hpp" + +using namespace Vulkan; + +namespace { + PFN_vkCreateInstance vkCreateInstance_ptr{}; + PFN_vkDestroyInstance vkDestroyInstance_ptr{}; +} + +void Funcs::initialize() { + if (vkCreateInstance_ptr || vkDestroyInstance_ptr) { + Log::warn("lsfg-vk(funcs): Global Vulkan functions already initialized, did you call it twice?"); + return; + } + + auto* handle = Loader::DL::odlopen("libvulkan.so.1", 0x2); + vkCreateInstance_ptr = reinterpret_cast( + Loader::DL::odlsym(handle, "vkCreateInstance")); + vkDestroyInstance_ptr = reinterpret_cast( + Loader::DL::odlsym(handle, "vkDestroyInstance")); + if (!vkCreateInstance_ptr || !vkDestroyInstance_ptr) { + Log::error("lsfg-vk(funcs): Failed to initialize Vulkan functions, missing symbols"); + exit(EXIT_FAILURE); + } + + Log::debug("lsfg-vk(funcs): Initialized global Vulkan functions with original pointers"); +} + +// original function calls + +VkResult Funcs::vkCreateInstanceOriginal( + const VkInstanceCreateInfo* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkInstance* pInstance) { + return vkCreateInstance_ptr(pCreateInfo, pAllocator, pInstance); +} + +void Funcs::vkDestroyInstanceOriginal( + VkInstance instance, + const VkAllocationCallbacks* pAllocator) { + vkDestroyInstance_ptr(instance, pAllocator); +}