diff --git a/myphoneinfo/andinfo/src/main/AndroidManifest.xml b/myphoneinfo/andinfo/src/main/AndroidManifest.xml
index 09f32ab..c067acc 100644
--- a/myphoneinfo/andinfo/src/main/AndroidManifest.xml
+++ b/myphoneinfo/andinfo/src/main/AndroidManifest.xml
@@ -1,5 +1,10 @@
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/myphoneinfo/andinfo/src/main/cpp/CMakeLists.txt b/myphoneinfo/andinfo/src/main/cpp/CMakeLists.txt
index e471048..84ecba4 100644
--- a/myphoneinfo/andinfo/src/main/cpp/CMakeLists.txt
+++ b/myphoneinfo/andinfo/src/main/cpp/CMakeLists.txt
@@ -13,6 +13,7 @@ add_library(andinfo SHARED
egl/EglContext.cpp
egl/EglSession.cpp
vulkan/VkSession.cpp
+ vulkan/vkloader.cpp
vulkan_wrapper/vulkan_wrapper.cpp)
target_link_libraries(andinfo
diff --git a/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.cpp b/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.cpp
index 57df7e1..2dc7528 100644
--- a/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.cpp
+++ b/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.cpp
@@ -11,13 +11,20 @@
VkSession::VkSession(const VkInstanceCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator) {
- if (!IsVulkanSupported()) {
- throw std::runtime_error("Vulkan not supported");
- }
-
- if (vkCreateInstance(pCreateInfo, pAllocator, &mInstance) != VK_SUCCESS) {
+// if (!IsVulkanSupported()) {
+// throw std::runtime_error("Vulkan not supported");
+// }
+ mLoader = new VulkanLoader();
+ mLoader->openLib();
+ mLoader->loadGlobalFuncs();
+ if (!mLoader->createInstance(pCreateInfo, pAllocator)) {
throw std::runtime_error("Failed to create Vulkan instance");
}
+ mInstance = mLoader->instance;
+
+// if (vkCreateInstance(pCreateInfo, pAllocator, &mInstance) != VK_SUCCESS) {
+// throw std::runtime_error("Failed to create Vulkan instance");
+// }
}
VkSession::~VkSession() {
diff --git a/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.cpp.bak b/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.cpp.bak
new file mode 100644
index 0000000..a7c368e
--- /dev/null
+++ b/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.cpp.bak
@@ -0,0 +1,71 @@
+/*
+ * SPDX-FileCopyrightText: Sebastiano Barezzi
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#define LOG_TAG "VkSession"
+
+#include
+#include "VkSession.h"
+#include "../logging.h"
+
+VkSession::VkSession(const VkInstanceCreateInfo *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator) {
+// if (!IsVulkanSupported()) {
+// throw std::runtime_error("Vulkan not supported");
+// }
+ mLoader=new VulkanLoader();
+ if(!mLoader->createInstance(pCreateInfo,pAllocator)){
+ throw std::runtime_error("Failed to create Vulkan instance");
+ }
+ mInstance=mLoader->instance;
+
+// if (vkCreateInstance(pCreateInfo, pAllocator, &mInstance) != VK_SUCCESS) {
+// throw std::runtime_error("Failed to create Vulkan instance");
+// }
+}
+
+VkSession::~VkSession() {
+ vkDestroyInstance(mInstance, nullptr);
+}
+
+std::vector VkSession::vkEnumeratePhysicalDevices() {
+ VkResult result;
+
+ uint32_t deviceCount = 0;
+ result = ::vkEnumeratePhysicalDevices(mInstance, &deviceCount, nullptr);
+ if (result != VK_SUCCESS) {
+ LOGE("Failed to enumerate Vulkan devices: %d", result);
+ return {};
+ }
+
+ if (deviceCount <= 0) {
+ LOGI("No Vulkan device found");
+ return {};
+ }
+
+ std::vector devices(deviceCount);
+ result = ::vkEnumeratePhysicalDevices(mInstance, &deviceCount, devices.data());
+ if (result != VK_SUCCESS) {
+ LOGE("Failed to enumerate Vulkan devices: %d", result);
+ return {};
+ }
+
+ return devices;
+}
+
+VkPhysicalDeviceProperties VkSession::vkGetPhysicalDeviceProperties(VkPhysicalDevice device) {
+ VkPhysicalDeviceProperties properties;
+ ::vkGetPhysicalDeviceProperties(device, &properties);
+ return properties;
+}
+
+std::unique_ptr VkSession::create(const VkInstanceCreateInfo *pCreateInfo,
+ const VkAllocationCallbacks *pAllocator) {
+ try {
+ return std::unique_ptr(new VkSession(pCreateInfo, pAllocator));
+ } catch (std::runtime_error &error) {
+ LOGE("Failed to create Vulkan session: %s", error.what());
+ return nullptr;
+ }
+}
diff --git a/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.h b/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.h
index 99d4f29..d963025 100644
--- a/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.h
+++ b/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.h
@@ -7,7 +7,7 @@
#include
#include
-#include "../vulkan_wrapper/vulkan_wrapper.h"
+#include "./vkloader.h"
class VkSession {
public:
@@ -28,4 +28,5 @@ private:
VkSession(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator);
VkInstance mInstance = nullptr;
+ VulkanLoader* mLoader= nullptr;
};
diff --git a/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.h.bak b/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.h.bak
new file mode 100644
index 0000000..d963025
--- /dev/null
+++ b/myphoneinfo/andinfo/src/main/cpp/vulkan/VkSession.h.bak
@@ -0,0 +1,32 @@
+/*
+ * SPDX-FileCopyrightText: Sebastiano Barezzi
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#pragma once
+
+#include
+#include
+#include "./vkloader.h"
+
+class VkSession {
+public:
+ VkSession(const VkSession &) = delete;
+
+ ~VkSession();
+
+ VkSession &operator=(const VkSession &) = delete;
+
+ std::vector vkEnumeratePhysicalDevices();
+
+ static std::unique_ptr
+ create(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator);
+
+ VkPhysicalDeviceProperties vkGetPhysicalDeviceProperties(VkPhysicalDevice device);
+
+private:
+ VkSession(const VkInstanceCreateInfo *pCreateInfo, const VkAllocationCallbacks *pAllocator);
+
+ VkInstance mInstance = nullptr;
+ VulkanLoader* mLoader= nullptr;
+};
diff --git a/myphoneinfo/andinfo/src/main/cpp/vulkan/vkloader.cpp b/myphoneinfo/andinfo/src/main/cpp/vulkan/vkloader.cpp
new file mode 100644
index 0000000..22d44db
--- /dev/null
+++ b/myphoneinfo/andinfo/src/main/cpp/vulkan/vkloader.cpp
@@ -0,0 +1,122 @@
+//
+// Created by lhyqy5 on 2025/12/9.
+//
+
+#include "vkloader.h"
+// vulkan_loader.cpp
+
+
+#include
+#include
+#include
+#include
+
+#define LOG(...) do { std::fprintf(stderr, __VA_ARGS__); std::fprintf(stderr, "\n"); } while(0)
+
+VulkanLoader::VulkanLoader() {}
+
+VulkanLoader::~VulkanLoader() {
+ if (instance != VK_NULL_HANDLE) {
+ auto vkDestroyInstance = reinterpret_cast(
+ vkGetInstanceProcAddr(instance, "vkDestroyInstance"));
+
+ if (vkDestroyInstance) {
+ vkDestroyInstance(instance, nullptr);
+ }
+ instance = VK_NULL_HANDLE;
+ }
+
+ if (lib) {
+ dlclose(lib);
+ lib = nullptr;
+ }
+}
+
+bool VulkanLoader::openLib(const char* path) {
+ lib = dlopen(path, RTLD_NOW | RTLD_LOCAL);
+ if (!lib) {
+ LOG("dlopen(%s) failed: %s", path, dlerror());
+ return false;
+ }
+
+ void* sym = dlsym(lib, "vkGetInstanceProcAddr");
+ if (!sym) {
+ LOG("dlsym(vkGetInstanceProcAddr) returned NULL");
+ dlclose(lib);
+ lib = nullptr;
+ return false;
+ }
+
+ vkGetInstanceProcAddr = reinterpret_cast(sym);
+ LOG("vkGetInstanceProcAddr = %p", sym);
+
+ return true;
+}
+
+bool VulkanLoader::loadGlobalFuncs() {
+ if (!vkGetInstanceProcAddr) return false;
+
+ vkCreateInstance = reinterpret_cast(
+ vkGetInstanceProcAddr(nullptr, "vkCreateInstance"));
+
+ vkEnumerateInstanceExtensionProperties =
+ reinterpret_cast(
+ vkGetInstanceProcAddr(nullptr, "vkEnumerateInstanceExtensionProperties"));
+
+ LOG("vkCreateInstance = %p", reinterpret_cast(vkCreateInstance));
+ LOG("vkEnumerateInstanceExtensionProperties = %p",
+ reinterpret_cast(vkEnumerateInstanceExtensionProperties));
+
+ return vkCreateInstance != nullptr;
+}
+
+bool VulkanLoader::createInstance(const VkInstanceCreateInfo* createInfo,
+ const VkAllocationCallbacks *pAllocator) {
+ if (!vkCreateInstance) return false;
+
+// VkInstanceCreateInfo ci{};
+// ci.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
+// ci.pApplicationInfo = &appInfo;
+// ci.enabledExtensionCount = (uint32_t)instanceExtensions.size();
+// ci.ppEnabledExtensionNames = instanceExtensions.empty() ? nullptr : instanceExtensions.data();
+
+ VkResult r = vkCreateInstance(createInfo, pAllocator, &instance);
+
+ if (r != VK_SUCCESS) {
+ LOG("vkCreateInstance failed: %d", r);
+ return false;
+ }
+
+ LOG("vkCreateInstance ok, instance=%p", (void*)instance);
+ return true;
+}
+
+void* VulkanLoader::_getInstanceProc(const char* name) {
+ if (!vkGetInstanceProcAddr || instance == VK_NULL_HANDLE)
+ return nullptr;
+
+ void* fn = reinterpret_cast(vkGetInstanceProcAddr(instance, name));
+ LOG("instance-level %s = %p", name, fn);
+ return fn;
+}
+
+void* VulkanLoader::_getDeviceProc(VkDevice device, const char* name) {
+ if (!vkGetInstanceProcAddr)
+ return nullptr;
+
+ // get vkGetDeviceProcAddr first
+ auto vkGetDeviceProcAddr =
+ reinterpret_cast(
+ vkGetInstanceProcAddr(instance, "vkGetDeviceProcAddr"));
+
+ if (vkGetDeviceProcAddr) {
+ void* fn = reinterpret_cast(vkGetDeviceProcAddr(device, name));
+ LOG("device-level %s = %p", name, fn);
+ return fn;
+ }
+
+ // fallback (rare) – some drivers expose device functions at instance level
+ void* fn = reinterpret_cast(vkGetInstanceProcAddr(instance, name));
+ LOG("fallback device-level %s = %p", name, fn);
+ return fn;
+}
diff --git a/myphoneinfo/andinfo/src/main/cpp/vulkan/vkloader.h b/myphoneinfo/andinfo/src/main/cpp/vulkan/vkloader.h
new file mode 100644
index 0000000..6b5002f
--- /dev/null
+++ b/myphoneinfo/andinfo/src/main/cpp/vulkan/vkloader.h
@@ -0,0 +1,55 @@
+//
+// Created by lhyqy5 on 2025/12/9.
+//
+// vulkan_loader.h
+#pragma once
+
+#include
+#include
+
+class VulkanLoader {
+public:
+ VulkanLoader();
+ ~VulkanLoader();
+
+ // open libvulkan.so, load vkGetInstanceProcAddr
+ bool openLib(const char* path = "libvulkan.so");
+
+ // load global functions such as vkCreateInstance
+ bool loadGlobalFuncs();
+
+ // create instance
+ bool createInstance(const VkInstanceCreateInfo* createInfo,
+ const VkAllocationCallbacks *pAllocator);
+
+ // load instance-level function
+ template
+ T getInstanceProc(const char* name) {
+ return reinterpret_cast(_getInstanceProc(name));
+ }
+
+ // load device-level function
+ template
+ T getDeviceProc(VkDevice device, const char* name) {
+ return reinterpret_cast(_getDeviceProc(device, name));
+ }
+
+ VkInstance instance = VK_NULL_HANDLE;
+
+private:
+ void* lib = nullptr;
+
+ PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = nullptr;
+
+ // global-level functions
+ PFN_vkCreateInstance vkCreateInstance = nullptr;
+ PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties = nullptr;
+
+ // internal helpers
+ void* _getInstanceProc(const char* name);
+ void* _getDeviceProc(VkDevice device, const char* name);
+
+ // disable copy
+ VulkanLoader(const VulkanLoader&) = delete;
+ VulkanLoader& operator=(const VulkanLoader&) = delete;
+};
diff --git a/myphoneinfo/andinfo/src/main/cpp/vulkan_wrapper/vulkan_wrapper.cpp b/myphoneinfo/andinfo/src/main/cpp/vulkan_wrapper/vulkan_wrapper.cpp
index eb34b37..649d005 100644
--- a/myphoneinfo/andinfo/src/main/cpp/vulkan_wrapper/vulkan_wrapper.cpp
+++ b/myphoneinfo/andinfo/src/main/cpp/vulkan_wrapper/vulkan_wrapper.cpp
@@ -17,195 +17,207 @@ static VulkanWrapperStatus InitVulkan() {
return UNSUPPORTED;
}
+ auto vkGetInstanceProcAddr =
+ reinterpret_cast(
+ dlsym(libvulkan, "vkGetInstanceProcAddr"));
+
+ auto vkCreateInstance =
+ reinterpret_cast(
+ vkGetInstanceProcAddr(nullptr, "vkCreateInstance"));
+
+
+// vkGetInstanceProcAddr = reinterpret_cast(dlsym(libvulkan, "vkGetInstanceProcAddr"));
+// vkGetDeviceProcAddr = reinterpret_cast(dlsym(libvulkan, "vkGetDeviceProcAddr"));
+
+ auto x=vkGetInstanceProcAddr(nullptr, "vkDestroyInstance");
// Vulkan supported, set function addresses
- vkCreateInstance = reinterpret_cast(dlsym(libvulkan, "vkCreateInstance"));
- vkDestroyInstance = reinterpret_cast(dlsym(libvulkan, "vkDestroyInstance"));
- vkEnumeratePhysicalDevices = reinterpret_cast(dlsym(libvulkan, "vkEnumeratePhysicalDevices"));
- vkGetPhysicalDeviceFeatures = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceFeatures"));
- vkGetPhysicalDeviceFormatProperties = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceFormatProperties"));
- vkGetPhysicalDeviceImageFormatProperties = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceImageFormatProperties"));
- vkGetPhysicalDeviceProperties = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceProperties"));
- vkGetPhysicalDeviceQueueFamilyProperties = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceQueueFamilyProperties"));
- vkGetPhysicalDeviceMemoryProperties = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceMemoryProperties"));
- vkGetInstanceProcAddr = reinterpret_cast(dlsym(libvulkan, "vkGetInstanceProcAddr"));
- vkGetDeviceProcAddr = reinterpret_cast(dlsym(libvulkan, "vkGetDeviceProcAddr"));
- vkCreateDevice = reinterpret_cast(dlsym(libvulkan, "vkCreateDevice"));
- vkDestroyDevice = reinterpret_cast(dlsym(libvulkan, "vkDestroyDevice"));
- vkEnumerateInstanceExtensionProperties = reinterpret_cast(dlsym(libvulkan, "vkEnumerateInstanceExtensionProperties"));
- vkEnumerateDeviceExtensionProperties = reinterpret_cast(dlsym(libvulkan, "vkEnumerateDeviceExtensionProperties"));
- vkEnumerateInstanceLayerProperties = reinterpret_cast(dlsym(libvulkan, "vkEnumerateInstanceLayerProperties"));
- vkEnumerateDeviceLayerProperties = reinterpret_cast(dlsym(libvulkan, "vkEnumerateDeviceLayerProperties"));
- vkGetDeviceQueue = reinterpret_cast(dlsym(libvulkan, "vkGetDeviceQueue"));
- vkQueueSubmit = reinterpret_cast(dlsym(libvulkan, "vkQueueSubmit"));
- vkQueueWaitIdle = reinterpret_cast(dlsym(libvulkan, "vkQueueWaitIdle"));
- vkDeviceWaitIdle = reinterpret_cast(dlsym(libvulkan, "vkDeviceWaitIdle"));
- vkAllocateMemory = reinterpret_cast(dlsym(libvulkan, "vkAllocateMemory"));
- vkFreeMemory = reinterpret_cast(dlsym(libvulkan, "vkFreeMemory"));
- vkMapMemory = reinterpret_cast(dlsym(libvulkan, "vkMapMemory"));
- vkUnmapMemory = reinterpret_cast(dlsym(libvulkan, "vkUnmapMemory"));
- vkFlushMappedMemoryRanges = reinterpret_cast(dlsym(libvulkan, "vkFlushMappedMemoryRanges"));
- vkInvalidateMappedMemoryRanges = reinterpret_cast(dlsym(libvulkan, "vkInvalidateMappedMemoryRanges"));
- vkGetDeviceMemoryCommitment = reinterpret_cast(dlsym(libvulkan, "vkGetDeviceMemoryCommitment"));
- vkBindBufferMemory = reinterpret_cast(dlsym(libvulkan, "vkBindBufferMemory"));
- vkBindImageMemory = reinterpret_cast(dlsym(libvulkan, "vkBindImageMemory"));
- vkGetBufferMemoryRequirements = reinterpret_cast(dlsym(libvulkan, "vkGetBufferMemoryRequirements"));
- vkGetImageMemoryRequirements = reinterpret_cast(dlsym(libvulkan, "vkGetImageMemoryRequirements"));
- vkGetImageSparseMemoryRequirements = reinterpret_cast(dlsym(libvulkan, "vkGetImageSparseMemoryRequirements"));
- vkGetPhysicalDeviceSparseImageFormatProperties = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceSparseImageFormatProperties"));
- vkQueueBindSparse = reinterpret_cast(dlsym(libvulkan, "vkQueueBindSparse"));
- vkCreateFence = reinterpret_cast(dlsym(libvulkan, "vkCreateFence"));
- vkDestroyFence = reinterpret_cast(dlsym(libvulkan, "vkDestroyFence"));
- vkResetFences = reinterpret_cast(dlsym(libvulkan, "vkResetFences"));
- vkGetFenceStatus = reinterpret_cast(dlsym(libvulkan, "vkGetFenceStatus"));
- vkWaitForFences = reinterpret_cast(dlsym(libvulkan, "vkWaitForFences"));
- vkCreateSemaphore = reinterpret_cast(dlsym(libvulkan, "vkCreateSemaphore"));
- vkDestroySemaphore = reinterpret_cast(dlsym(libvulkan, "vkDestroySemaphore"));
- vkCreateEvent = reinterpret_cast(dlsym(libvulkan, "vkCreateEvent"));
- vkDestroyEvent = reinterpret_cast(dlsym(libvulkan, "vkDestroyEvent"));
- vkGetEventStatus = reinterpret_cast(dlsym(libvulkan, "vkGetEventStatus"));
- vkSetEvent = reinterpret_cast(dlsym(libvulkan, "vkSetEvent"));
- vkResetEvent = reinterpret_cast(dlsym(libvulkan, "vkResetEvent"));
- vkCreateQueryPool = reinterpret_cast(dlsym(libvulkan, "vkCreateQueryPool"));
- vkDestroyQueryPool = reinterpret_cast(dlsym(libvulkan, "vkDestroyQueryPool"));
- vkGetQueryPoolResults = reinterpret_cast(dlsym(libvulkan, "vkGetQueryPoolResults"));
- vkCreateBuffer = reinterpret_cast(dlsym(libvulkan, "vkCreateBuffer"));
- vkDestroyBuffer = reinterpret_cast(dlsym(libvulkan, "vkDestroyBuffer"));
- vkCreateBufferView = reinterpret_cast(dlsym(libvulkan, "vkCreateBufferView"));
- vkDestroyBufferView = reinterpret_cast(dlsym(libvulkan, "vkDestroyBufferView"));
- vkCreateImage = reinterpret_cast(dlsym(libvulkan, "vkCreateImage"));
- vkDestroyImage = reinterpret_cast(dlsym(libvulkan, "vkDestroyImage"));
- vkGetImageSubresourceLayout = reinterpret_cast(dlsym(libvulkan, "vkGetImageSubresourceLayout"));
- vkCreateImageView = reinterpret_cast(dlsym(libvulkan, "vkCreateImageView"));
- vkDestroyImageView = reinterpret_cast(dlsym(libvulkan, "vkDestroyImageView"));
- vkCreateShaderModule = reinterpret_cast(dlsym(libvulkan, "vkCreateShaderModule"));
- vkDestroyShaderModule = reinterpret_cast(dlsym(libvulkan, "vkDestroyShaderModule"));
- vkCreatePipelineCache = reinterpret_cast(dlsym(libvulkan, "vkCreatePipelineCache"));
- vkDestroyPipelineCache = reinterpret_cast(dlsym(libvulkan, "vkDestroyPipelineCache"));
- vkGetPipelineCacheData = reinterpret_cast(dlsym(libvulkan, "vkGetPipelineCacheData"));
- vkMergePipelineCaches = reinterpret_cast(dlsym(libvulkan, "vkMergePipelineCaches"));
- vkCreateGraphicsPipelines = reinterpret_cast(dlsym(libvulkan, "vkCreateGraphicsPipelines"));
- vkCreateComputePipelines = reinterpret_cast(dlsym(libvulkan, "vkCreateComputePipelines"));
- vkDestroyPipeline = reinterpret_cast(dlsym(libvulkan, "vkDestroyPipeline"));
- vkCreatePipelineLayout = reinterpret_cast(dlsym(libvulkan, "vkCreatePipelineLayout"));
- vkDestroyPipelineLayout = reinterpret_cast(dlsym(libvulkan, "vkDestroyPipelineLayout"));
- vkCreateSampler = reinterpret_cast(dlsym(libvulkan, "vkCreateSampler"));
- vkDestroySampler = reinterpret_cast(dlsym(libvulkan, "vkDestroySampler"));
- vkCreateDescriptorSetLayout = reinterpret_cast(dlsym(libvulkan, "vkCreateDescriptorSetLayout"));
- vkDestroyDescriptorSetLayout = reinterpret_cast(dlsym(libvulkan, "vkDestroyDescriptorSetLayout"));
- vkCreateDescriptorPool = reinterpret_cast(dlsym(libvulkan, "vkCreateDescriptorPool"));
- vkDestroyDescriptorPool = reinterpret_cast(dlsym(libvulkan, "vkDestroyDescriptorPool"));
- vkResetDescriptorPool = reinterpret_cast(dlsym(libvulkan, "vkResetDescriptorPool"));
- vkAllocateDescriptorSets = reinterpret_cast(dlsym(libvulkan, "vkAllocateDescriptorSets"));
- vkFreeDescriptorSets = reinterpret_cast(dlsym(libvulkan, "vkFreeDescriptorSets"));
- vkUpdateDescriptorSets = reinterpret_cast(dlsym(libvulkan, "vkUpdateDescriptorSets"));
- vkCreateFramebuffer = reinterpret_cast(dlsym(libvulkan, "vkCreateFramebuffer"));
- vkDestroyFramebuffer = reinterpret_cast(dlsym(libvulkan, "vkDestroyFramebuffer"));
- vkCreateRenderPass = reinterpret_cast(dlsym(libvulkan, "vkCreateRenderPass"));
- vkDestroyRenderPass = reinterpret_cast(dlsym(libvulkan, "vkDestroyRenderPass"));
- vkGetRenderAreaGranularity = reinterpret_cast(dlsym(libvulkan, "vkGetRenderAreaGranularity"));
- vkCreateCommandPool = reinterpret_cast(dlsym(libvulkan, "vkCreateCommandPool"));
- vkDestroyCommandPool = reinterpret_cast(dlsym(libvulkan, "vkDestroyCommandPool"));
- vkResetCommandPool = reinterpret_cast(dlsym(libvulkan, "vkResetCommandPool"));
- vkAllocateCommandBuffers = reinterpret_cast(dlsym(libvulkan, "vkAllocateCommandBuffers"));
- vkFreeCommandBuffers = reinterpret_cast(dlsym(libvulkan, "vkFreeCommandBuffers"));
- vkBeginCommandBuffer = reinterpret_cast(dlsym(libvulkan, "vkBeginCommandBuffer"));
- vkEndCommandBuffer = reinterpret_cast(dlsym(libvulkan, "vkEndCommandBuffer"));
- vkResetCommandBuffer = reinterpret_cast(dlsym(libvulkan, "vkResetCommandBuffer"));
- vkCmdBindPipeline = reinterpret_cast(dlsym(libvulkan, "vkCmdBindPipeline"));
- vkCmdSetViewport = reinterpret_cast(dlsym(libvulkan, "vkCmdSetViewport"));
- vkCmdSetScissor = reinterpret_cast(dlsym(libvulkan, "vkCmdSetScissor"));
- vkCmdSetLineWidth = reinterpret_cast(dlsym(libvulkan, "vkCmdSetLineWidth"));
- vkCmdSetDepthBias = reinterpret_cast(dlsym(libvulkan, "vkCmdSetDepthBias"));
- vkCmdSetBlendConstants = reinterpret_cast(dlsym(libvulkan, "vkCmdSetBlendConstants"));
- vkCmdSetDepthBounds = reinterpret_cast(dlsym(libvulkan, "vkCmdSetDepthBounds"));
- vkCmdSetStencilCompareMask = reinterpret_cast(dlsym(libvulkan, "vkCmdSetStencilCompareMask"));
- vkCmdSetStencilWriteMask = reinterpret_cast(dlsym(libvulkan, "vkCmdSetStencilWriteMask"));
- vkCmdSetStencilReference = reinterpret_cast(dlsym(libvulkan, "vkCmdSetStencilReference"));
- vkCmdBindDescriptorSets = reinterpret_cast(dlsym(libvulkan, "vkCmdBindDescriptorSets"));
- vkCmdBindIndexBuffer = reinterpret_cast(dlsym(libvulkan, "vkCmdBindIndexBuffer"));
- vkCmdBindVertexBuffers = reinterpret_cast(dlsym(libvulkan, "vkCmdBindVertexBuffers"));
- vkCmdDraw = reinterpret_cast(dlsym(libvulkan, "vkCmdDraw"));
- vkCmdDrawIndexed = reinterpret_cast(dlsym(libvulkan, "vkCmdDrawIndexed"));
- vkCmdDrawIndirect = reinterpret_cast(dlsym(libvulkan, "vkCmdDrawIndirect"));
- vkCmdDrawIndexedIndirect = reinterpret_cast(dlsym(libvulkan, "vkCmdDrawIndexedIndirect"));
- vkCmdDispatch = reinterpret_cast(dlsym(libvulkan, "vkCmdDispatch"));
- vkCmdDispatchIndirect = reinterpret_cast(dlsym(libvulkan, "vkCmdDispatchIndirect"));
- vkCmdCopyBuffer = reinterpret_cast(dlsym(libvulkan, "vkCmdCopyBuffer"));
- vkCmdCopyImage = reinterpret_cast(dlsym(libvulkan, "vkCmdCopyImage"));
- vkCmdBlitImage = reinterpret_cast(dlsym(libvulkan, "vkCmdBlitImage"));
- vkCmdCopyBufferToImage = reinterpret_cast(dlsym(libvulkan, "vkCmdCopyBufferToImage"));
- vkCmdCopyImageToBuffer = reinterpret_cast(dlsym(libvulkan, "vkCmdCopyImageToBuffer"));
- vkCmdUpdateBuffer = reinterpret_cast(dlsym(libvulkan, "vkCmdUpdateBuffer"));
- vkCmdFillBuffer = reinterpret_cast(dlsym(libvulkan, "vkCmdFillBuffer"));
- vkCmdClearColorImage = reinterpret_cast(dlsym(libvulkan, "vkCmdClearColorImage"));
- vkCmdClearDepthStencilImage = reinterpret_cast(dlsym(libvulkan, "vkCmdClearDepthStencilImage"));
- vkCmdClearAttachments = reinterpret_cast(dlsym(libvulkan, "vkCmdClearAttachments"));
- vkCmdResolveImage = reinterpret_cast(dlsym(libvulkan, "vkCmdResolveImage"));
- vkCmdSetEvent = reinterpret_cast(dlsym(libvulkan, "vkCmdSetEvent"));
- vkCmdResetEvent = reinterpret_cast(dlsym(libvulkan, "vkCmdResetEvent"));
- vkCmdWaitEvents = reinterpret_cast(dlsym(libvulkan, "vkCmdWaitEvents"));
- vkCmdPipelineBarrier = reinterpret_cast(dlsym(libvulkan, "vkCmdPipelineBarrier"));
- vkCmdBeginQuery = reinterpret_cast(dlsym(libvulkan, "vkCmdBeginQuery"));
- vkCmdEndQuery = reinterpret_cast(dlsym(libvulkan, "vkCmdEndQuery"));
- vkCmdResetQueryPool = reinterpret_cast(dlsym(libvulkan, "vkCmdResetQueryPool"));
- vkCmdWriteTimestamp = reinterpret_cast(dlsym(libvulkan, "vkCmdWriteTimestamp"));
- vkCmdCopyQueryPoolResults = reinterpret_cast(dlsym(libvulkan, "vkCmdCopyQueryPoolResults"));
- vkCmdPushConstants = reinterpret_cast(dlsym(libvulkan, "vkCmdPushConstants"));
- vkCmdBeginRenderPass = reinterpret_cast(dlsym(libvulkan, "vkCmdBeginRenderPass"));
- vkCmdNextSubpass = reinterpret_cast(dlsym(libvulkan, "vkCmdNextSubpass"));
- vkCmdEndRenderPass = reinterpret_cast(dlsym(libvulkan, "vkCmdEndRenderPass"));
- vkCmdExecuteCommands = reinterpret_cast(dlsym(libvulkan, "vkCmdExecuteCommands"));
- vkDestroySurfaceKHR = reinterpret_cast(dlsym(libvulkan, "vkDestroySurfaceKHR"));
- vkGetPhysicalDeviceSurfaceSupportKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceSurfaceSupportKHR"));
- vkGetPhysicalDeviceSurfaceCapabilitiesKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"));
- vkGetPhysicalDeviceSurfaceFormatsKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceSurfaceFormatsKHR"));
- vkGetPhysicalDeviceSurfacePresentModesKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceSurfacePresentModesKHR"));
- vkCreateSwapchainKHR = reinterpret_cast(dlsym(libvulkan, "vkCreateSwapchainKHR"));
- vkDestroySwapchainKHR = reinterpret_cast(dlsym(libvulkan, "vkDestroySwapchainKHR"));
- vkGetSwapchainImagesKHR = reinterpret_cast(dlsym(libvulkan, "vkGetSwapchainImagesKHR"));
- vkAcquireNextImageKHR = reinterpret_cast(dlsym(libvulkan, "vkAcquireNextImageKHR"));
- vkQueuePresentKHR = reinterpret_cast(dlsym(libvulkan, "vkQueuePresentKHR"));
- // vkGetPhysicalDeviceDisplayPropertiesKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceDisplayPropertiesKHR"));
- // vkGetPhysicalDeviceDisplayPlanePropertiesKHR = reinterpret_cast(dlsym(libvulkan, "vkGetPhysicalDeviceDisplayPlanePropertiesKHR"));
- // vkGetDisplayPlaneSupportedDisplaysKHR = reinterpret_cast(dlsym(libvulkan, "vkGetDisplayPlaneSupportedDisplaysKHR"));
- // vkGetDisplayModePropertiesKHR = reinterpret_cast(dlsym(libvulkan, "vkGetDisplayModePropertiesKHR"));
- // vkCreateDisplayModeKHR = reinterpret_cast(dlsym(libvulkan, "vkCreateDisplayModeKHR"));
- // vkGetDisplayPlaneCapabilitiesKHR = reinterpret_cast(dlsym(libvulkan, "vkGetDisplayPlaneCapabilitiesKHR"));
- // vkCreateDisplayPlaneSurfaceKHR = reinterpret_cast(dlsym(libvulkan, "vkCreateDisplayPlaneSurfaceKHR"));
- // vkCreateSharedSwapchainsKHR = reinterpret_cast(dlsym(libvulkan, "vkCreateSharedSwapchainsKHR"));
+// vkCreateInstance = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateInstance"));
+// vkDestroyInstance = reinterpret_cast(dlsym(libvulkan, "vkDestroyInstance"));
+// vkEnumeratePhysicalDevices = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkEnumeratePhysicalDevices"));
+// vkGetPhysicalDeviceFeatures = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceFeatures"));
+// vkGetPhysicalDeviceFormatProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceFormatProperties"));
+// vkGetPhysicalDeviceImageFormatProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceImageFormatProperties"));
+// vkGetPhysicalDeviceProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceProperties"));
+// vkGetPhysicalDeviceQueueFamilyProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceQueueFamilyProperties"));
+// vkGetPhysicalDeviceMemoryProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceMemoryProperties"));
+// vkGetDeviceProcAddr = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetDeviceProcAddr"));
+// vkCreateDevice = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateDevice"));
+// vkDestroyDevice = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyDevice"));
+// vkEnumerateInstanceExtensionProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkEnumerateInstanceExtensionProperties"));
+// vkEnumerateDeviceExtensionProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkEnumerateDeviceExtensionProperties"));
+// vkEnumerateInstanceLayerProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkEnumerateInstanceLayerProperties"));
+// vkEnumerateDeviceLayerProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkEnumerateDeviceLayerProperties"));
+// vkGetDeviceQueue = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetDeviceQueue"));
+// vkQueueSubmit = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkQueueSubmit"));
+// vkQueueWaitIdle = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkQueueWaitIdle"));
+// vkDeviceWaitIdle = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDeviceWaitIdle"));
+// vkAllocateMemory = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkAllocateMemory"));
+// vkFreeMemory = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkFreeMemory"));
+// vkMapMemory = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkMapMemory"));
+// vkUnmapMemory = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkUnmapMemory"));
+// vkFlushMappedMemoryRanges = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkFlushMappedMemoryRanges"));
+// vkInvalidateMappedMemoryRanges = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkInvalidateMappedMemoryRanges"));
+// vkGetDeviceMemoryCommitment = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetDeviceMemoryCommitment"));
+// vkBindBufferMemory = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkBindBufferMemory"));
+// vkBindImageMemory = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkBindImageMemory"));
+// vkGetBufferMemoryRequirements = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetBufferMemoryRequirements"));
+// vkGetImageMemoryRequirements = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetImageMemoryRequirements"));
+// vkGetImageSparseMemoryRequirements = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetImageSparseMemoryRequirements"));
+// vkGetPhysicalDeviceSparseImageFormatProperties = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPhysicalDeviceSparseImageFormatProperties"));
+// vkQueueBindSparse = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkQueueBindSparse"));
+// vkCreateFence = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateFence"));
+// vkDestroyFence = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyFence"));
+// vkResetFences = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkResetFences"));
+// vkGetFenceStatus = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetFenceStatus"));
+// vkWaitForFences = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkWaitForFences"));
+// vkCreateSemaphore = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateSemaphore"));
+// vkDestroySemaphore = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroySemaphore"));
+// vkCreateEvent = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateEvent"));
+// vkDestroyEvent = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyEvent"));
+// vkGetEventStatus = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetEventStatus"));
+// vkSetEvent = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkSetEvent"));
+// vkResetEvent = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkResetEvent"));
+// vkCreateQueryPool = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateQueryPool"));
+// vkDestroyQueryPool = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyQueryPool"));
+// vkGetQueryPoolResults = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetQueryPoolResults"));
+// vkCreateBuffer = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateBuffer"));
+// vkDestroyBuffer = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyBuffer"));
+// vkCreateBufferView = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateBufferView"));
+// vkDestroyBufferView = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyBufferView"));
+// vkCreateImage = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateImage"));
+// vkDestroyImage = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyImage"));
+// vkGetImageSubresourceLayout = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetImageSubresourceLayout"));
+// vkCreateImageView = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateImageView"));
+// vkDestroyImageView = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyImageView"));
+// vkCreateShaderModule = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreateShaderModule"));
+// vkDestroyShaderModule = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyShaderModule"));
+// vkCreatePipelineCache = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkCreatePipelineCache"));
+// vkDestroyPipelineCache = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkDestroyPipelineCache"));
+// vkGetPipelineCacheData = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkGetPipelineCacheData"));
+// vkMergePipelineCaches = reinterpret_cast(vkGetInstanceProcAddr(nullptr, "vkMergePipelineCaches"));
+// vkCreateGraphicsPipelines = reinterpret_cast