aboutsummaryrefslogtreecommitdiffstats
path: root/src/vulkan-loader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vulkan-loader.cpp')
-rw-r--r--src/vulkan-loader.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/vulkan-loader.cpp b/src/vulkan-loader.cpp
new file mode 100644
index 0000000..32aa49b
--- /dev/null
+++ b/src/vulkan-loader.cpp
@@ -0,0 +1,90 @@
+#include "vulkan-loader.hpp"
+
+#include <iostream>
+
+#if defined(WINDOWS)
+HMODULE vulkanLibrary = LoadLibrary("vulkan-1.dll");
+
+#define LoadProcAddress GetProcAddress
+
+#elif defined(__linux__)
+#include <dlfcn.h>
+
+void *vulkanLibrary = dlopen( "libvulkan.so.1", RTLD_NOW );
+
+#define LoadProcAddress dlsym
+#endif
+
+#define X(name) PFN_##name name;
+ VULKAN_EXPORTED_FUNCTIONS
+ VULKAN_APPLICATION_FUNCTIONS
+ VULKAN_INSTANCE_FUNCTIONS
+ PLATFORM_VULKAN_INSTANCE_FUNCTIONS
+ VULKAN_DEVICE_FUNCTIONS
+#undef X
+
+#define X(name) \
+void Load_##name() \
+{ \
+ name = reinterpret_cast<PFN_##name>(LoadProcAddress(vulkanLibrary, #name)); \
+ if (!name) { \
+ std::cout << "Cannot load vulkan function " << #name << std::endl; \
+ } \
+}
+VULKAN_EXPORTED_FUNCTIONS
+#undef X
+
+#define X(name) \
+void Load_##name() \
+{ \
+ name = reinterpret_cast<PFN_##name>(vkGetInstanceProcAddr(nullptr, #name)); \
+ if (!name) { \
+ std::cout << "Cannot load vulkan function " << #name << std::endl; \
+ } \
+}
+VULKAN_APPLICATION_FUNCTIONS
+#undef X
+
+#define X(name) \
+void Load_##name(VkInstance _instance) \
+{ \
+ name = reinterpret_cast<PFN_##name>(vkGetInstanceProcAddr(_instance, #name)); \
+ if (!name) { \
+ std::cout << "Cannot load vulkan function " << #name << std::endl; \
+ } \
+}
+VULKAN_INSTANCE_FUNCTIONS
+PLATFORM_VULKAN_INSTANCE_FUNCTIONS
+#undef X
+
+#define X(name) \
+void Load_##name(VkDevice _device) \
+{ \
+ name = reinterpret_cast<PFN_##name>(vkGetDeviceProcAddr(_device, #name)); \
+ if (!name) { \
+ std::cout << "Cannot load vulkan function " << #name << std::endl; \
+ } \
+}
+VULKAN_DEVICE_FUNCTIONS
+#undef X
+
+void load_vulkan()
+{
+#define X(name) Load_##name();
+ VULKAN_EXPORTED_FUNCTIONS
+ VULKAN_APPLICATION_FUNCTIONS
+#undef X
+};
+
+void load_instance_functions(VkInstance instance) {
+#define X(name) Load_##name(instance);
+ VULKAN_INSTANCE_FUNCTIONS
+ PLATFORM_VULKAN_INSTANCE_FUNCTIONS
+#undef X
+}
+
+void load_device_functions(VkDevice device) {
+#define X(name) void Load_##name(VkDevice _device);
+ VULKAN_DEVICE_FUNCTIONS
+#undef X
+}