From e9a8a0cb847a9d0a8f6c09f5da1f7bff5ab1c32a Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Mon, 16 Sep 2024 05:07:02 +0200 Subject: [PATCH] working on vulkan loader --- runtime/Includes/Core/SDLManager.h | 2 +- runtime/Includes/Platform/Window.h | 4 +- runtime/Includes/PreCompiled.h | 1 - runtime/Includes/Renderer/RenderCore.h | 1 + .../Renderer/Vulkan/VulkanPrototypes.h | 12 +- runtime/Sources/Core/SDLManager.cpp | 28 +- runtime/Sources/Renderer/RenderCore.cpp | 6 +- .../Sources/Renderer/Vulkan/VulkanLoader.cpp | 440 ++++++++++-------- .../Sources/Renderer/Vulkan/VulkanLoader.h | 1 + 9 files changed, 274 insertions(+), 221 deletions(-) diff --git a/runtime/Includes/Core/SDLManager.h b/runtime/Includes/Core/SDLManager.h index 8022a25..61f273d 100644 --- a/runtime/Includes/Core/SDLManager.h +++ b/runtime/Includes/Core/SDLManager.h @@ -17,7 +17,7 @@ namespace mlx void DestroyWindow(Handle window) noexcept; VkSurfaceKHR CreateVulkanSurface(Handle window, VkInstance instance) const noexcept; - std::vector GetRequiredVulkanInstanceExtentions(Handle window) const noexcept; + std::vector GetRequiredVulkanInstanceExtentions() const noexcept; Vec2ui GetVulkanDrawableSize(Handle window) const noexcept; void MoveMouseOnWindow(Handle window, int x, int y) const noexcept; void GetScreenSizeWindowIsOn(Handle window, int* x, int* y) const noexcept; diff --git a/runtime/Includes/Platform/Window.h b/runtime/Includes/Platform/Window.h index 427e52f..1a15f33 100644 --- a/runtime/Includes/Platform/Window.h +++ b/runtime/Includes/Platform/Window.h @@ -21,12 +21,12 @@ namespace mlx inline void SetPosition(int x, int y) { SDLManager::Get().SetWindowPosition(p_window, x, y); } inline VkSurfaceKHR CreateVulkanSurface(VkInstance instance) const noexcept { return SDLManager::Get().CreateVulkanSurface(p_window, instance); } - inline std::vector GetRequiredVulkanInstanceExtentions() const noexcept { return SDLManager::Get().GetRequiredVulkanInstanceExtentions(p_window); } + inline std::vector GetRequiredVulkanInstanceExtentions() const noexcept { return SDLManager::Get().GetRequiredVulkanInstanceExtentions(); } inline Vec2ui GetVulkanDrawableSize() const noexcept { return SDLManager::Get().GetVulkanDrawableSize(p_window); } void Destroy() noexcept; - ~Window() = default; + ~Window() { Destroy(); } private: Handle p_window = nullptr; diff --git a/runtime/Includes/PreCompiled.h b/runtime/Includes/PreCompiled.h index acaac11..f0041a9 100644 --- a/runtime/Includes/PreCompiled.h +++ b/runtime/Includes/PreCompiled.h @@ -81,7 +81,6 @@ #include #include -#include #ifdef DEBUG #define KVF_ENABLE_VALIDATION_LAYERS #endif diff --git a/runtime/Includes/Renderer/RenderCore.h b/runtime/Includes/Renderer/RenderCore.h index 04140d1..5885064 100644 --- a/runtime/Includes/Renderer/RenderCore.h +++ b/runtime/Includes/Renderer/RenderCore.h @@ -1,6 +1,7 @@ #ifndef __MLX_RENDER_CORE__ #define __MLX_RENDER_CORE__ +#include #include namespace mlx diff --git a/runtime/Includes/Renderer/Vulkan/VulkanPrototypes.h b/runtime/Includes/Renderer/Vulkan/VulkanPrototypes.h index d65439f..d3e9ad9 100644 --- a/runtime/Includes/Renderer/Vulkan/VulkanPrototypes.h +++ b/runtime/Includes/Renderer/Vulkan/VulkanPrototypes.h @@ -13,7 +13,7 @@ #include #endif -#if defined(VK_VERSION_1_0) +#ifdef VK_VERSION_1_0 extern PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; extern PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets; extern PFN_vkAllocateMemory vkAllocateMemory; @@ -151,20 +151,20 @@ extern PFN_vkUnmapMemory vkUnmapMemory; extern PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets; extern PFN_vkWaitForFences vkWaitForFences; -#endif /* defined(VK_VERSION_1_0) */ -#if defined(VK_KHR_swapchain) +#endif +#ifdef VK_KHR_swapchain extern PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; extern PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; extern PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; extern PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; extern PFN_vkQueuePresentKHR vkQueuePresentKHR; -#endif /* defined(VK_KHR_swapchain) */ -#if defined(VK_KHR_surface) +#endif +#ifdef VK_KHR_surface extern PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; extern PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; extern PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; extern PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; extern PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; -#endif /* defined(VK_KHR_surface) */ +#endif #endif diff --git a/runtime/Sources/Core/SDLManager.cpp b/runtime/Sources/Core/SDLManager.cpp index 36407bf..fa0801f 100644 --- a/runtime/Sources/Core/SDLManager.cpp +++ b/runtime/Sources/Core/SDLManager.cpp @@ -139,16 +139,30 @@ namespace mlx return surface; } - std::vector SDLManager::GetRequiredVulkanInstanceExtentions(Handle window) const noexcept + std::vector SDLManager::GetRequiredVulkanInstanceExtentions() const noexcept { - std::uint32_t count; - if(!SDL_Vulkan_GetInstanceExtensions(static_cast(window), &count, nullptr)) - FatalError("Vulkan : cannot get instance extentions from window : %", SDL_GetError()); + std::vector extensions; + extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); - std::vector extensions(count); + #ifdef VK_USE_PLATFORM_XCB_KHR + extensions.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME); + #endif - if(!SDL_Vulkan_GetInstanceExtensions(static_cast(window), &count, extensions.data())) - FatalError("Vulkan : cannot get instance extentions from window : %", SDL_GetError()); + #ifdef VK_USE_PLATFORM_XLIB_KHR + extensions.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME); + #endif + + #ifdef VK_USE_PLATFORM_WAYLAND_KHR + extensions.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME); + #endif + + #ifdef VK_USE_PLATFORM_WIN32_KHR + extensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME); + #endif + + #ifdef VK_USE_PLATFORM_METAL_EXT + extensions.push_back(VK_EXT_METAL_SURFACE_EXTENSION_NAME); + #endif return extensions; } diff --git a/runtime/Sources/Renderer/RenderCore.cpp b/runtime/Sources/Renderer/RenderCore.cpp index 0ab8904..79ca02d 100644 --- a/runtime/Sources/Renderer/RenderCore.cpp +++ b/runtime/Sources/Renderer/RenderCore.cpp @@ -1,5 +1,6 @@ #include #include +#include #define KVF_IMPLEMENTATION #ifdef DEBUG @@ -15,7 +16,6 @@ #include #endif -#include #include #include #include @@ -79,8 +79,10 @@ namespace mlx m_device = kvfCreateDevice(m_physical_device, device_extensions, sizeof(device_extensions) / sizeof(device_extensions[0]), &features); DebugLog("Vulkan : logical device created"); + loader->LoadDevice(m_device); + vkDestroySurfaceKHR(m_instance, surface, nullptr); - window.Destroy(); + FatalError("caca"); } void RenderCore::Destroy() noexcept diff --git a/runtime/Sources/Renderer/Vulkan/VulkanLoader.cpp b/runtime/Sources/Renderer/Vulkan/VulkanLoader.cpp index 7a7bf81..273a902 100644 --- a/runtime/Sources/Renderer/Vulkan/VulkanLoader.cpp +++ b/runtime/Sources/Renderer/Vulkan/VulkanLoader.cpp @@ -1,3 +1,5 @@ +#include "Renderer/Vulkan/VulkanPrototypes.h" +#include "vulkan/vulkan_core.h" #include #include @@ -5,6 +7,9 @@ __declspec(dllimport) HMODULE __stdcall LoadLibraryA(LPCSTR); __declspec(dllimport) FARPROC __stdcall GetProcAddress(HMODULE, LPCSTR); __declspec(dllimport) int __stdcall FreeLibrary(HMODULE); + using LibModule = HMODULE; +#else + using LibModule = Handle; #endif #if defined(MLX_COMPILER_GCC) @@ -24,237 +29,268 @@ namespace mlx { static inline PFN_vkVoidFunction vkGetInstanceProcAddrStub(Handle context, const char* name) { - return vkGetInstanceProcAddr(static_cast(context), name); + PFN_vkVoidFunction function = vkGetInstanceProcAddr(static_cast(context), name); + if(!function) + FatalError("Vulkan loader : could not load '%'", name); + DebugLog("Vulkan loader : loaded %", name); + return function; + } + + static inline PFN_vkVoidFunction vkGetDeviceProcAddrStub(Handle context, const char* name) + { + PFN_vkVoidFunction function = vkGetDeviceProcAddr(static_cast(context), name); + if(!function) + FatalError("Vulkan loader : could not load '%'", name); + DebugLog("Vulkan loader : loaded %", name); + return function; + } + + static inline LibModule LoadLib(const char* libname) + { + #ifdef MLX_PLAT_WINDOWS + return LoadLibraryA(libname); + #else + return dlopen(libname, RTLD_NOW | RTLD_LOCAL); + #endif + } + + static inline void* GetSymbol(LibModule module, const char* name) + { + #ifdef MLX_PLAT_WINDOWS + return (void*)(void(*)(void))GetProcAddress(module, name); + #else + return dlsym(module, name); + #endif } } VulkanLoader::VulkanLoader() { #if defined(MLX_PLAT_WINDOWS) - p_module = LoadLibraryA("vulkan-1.dll"); - if(!p_module) - FatalError("Vulkan loader : failed to load libvulkan"); - vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)(void(*)(void))GetProcAddress(p_module, "vkGetInstanceProcAddr"); + std::array libnames{ + "vulkan-1.dll" + }; #elif defined(MLX_PLAT_MACOS) - p_module = dlopen("libvulkan.dylib", RTLD_NOW | RTLD_LOCAL); - if(!p_module) - p_module = dlopen("libvulkan.1.dylib", RTLD_NOW | RTLD_LOCAL); - if(!p_module) - p_module = dlopen("libMoltenVK.dylib", RTLD_NOW | RTLD_LOCAL); - - // Add support for using Vulkan and MoltenVK in a Framework. App store rules for iOS - // strictly enforce no .dylib's. If they aren't found it just falls through - if(!p_module) - p_module = dlopen("vulkan.framework/vulkan", RTLD_NOW | RTLD_LOCAL); - if(!p_module) - p_module = dlopen("MoltenVK.framework/MoltenVK", RTLD_NOW | RTLD_LOCAL); - - // modern versions of macOS don't search /usr/local/lib automatically contrary to what man dlopen says - // Vulkan SDK uses this as the system-wide installation location, so we're going to fallback to this if all else fails - if(!p_module && getenv("DYLD_FALLBACK_LIBRARY_PATH") == NULL) - p_module = dlopen("/usr/local/lib/libvulkan.dylib", RTLD_NOW | RTLD_LOCAL); - if(!p_module) - FatalError("Vulkan loader : failed to load libvulkan"); - void* symbol_ptr = dlsym(p_module, "vkGetInstanceProcAddr"); - *(void**)(&vkGetInstanceProcAddr) = symbol_ptr; + std::array libnames{ + "libvulkan.dylib", + "libvulkan.1.dylib", + "libMoltenVK.dylib", + "vulkan.framework/vulkan", + "MoltenVK.framework/MoltenVK", + "/usr/local/lib/libvulkan.dylib", + }; #else - dlerror(); - p_module = dlopen("libvulkan.so.1", RTLD_NOW | RTLD_LOCAL); - if(!p_module) - p_module = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL); - if(!p_module) - FatalError("Vulkan loader : failed to load libvulkan due to %", dlerror()); - DISABLE_GCC_PEDANTIC_WARNINGS - void* symbol_ptr = dlsym(p_module, "vkGetInstanceProcAddr"); - *(void**)(&vkGetInstanceProcAddr) = symbol_ptr; - RESTORE_GCC_PEDANTIC_WARNINGS + std::array libnames{ + "libvulkan.so.1", + "libvulkan.so" + }; #endif + + for(auto libname : libnames) + { + p_module = Internal::LoadLib(libname); + if(p_module != nullptr) + break; + } + if(!p_module) + FatalError("Vulkan loader : failed to load libvulkan"); + + DISABLE_GCC_PEDANTIC_WARNINGS + vkGetInstanceProcAddr = reinterpret_cast(Internal::GetSymbol(p_module, "vkGetInstanceProcAddr")); + RESTORE_GCC_PEDANTIC_WARNINGS + + if(!vkGetInstanceProcAddr) + FatalError("Vulkan loader : could not get symbol for 'vkGetInstanceProcAddr'"); DebugLog("Vulkan loader : libvulkan loaded"); - LoadGlobalFunctions(nullptr, Internal::vkGetInstanceProcAddrStub); + LoadGlobalFunctions(NULL, Internal::vkGetInstanceProcAddrStub); } void VulkanLoader::LoadInstance(VkInstance instance) { LoadInstanceFunctions(instance, Internal::vkGetInstanceProcAddrStub); - LoadDeviceFunctions(instance, Internal::vkGetInstanceProcAddrStub); + } + + void VulkanLoader::LoadDevice(VkDevice device) + { + LoadDeviceFunctions(device, Internal::vkGetDeviceProcAddrStub); } void VulkanLoader::LoadGlobalFunctions(void* context, PFN_vkVoidFunction (*load)(void*, const char*)) noexcept { - #if defined(VK_VERSION_1_0) - vkCreateInstance = (PFN_vkCreateInstance)load(context, "vkCreateInstance"); - vkEnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties)load(context, "vkEnumerateInstanceExtensionProperties"); - vkEnumerateInstanceLayerProperties = (PFN_vkEnumerateInstanceLayerProperties)load(context, "vkEnumerateInstanceLayerProperties"); - #endif /* defined(VK_VERSION_1_0) */ + #ifdef VK_VERSION_1_0 + vkCreateInstance = reinterpret_cast(load(context, "vkCreateInstance")); + vkEnumerateInstanceExtensionProperties = reinterpret_cast(load(context, "vkEnumerateInstanceExtensionProperties")); + vkEnumerateInstanceLayerProperties = reinterpret_cast(load(context, "vkEnumerateInstanceLayerProperties")); + #endif DebugLog("Vulkan loader : global functions loaded"); } void VulkanLoader::LoadInstanceFunctions(void* context, PFN_vkVoidFunction (*load)(void*, const char*)) noexcept { - #if defined(VK_VERSION_1_0) - vkCreateDevice = (PFN_vkCreateDevice)load(context, "vkCreateDevice"); - vkDestroyInstance = (PFN_vkDestroyInstance)load(context, "vkDestroyInstance"); - vkEnumerateDeviceExtensionProperties = (PFN_vkEnumerateDeviceExtensionProperties)load(context, "vkEnumerateDeviceExtensionProperties"); - vkEnumerateDeviceLayerProperties = (PFN_vkEnumerateDeviceLayerProperties)load(context, "vkEnumerateDeviceLayerProperties"); - vkEnumeratePhysicalDevices = (PFN_vkEnumeratePhysicalDevices)load(context, "vkEnumeratePhysicalDevices"); - vkGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr)load(context, "vkGetDeviceProcAddr"); - vkGetPhysicalDeviceFeatures = (PFN_vkGetPhysicalDeviceFeatures)load(context, "vkGetPhysicalDeviceFeatures"); - vkGetPhysicalDeviceFormatProperties = (PFN_vkGetPhysicalDeviceFormatProperties)load(context, "vkGetPhysicalDeviceFormatProperties"); - vkGetPhysicalDeviceImageFormatProperties = (PFN_vkGetPhysicalDeviceImageFormatProperties)load(context, "vkGetPhysicalDeviceImageFormatProperties"); - vkGetPhysicalDeviceMemoryProperties = (PFN_vkGetPhysicalDeviceMemoryProperties)load(context, "vkGetPhysicalDeviceMemoryProperties"); - vkGetPhysicalDeviceProperties = (PFN_vkGetPhysicalDeviceProperties)load(context, "vkGetPhysicalDeviceProperties"); - vkGetPhysicalDeviceQueueFamilyProperties = (PFN_vkGetPhysicalDeviceQueueFamilyProperties)load(context, "vkGetPhysicalDeviceQueueFamilyProperties"); - vkGetPhysicalDeviceSparseImageFormatProperties = (PFN_vkGetPhysicalDeviceSparseImageFormatProperties)load(context, "vkGetPhysicalDeviceSparseImageFormatProperties"); - #endif /* defined(VK_VERSION_1_0) */ - #if defined(VK_KHR_surface) - vkDestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)load(context, "vkDestroySurfaceKHR"); - vkGetPhysicalDeviceSurfaceCapabilitiesKHR = (PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)load(context, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"); - vkGetPhysicalDeviceSurfaceFormatsKHR = (PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)load(context, "vkGetPhysicalDeviceSurfaceFormatsKHR"); - vkGetPhysicalDeviceSurfacePresentModesKHR = (PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)load(context, "vkGetPhysicalDeviceSurfacePresentModesKHR"); - vkGetPhysicalDeviceSurfaceSupportKHR = (PFN_vkGetPhysicalDeviceSurfaceSupportKHR)load(context, "vkGetPhysicalDeviceSurfaceSupportKHR"); - #endif /* defined(VK_KHR_surface) */ + #ifdef VK_VERSION_1_0 + vkCreateDevice = reinterpret_cast(load(context, "vkCreateDevice")); + vkDestroyInstance = reinterpret_cast(load(context, "vkDestroyInstance")); + vkEnumerateDeviceExtensionProperties = reinterpret_cast(load(context, "vkEnumerateDeviceExtensionProperties")); + vkEnumerateDeviceLayerProperties = reinterpret_cast(load(context, "vkEnumerateDeviceLayerProperties")); + vkEnumeratePhysicalDevices = reinterpret_cast(load(context, "vkEnumeratePhysicalDevices")); + vkGetDeviceProcAddr = reinterpret_cast(load(context, "vkGetDeviceProcAddr")); + vkGetPhysicalDeviceFeatures = reinterpret_cast(load(context, "vkGetPhysicalDeviceFeatures")); + vkGetPhysicalDeviceFormatProperties = reinterpret_cast(load(context, "vkGetPhysicalDeviceFormatProperties")); + vkGetPhysicalDeviceImageFormatProperties = reinterpret_cast(load(context, "vkGetPhysicalDeviceImageFormatProperties")); + vkGetPhysicalDeviceMemoryProperties = reinterpret_cast(load(context, "vkGetPhysicalDeviceMemoryProperties")); + vkGetPhysicalDeviceProperties = reinterpret_cast(load(context, "vkGetPhysicalDeviceProperties")); + vkGetPhysicalDeviceQueueFamilyProperties = reinterpret_cast(load(context, "vkGetPhysicalDeviceQueueFamilyProperties")); + vkGetPhysicalDeviceSparseImageFormatProperties = reinterpret_cast(load(context, "vkGetPhysicalDeviceSparseImageFormatProperties")); + #endif + #ifdef VK_KHR_surface + vkDestroySurfaceKHR = reinterpret_cast(load(context, "vkDestroySurfaceKHR")); + vkGetPhysicalDeviceSurfaceCapabilitiesKHR = reinterpret_cast(load(context, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR")); + vkGetPhysicalDeviceSurfaceFormatsKHR = reinterpret_cast(load(context, "vkGetPhysicalDeviceSurfaceFormatsKHR")); + vkGetPhysicalDeviceSurfacePresentModesKHR = reinterpret_cast(load(context, "vkGetPhysicalDeviceSurfacePresentModesKHR")); + vkGetPhysicalDeviceSurfaceSupportKHR = reinterpret_cast(load(context, "vkGetPhysicalDeviceSurfaceSupportKHR")); + #endif DebugLog("Vulkan loader : instance functions loaded"); } void VulkanLoader::LoadDeviceFunctions(void* context, PFN_vkVoidFunction (*load)(void*, const char*)) noexcept { - #if defined(VK_VERSION_1_0) - vkAllocateCommandBuffers = (PFN_vkAllocateCommandBuffers)load(context, "vkAllocateCommandBuffers"); - vkAllocateDescriptorSets = (PFN_vkAllocateDescriptorSets)load(context, "vkAllocateDescriptorSets"); - vkAllocateMemory = (PFN_vkAllocateMemory)load(context, "vkAllocateMemory"); - vkBeginCommandBuffer = (PFN_vkBeginCommandBuffer)load(context, "vkBeginCommandBuffer"); - vkBindBufferMemory = (PFN_vkBindBufferMemory)load(context, "vkBindBufferMemory"); - vkBindImageMemory = (PFN_vkBindImageMemory)load(context, "vkBindImageMemory"); - vkCmdBeginQuery = (PFN_vkCmdBeginQuery)load(context, "vkCmdBeginQuery"); - vkCmdBeginRenderPass = (PFN_vkCmdBeginRenderPass)load(context, "vkCmdBeginRenderPass"); - vkCmdBindDescriptorSets = (PFN_vkCmdBindDescriptorSets)load(context, "vkCmdBindDescriptorSets"); - vkCmdBindIndexBuffer = (PFN_vkCmdBindIndexBuffer)load(context, "vkCmdBindIndexBuffer"); - vkCmdBindPipeline = (PFN_vkCmdBindPipeline)load(context, "vkCmdBindPipeline"); - vkCmdBindVertexBuffers = (PFN_vkCmdBindVertexBuffers)load(context, "vkCmdBindVertexBuffers"); - vkCmdBlitImage = (PFN_vkCmdBlitImage)load(context, "vkCmdBlitImage"); - vkCmdClearAttachments = (PFN_vkCmdClearAttachments)load(context, "vkCmdClearAttachments"); - vkCmdClearColorImage = (PFN_vkCmdClearColorImage)load(context, "vkCmdClearColorImage"); - vkCmdClearDepthStencilImage = (PFN_vkCmdClearDepthStencilImage)load(context, "vkCmdClearDepthStencilImage"); - vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)load(context, "vkCmdCopyBuffer"); - vkCmdCopyBufferToImage = (PFN_vkCmdCopyBufferToImage)load(context, "vkCmdCopyBufferToImage"); - vkCmdCopyImage = (PFN_vkCmdCopyImage)load(context, "vkCmdCopyImage"); - vkCmdCopyImageToBuffer = (PFN_vkCmdCopyImageToBuffer)load(context, "vkCmdCopyImageToBuffer"); - vkCmdCopyQueryPoolResults = (PFN_vkCmdCopyQueryPoolResults)load(context, "vkCmdCopyQueryPoolResults"); - vkCmdDispatch = (PFN_vkCmdDispatch)load(context, "vkCmdDispatch"); - vkCmdDispatchIndirect = (PFN_vkCmdDispatchIndirect)load(context, "vkCmdDispatchIndirect"); - vkCmdDraw = (PFN_vkCmdDraw)load(context, "vkCmdDraw"); - vkCmdDrawIndexed = (PFN_vkCmdDrawIndexed)load(context, "vkCmdDrawIndexed"); - vkCmdDrawIndexedIndirect = (PFN_vkCmdDrawIndexedIndirect)load(context, "vkCmdDrawIndexedIndirect"); - vkCmdDrawIndirect = (PFN_vkCmdDrawIndirect)load(context, "vkCmdDrawIndirect"); - vkCmdEndQuery = (PFN_vkCmdEndQuery)load(context, "vkCmdEndQuery"); - vkCmdEndRenderPass = (PFN_vkCmdEndRenderPass)load(context, "vkCmdEndRenderPass"); - vkCmdExecuteCommands = (PFN_vkCmdExecuteCommands)load(context, "vkCmdExecuteCommands"); - vkCmdFillBuffer = (PFN_vkCmdFillBuffer)load(context, "vkCmdFillBuffer"); - vkCmdNextSubpass = (PFN_vkCmdNextSubpass)load(context, "vkCmdNextSubpass"); - vkCmdPipelineBarrier = (PFN_vkCmdPipelineBarrier)load(context, "vkCmdPipelineBarrier"); - vkCmdPushConstants = (PFN_vkCmdPushConstants)load(context, "vkCmdPushConstants"); - vkCmdResetEvent = (PFN_vkCmdResetEvent)load(context, "vkCmdResetEvent"); - vkCmdResetQueryPool = (PFN_vkCmdResetQueryPool)load(context, "vkCmdResetQueryPool"); - vkCmdResolveImage = (PFN_vkCmdResolveImage)load(context, "vkCmdResolveImage"); - vkCmdSetBlendConstants = (PFN_vkCmdSetBlendConstants)load(context, "vkCmdSetBlendConstants"); - vkCmdSetDepthBias = (PFN_vkCmdSetDepthBias)load(context, "vkCmdSetDepthBias"); - vkCmdSetDepthBounds = (PFN_vkCmdSetDepthBounds)load(context, "vkCmdSetDepthBounds"); - vkCmdSetEvent = (PFN_vkCmdSetEvent)load(context, "vkCmdSetEvent"); - vkCmdSetLineWidth = (PFN_vkCmdSetLineWidth)load(context, "vkCmdSetLineWidth"); - vkCmdSetScissor = (PFN_vkCmdSetScissor)load(context, "vkCmdSetScissor"); - vkCmdSetStencilCompareMask = (PFN_vkCmdSetStencilCompareMask)load(context, "vkCmdSetStencilCompareMask"); - vkCmdSetStencilReference = (PFN_vkCmdSetStencilReference)load(context, "vkCmdSetStencilReference"); - vkCmdSetStencilWriteMask = (PFN_vkCmdSetStencilWriteMask)load(context, "vkCmdSetStencilWriteMask"); - vkCmdSetViewport = (PFN_vkCmdSetViewport)load(context, "vkCmdSetViewport"); - vkCmdUpdateBuffer = (PFN_vkCmdUpdateBuffer)load(context, "vkCmdUpdateBuffer"); - vkCmdWaitEvents = (PFN_vkCmdWaitEvents)load(context, "vkCmdWaitEvents"); - vkCmdWriteTimestamp = (PFN_vkCmdWriteTimestamp)load(context, "vkCmdWriteTimestamp"); - vkCreateBuffer = (PFN_vkCreateBuffer)load(context, "vkCreateBuffer"); - vkCreateBufferView = (PFN_vkCreateBufferView)load(context, "vkCreateBufferView"); - vkCreateCommandPool = (PFN_vkCreateCommandPool)load(context, "vkCreateCommandPool"); - vkCreateComputePipelines = (PFN_vkCreateComputePipelines)load(context, "vkCreateComputePipelines"); - vkCreateDescriptorPool = (PFN_vkCreateDescriptorPool)load(context, "vkCreateDescriptorPool"); - vkCreateDescriptorSetLayout = (PFN_vkCreateDescriptorSetLayout)load(context, "vkCreateDescriptorSetLayout"); - vkCreateEvent = (PFN_vkCreateEvent)load(context, "vkCreateEvent"); - vkCreateFence = (PFN_vkCreateFence)load(context, "vkCreateFence"); - vkCreateFramebuffer = (PFN_vkCreateFramebuffer)load(context, "vkCreateFramebuffer"); - vkCreateGraphicsPipelines = (PFN_vkCreateGraphicsPipelines)load(context, "vkCreateGraphicsPipelines"); - vkCreateImage = (PFN_vkCreateImage)load(context, "vkCreateImage"); - vkCreateImageView = (PFN_vkCreateImageView)load(context, "vkCreateImageView"); - vkCreatePipelineCache = (PFN_vkCreatePipelineCache)load(context, "vkCreatePipelineCache"); - vkCreatePipelineLayout = (PFN_vkCreatePipelineLayout)load(context, "vkCreatePipelineLayout"); - vkCreateQueryPool = (PFN_vkCreateQueryPool)load(context, "vkCreateQueryPool"); - vkCreateRenderPass = (PFN_vkCreateRenderPass)load(context, "vkCreateRenderPass"); - vkCreateSampler = (PFN_vkCreateSampler)load(context, "vkCreateSampler"); - vkCreateSemaphore = (PFN_vkCreateSemaphore)load(context, "vkCreateSemaphore"); - vkCreateShaderModule = (PFN_vkCreateShaderModule)load(context, "vkCreateShaderModule"); - vkDestroyBuffer = (PFN_vkDestroyBuffer)load(context, "vkDestroyBuffer"); - vkDestroyBufferView = (PFN_vkDestroyBufferView)load(context, "vkDestroyBufferView"); - vkDestroyCommandPool = (PFN_vkDestroyCommandPool)load(context, "vkDestroyCommandPool"); - vkDestroyDescriptorPool = (PFN_vkDestroyDescriptorPool)load(context, "vkDestroyDescriptorPool"); - vkDestroyDescriptorSetLayout = (PFN_vkDestroyDescriptorSetLayout)load(context, "vkDestroyDescriptorSetLayout"); - vkDestroyDevice = (PFN_vkDestroyDevice)load(context, "vkDestroyDevice"); - vkDestroyEvent = (PFN_vkDestroyEvent)load(context, "vkDestroyEvent"); - vkDestroyFence = (PFN_vkDestroyFence)load(context, "vkDestroyFence"); - vkDestroyFramebuffer = (PFN_vkDestroyFramebuffer)load(context, "vkDestroyFramebuffer"); - vkDestroyImage = (PFN_vkDestroyImage)load(context, "vkDestroyImage"); - vkDestroyImageView = (PFN_vkDestroyImageView)load(context, "vkDestroyImageView"); - vkDestroyPipeline = (PFN_vkDestroyPipeline)load(context, "vkDestroyPipeline"); - vkDestroyPipelineCache = (PFN_vkDestroyPipelineCache)load(context, "vkDestroyPipelineCache"); - vkDestroyPipelineLayout = (PFN_vkDestroyPipelineLayout)load(context, "vkDestroyPipelineLayout"); - vkDestroyQueryPool = (PFN_vkDestroyQueryPool)load(context, "vkDestroyQueryPool"); - vkDestroyRenderPass = (PFN_vkDestroyRenderPass)load(context, "vkDestroyRenderPass"); - vkDestroySampler = (PFN_vkDestroySampler)load(context, "vkDestroySampler"); - vkDestroySemaphore = (PFN_vkDestroySemaphore)load(context, "vkDestroySemaphore"); - vkDestroyShaderModule = (PFN_vkDestroyShaderModule)load(context, "vkDestroyShaderModule"); - vkDeviceWaitIdle = (PFN_vkDeviceWaitIdle)load(context, "vkDeviceWaitIdle"); - vkEndCommandBuffer = (PFN_vkEndCommandBuffer)load(context, "vkEndCommandBuffer"); - vkFlushMappedMemoryRanges = (PFN_vkFlushMappedMemoryRanges)load(context, "vkFlushMappedMemoryRanges"); - vkFreeCommandBuffers = (PFN_vkFreeCommandBuffers)load(context, "vkFreeCommandBuffers"); - vkFreeDescriptorSets = (PFN_vkFreeDescriptorSets)load(context, "vkFreeDescriptorSets"); - vkFreeMemory = (PFN_vkFreeMemory)load(context, "vkFreeMemory"); - vkGetBufferMemoryRequirements = (PFN_vkGetBufferMemoryRequirements)load(context, "vkGetBufferMemoryRequirements"); - vkGetDeviceMemoryCommitment = (PFN_vkGetDeviceMemoryCommitment)load(context, "vkGetDeviceMemoryCommitment"); - vkGetDeviceQueue = (PFN_vkGetDeviceQueue)load(context, "vkGetDeviceQueue"); - vkGetEventStatus = (PFN_vkGetEventStatus)load(context, "vkGetEventStatus"); - vkGetFenceStatus = (PFN_vkGetFenceStatus)load(context, "vkGetFenceStatus"); - vkGetImageMemoryRequirements = (PFN_vkGetImageMemoryRequirements)load(context, "vkGetImageMemoryRequirements"); - vkGetImageSparseMemoryRequirements = (PFN_vkGetImageSparseMemoryRequirements)load(context, "vkGetImageSparseMemoryRequirements"); - vkGetImageSubresourceLayout = (PFN_vkGetImageSubresourceLayout)load(context, "vkGetImageSubresourceLayout"); - vkGetPipelineCacheData = (PFN_vkGetPipelineCacheData)load(context, "vkGetPipelineCacheData"); - vkGetQueryPoolResults = (PFN_vkGetQueryPoolResults)load(context, "vkGetQueryPoolResults"); - vkGetRenderAreaGranularity = (PFN_vkGetRenderAreaGranularity)load(context, "vkGetRenderAreaGranularity"); - vkInvalidateMappedMemoryRanges = (PFN_vkInvalidateMappedMemoryRanges)load(context, "vkInvalidateMappedMemoryRanges"); - vkMapMemory = (PFN_vkMapMemory)load(context, "vkMapMemory"); - vkMergePipelineCaches = (PFN_vkMergePipelineCaches)load(context, "vkMergePipelineCaches"); - vkQueueBindSparse = (PFN_vkQueueBindSparse)load(context, "vkQueueBindSparse"); - vkQueueSubmit = (PFN_vkQueueSubmit)load(context, "vkQueueSubmit"); - vkQueueWaitIdle = (PFN_vkQueueWaitIdle)load(context, "vkQueueWaitIdle"); - vkResetCommandBuffer = (PFN_vkResetCommandBuffer)load(context, "vkResetCommandBuffer"); - vkResetCommandPool = (PFN_vkResetCommandPool)load(context, "vkResetCommandPool"); - vkResetDescriptorPool = (PFN_vkResetDescriptorPool)load(context, "vkResetDescriptorPool"); - vkResetEvent = (PFN_vkResetEvent)load(context, "vkResetEvent"); - vkResetFences = (PFN_vkResetFences)load(context, "vkResetFences"); - vkSetEvent = (PFN_vkSetEvent)load(context, "vkSetEvent"); - vkUnmapMemory = (PFN_vkUnmapMemory)load(context, "vkUnmapMemory"); - vkUpdateDescriptorSets = (PFN_vkUpdateDescriptorSets)load(context, "vkUpdateDescriptorSets"); - vkWaitForFences = (PFN_vkWaitForFences)load(context, "vkWaitForFences"); - #endif /* defined(VK_VERSION_1_0) */ - #if defined(VK_KHR_swapchain) - vkAcquireNextImageKHR = (PFN_vkAcquireNextImageKHR)load(context, "vkAcquireNextImageKHR"); - vkCreateSwapchainKHR = (PFN_vkCreateSwapchainKHR)load(context, "vkCreateSwapchainKHR"); - vkDestroySwapchainKHR = (PFN_vkDestroySwapchainKHR)load(context, "vkDestroySwapchainKHR"); - vkGetSwapchainImagesKHR = (PFN_vkGetSwapchainImagesKHR)load(context, "vkGetSwapchainImagesKHR"); - vkQueuePresentKHR = (PFN_vkQueuePresentKHR)load(context, "vkQueuePresentKHR"); - #endif /* defined(VK_KHR_swapchain) */ + #ifdef VK_VERSION_1_0 + vkAllocateCommandBuffers = reinterpret_cast(load(context, "vkAllocateCommandBuffers")); + vkAllocateDescriptorSets = reinterpret_cast(load(context, "vkAllocateDescriptorSets")); + vkAllocateMemory = reinterpret_cast(load(context, "vkAllocateMemory")); + vkBeginCommandBuffer = reinterpret_cast(load(context, "vkBeginCommandBuffer")); + vkBindBufferMemory = reinterpret_cast(load(context, "vkBindBufferMemory")); + vkBindImageMemory = reinterpret_cast(load(context, "vkBindImageMemory")); + vkCmdBeginQuery = reinterpret_cast(load(context, "vkCmdBeginQuery")); + vkCmdBeginRenderPass = reinterpret_cast(load(context, "vkCmdBeginRenderPass")); + vkCmdBindDescriptorSets = reinterpret_cast(load(context, "vkCmdBindDescriptorSets")); + vkCmdBindIndexBuffer = reinterpret_cast(load(context, "vkCmdBindIndexBuffer")); + vkCmdBindPipeline = reinterpret_cast(load(context, "vkCmdBindPipeline")); + vkCmdBindVertexBuffers = reinterpret_cast(load(context, "vkCmdBindVertexBuffers")); + vkCmdBlitImage = reinterpret_cast(load(context, "vkCmdBlitImage")); + vkCmdClearAttachments = reinterpret_cast(load(context, "vkCmdClearAttachments")); + vkCmdClearColorImage = reinterpret_cast(load(context, "vkCmdClearColorImage")); + vkCmdClearDepthStencilImage = reinterpret_cast(load(context, "vkCmdClearDepthStencilImage")); + vkCmdCopyBuffer = reinterpret_cast(load(context, "vkCmdCopyBuffer")); + vkCmdCopyBufferToImage = reinterpret_cast(load(context, "vkCmdCopyBufferToImage")); + vkCmdCopyImage = reinterpret_cast(load(context, "vkCmdCopyImage")); + vkCmdCopyImageToBuffer = reinterpret_cast(load(context, "vkCmdCopyImageToBuffer")); + vkCmdCopyQueryPoolResults = reinterpret_cast(load(context, "vkCmdCopyQueryPoolResults")); + vkCmdDispatch = reinterpret_cast(load(context, "vkCmdDispatch")); + vkCmdDispatchIndirect = reinterpret_cast(load(context, "vkCmdDispatchIndirect")); + vkCmdDraw = reinterpret_cast(load(context, "vkCmdDraw")); + vkCmdDrawIndexed = reinterpret_cast(load(context, "vkCmdDrawIndexed")); + vkCmdDrawIndexedIndirect = reinterpret_cast(load(context, "vkCmdDrawIndexedIndirect")); + vkCmdDrawIndirect = reinterpret_cast(load(context, "vkCmdDrawIndirect")); + vkCmdEndQuery = reinterpret_cast(load(context, "vkCmdEndQuery")); + vkCmdEndRenderPass = reinterpret_cast(load(context, "vkCmdEndRenderPass")); + vkCmdExecuteCommands = reinterpret_cast(load(context, "vkCmdExecuteCommands")); + vkCmdFillBuffer = reinterpret_cast(load(context, "vkCmdFillBuffer")); + vkCmdNextSubpass = reinterpret_cast(load(context, "vkCmdNextSubpass")); + vkCmdPipelineBarrier = reinterpret_cast(load(context, "vkCmdPipelineBarrier")); + vkCmdPushConstants = reinterpret_cast(load(context, "vkCmdPushConstants")); + vkCmdResetEvent = reinterpret_cast(load(context, "vkCmdResetEvent")); + vkCmdResetQueryPool = reinterpret_cast(load(context, "vkCmdResetQueryPool")); + vkCmdResolveImage = reinterpret_cast(load(context, "vkCmdResolveImage")); + vkCmdSetBlendConstants = reinterpret_cast(load(context, "vkCmdSetBlendConstants")); + vkCmdSetDepthBias = reinterpret_cast(load(context, "vkCmdSetDepthBias")); + vkCmdSetDepthBounds = reinterpret_cast(load(context, "vkCmdSetDepthBounds")); + vkCmdSetEvent = reinterpret_cast(load(context, "vkCmdSetEvent")); + vkCmdSetLineWidth = reinterpret_cast(load(context, "vkCmdSetLineWidth")); + vkCmdSetScissor = reinterpret_cast(load(context, "vkCmdSetScissor")); + vkCmdSetStencilCompareMask = reinterpret_cast(load(context, "vkCmdSetStencilCompareMask")); + vkCmdSetStencilReference = reinterpret_cast(load(context, "vkCmdSetStencilReference")); + vkCmdSetStencilWriteMask = reinterpret_cast(load(context, "vkCmdSetStencilWriteMask")); + vkCmdSetViewport = reinterpret_cast(load(context, "vkCmdSetViewport")); + vkCmdUpdateBuffer = reinterpret_cast(load(context, "vkCmdUpdateBuffer")); + vkCmdWaitEvents = reinterpret_cast(load(context, "vkCmdWaitEvents")); + vkCmdWriteTimestamp = reinterpret_cast(load(context, "vkCmdWriteTimestamp")); + vkCreateBuffer = reinterpret_cast(load(context, "vkCreateBuffer")); + vkCreateBufferView = reinterpret_cast(load(context, "vkCreateBufferView")); + vkCreateCommandPool = reinterpret_cast(load(context, "vkCreateCommandPool")); + vkCreateComputePipelines = reinterpret_cast(load(context, "vkCreateComputePipelines")); + vkCreateDescriptorPool = reinterpret_cast(load(context, "vkCreateDescriptorPool")); + vkCreateDescriptorSetLayout = reinterpret_cast(load(context, "vkCreateDescriptorSetLayout")); + vkCreateEvent = reinterpret_cast(load(context, "vkCreateEvent")); + vkCreateFence = reinterpret_cast(load(context, "vkCreateFence")); + vkCreateFramebuffer = reinterpret_cast(load(context, "vkCreateFramebuffer")); + vkCreateGraphicsPipelines = reinterpret_cast(load(context, "vkCreateGraphicsPipelines")); + vkCreateImage = reinterpret_cast(load(context, "vkCreateImage")); + vkCreateImageView = reinterpret_cast(load(context, "vkCreateImageView")); + vkCreatePipelineCache = reinterpret_cast(load(context, "vkCreatePipelineCache")); + vkCreatePipelineLayout = reinterpret_cast(load(context, "vkCreatePipelineLayout")); + vkCreateQueryPool = reinterpret_cast(load(context, "vkCreateQueryPool")); + vkCreateRenderPass = reinterpret_cast(load(context, "vkCreateRenderPass")); + vkCreateSampler = reinterpret_cast(load(context, "vkCreateSampler")); + vkCreateSemaphore = reinterpret_cast(load(context, "vkCreateSemaphore")); + vkCreateShaderModule = reinterpret_cast(load(context, "vkCreateShaderModule")); + vkDestroyBuffer = reinterpret_cast(load(context, "vkDestroyBuffer")); + vkDestroyBufferView = reinterpret_cast(load(context, "vkDestroyBufferView")); + vkDestroyCommandPool = reinterpret_cast(load(context, "vkDestroyCommandPool")); + vkDestroyDescriptorPool = reinterpret_cast(load(context, "vkDestroyDescriptorPool")); + vkDestroyDescriptorSetLayout = reinterpret_cast(load(context, "vkDestroyDescriptorSetLayout")); + vkDestroyDevice = reinterpret_cast(load(context, "vkDestroyDevice")); + vkDestroyEvent = reinterpret_cast(load(context, "vkDestroyEvent")); + vkDestroyFence = reinterpret_cast(load(context, "vkDestroyFence")); + vkDestroyFramebuffer = reinterpret_cast(load(context, "vkDestroyFramebuffer")); + vkDestroyImage = reinterpret_cast(load(context, "vkDestroyImage")); + vkDestroyImageView = reinterpret_cast(load(context, "vkDestroyImageView")); + vkDestroyPipeline = reinterpret_cast(load(context, "vkDestroyPipeline")); + vkDestroyPipelineCache = reinterpret_cast(load(context, "vkDestroyPipelineCache")); + vkDestroyPipelineLayout = reinterpret_cast(load(context, "vkDestroyPipelineLayout")); + vkDestroyQueryPool = reinterpret_cast(load(context, "vkDestroyQueryPool")); + vkDestroyRenderPass = reinterpret_cast(load(context, "vkDestroyRenderPass")); + vkDestroySampler = reinterpret_cast(load(context, "vkDestroySampler")); + vkDestroySemaphore = reinterpret_cast(load(context, "vkDestroySemaphore")); + vkDestroyShaderModule = reinterpret_cast(load(context, "vkDestroyShaderModule")); + vkDeviceWaitIdle = reinterpret_cast(load(context, "vkDeviceWaitIdle")); + vkEndCommandBuffer = reinterpret_cast(load(context, "vkEndCommandBuffer")); + vkFlushMappedMemoryRanges = reinterpret_cast(load(context, "vkFlushMappedMemoryRanges")); + vkFreeCommandBuffers = reinterpret_cast(load(context, "vkFreeCommandBuffers")); + vkFreeDescriptorSets = reinterpret_cast(load(context, "vkFreeDescriptorSets")); + vkFreeMemory = reinterpret_cast(load(context, "vkFreeMemory")); + vkGetBufferMemoryRequirements = reinterpret_cast(load(context, "vkGetBufferMemoryRequirements")); + vkGetDeviceMemoryCommitment = reinterpret_cast(load(context, "vkGetDeviceMemoryCommitment")); + vkGetDeviceQueue = reinterpret_cast(load(context, "vkGetDeviceQueue")); + vkGetEventStatus = reinterpret_cast(load(context, "vkGetEventStatus")); + vkGetFenceStatus = reinterpret_cast(load(context, "vkGetFenceStatus")); + vkGetImageMemoryRequirements = reinterpret_cast(load(context, "vkGetImageMemoryRequirements")); + vkGetImageSparseMemoryRequirements = reinterpret_cast(load(context, "vkGetImageSparseMemoryRequirements")); + vkGetImageSubresourceLayout = reinterpret_cast(load(context, "vkGetImageSubresourceLayout")); + vkGetPipelineCacheData = reinterpret_cast(load(context, "vkGetPipelineCacheData")); + vkGetQueryPoolResults = reinterpret_cast(load(context, "vkGetQueryPoolResults")); + vkGetRenderAreaGranularity = reinterpret_cast(load(context, "vkGetRenderAreaGranularity")); + vkInvalidateMappedMemoryRanges = reinterpret_cast(load(context, "vkInvalidateMappedMemoryRanges")); + vkMapMemory = reinterpret_cast(load(context, "vkMapMemory")); + vkMergePipelineCaches = reinterpret_cast(load(context, "vkMergePipelineCaches")); + vkQueueBindSparse = reinterpret_cast(load(context, "vkQueueBindSparse")); + vkQueueSubmit = reinterpret_cast(load(context, "vkQueueSubmit")); + vkQueueWaitIdle = reinterpret_cast(load(context, "vkQueueWaitIdle")); + vkResetCommandBuffer = reinterpret_cast(load(context, "vkResetCommandBuffer")); + vkResetCommandPool = reinterpret_cast(load(context, "vkResetCommandPool")); + vkResetDescriptorPool = reinterpret_cast(load(context, "vkResetDescriptorPool")); + vkResetEvent = reinterpret_cast(load(context, "vkResetEvent")); + vkResetFences = reinterpret_cast(load(context, "vkResetFences")); + vkSetEvent = reinterpret_cast(load(context, "vkSetEvent")); + vkUnmapMemory = reinterpret_cast(load(context, "vkUnmapMemory")); + vkUpdateDescriptorSets = reinterpret_cast(load(context, "vkUpdateDescriptorSets")); + vkWaitForFences = reinterpret_cast(load(context, "vkWaitForFences")); + #endif + #ifdef VK_KHR_swapchain + vkAcquireNextImageKHR = reinterpret_cast(load(context, "vkAcquireNextImageKHR")); + vkCreateSwapchainKHR = reinterpret_cast(load(context, "vkCreateSwapchainKHR")); + vkDestroySwapchainKHR = reinterpret_cast(load(context, "vkDestroySwapchainKHR")); + vkGetSwapchainImagesKHR = reinterpret_cast(load(context, "vkGetSwapchainImagesKHR")); + vkQueuePresentKHR = reinterpret_cast(load(context, "vkQueuePresentKHR")); + #endif DebugLog("Vulkan loader : device functions loaded"); } VulkanLoader::~VulkanLoader() { - #if defined(MLX_PLAT_WINDOWS) - FreeLibrary((HMODULE)p_module); + #ifdef MLX_PLAT_WINDOWS + FreeLibrary(p_module); #else dlclose(p_module); #endif @@ -263,7 +299,7 @@ namespace mlx } } -#if defined(VK_VERSION_1_0) +#ifdef VK_VERSION_1_0 PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers; PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets; PFN_vkAllocateMemory vkAllocateMemory; @@ -401,18 +437,18 @@ namespace mlx PFN_vkUnmapMemory vkUnmapMemory; PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets; PFN_vkWaitForFences vkWaitForFences; -#endif /* defined(VK_VERSION_1_0) */ -#if defined(VK_KHR_swapchain) +#endif +#ifdef VK_KHR_swapchain PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR; PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR; PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR; PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR; PFN_vkQueuePresentKHR vkQueuePresentKHR; -#endif /* defined(VK_KHR_swapchain) */ -#if defined(VK_KHR_surface) +#endif +#ifdef VK_KHR_surface PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR; PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR; PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR; PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR; PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR; -#endif /* defined(VK_KHR_surface) */ +#endif diff --git a/runtime/Sources/Renderer/Vulkan/VulkanLoader.h b/runtime/Sources/Renderer/Vulkan/VulkanLoader.h index 73e073b..76ce045 100644 --- a/runtime/Sources/Renderer/Vulkan/VulkanLoader.h +++ b/runtime/Sources/Renderer/Vulkan/VulkanLoader.h @@ -23,6 +23,7 @@ namespace mlx public: VulkanLoader(); void LoadInstance(VkInstance instance); + void LoadDevice(VkDevice device); ~VulkanLoader(); private: