fixing vulkan loader, moving vulkan pfns to RenderCore

This commit is contained in:
2024-09-20 16:14:14 +02:00
parent f4e4672cc6
commit 092e5acd9b
22 changed files with 821 additions and 684 deletions

View File

@@ -47,6 +47,7 @@ namespace mlx
~Application();
private:
RenderCore m_render_core;
FpsManager m_fps;
Inputs m_in;
ImageRegistry m_image_registry;

View File

@@ -9,6 +9,8 @@
#include <cstdarg>
#include <iostream>
#include <vulkan/vulkan_core.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_vulkan.h>
@@ -81,6 +83,7 @@
#include <Utils/AntiX11.h>
#include <Utils/AntiWindows.h>
#define KVF_IMPL_VK_NO_PROTOTYPES
#ifdef DEBUG
#define KVF_ENABLE_VALIDATION_LAYERS
#endif

View File

@@ -51,7 +51,7 @@ namespace mlx
public:
inline void Init(std::uint32_t size, VkBufferUsageFlags additional_flags = 0) { GPUBuffer::Init(BufferType::LowDynamic, size, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | additional_flags, {}); }
void SetData(CPUBuffer data);
inline void Bind(VkCommandBuffer cmd) const noexcept { VkDeviceSize offset = 0; vkCmdBindVertexBuffers(cmd, 0, 1, &m_buffer, &offset); }
inline void Bind(VkCommandBuffer cmd) const noexcept { VkDeviceSize offset = 0; RenderCore::Get().vkCmdBindVertexBuffers(cmd, 0, 1, &m_buffer, &offset); }
};
class IndexBuffer : public GPUBuffer
@@ -59,7 +59,7 @@ namespace mlx
public:
inline void Init(std::uint32_t size, VkBufferUsageFlags additional_flags = 0) { GPUBuffer::Init(BufferType::LowDynamic, size, VK_BUFFER_USAGE_INDEX_BUFFER_BIT | additional_flags, {}); }
void SetData(CPUBuffer data);
inline void Bind(VkCommandBuffer cmd) const noexcept { vkCmdBindIndexBuffer(cmd, m_buffer, 0, VK_INDEX_TYPE_UINT32); }
inline void Bind(VkCommandBuffer cmd) const noexcept { RenderCore::Get().vkCmdBindIndexBuffer(cmd, m_buffer, 0, VK_INDEX_TYPE_UINT32); }
};
class UniformBuffer

View File

@@ -4,7 +4,6 @@
#include <Renderer/Enums.h>
#include <Renderer/RenderCore.h>
#include <Renderer/Pipelines/Shader.h>
#include <Renderer/Vulkan/VulkanPrototypes.h>
namespace mlx
{

View File

@@ -99,7 +99,7 @@ namespace mlx
kvfBeginCommandBuffer(cmd, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
TransitionLayout(VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, cmd);
kvfCopyBufferToImage(cmd, Image::Get(), staging_buffer.Get(), staging_buffer.GetOffset(), VK_IMAGE_ASPECT_COLOR_BIT, { width, height, 1 });
vkEndCommandBuffer(cmd);
RenderCore::Get().vkEndCommandBuffer(cmd);
VkFence fence = kvfCreateFence(RenderCore::Get().GetDevice());
kvfSubmitSingleTimeCommandBuffer(RenderCore::Get().GetDevice(), cmd, KVF_GRAPHICS_QUEUE, fence);
kvfDestroyFence(RenderCore::Get().GetDevice(), fence);

View File

@@ -1,8 +1,6 @@
#ifndef __MLX_PIPELINE__
#define __MLX_PIPELINE__
#include <Renderer/Vulkan/VulkanPrototypes.h>
namespace mlx
{
class Pipeline
@@ -10,7 +8,7 @@ namespace mlx
public:
Pipeline() = default;
inline virtual bool BindPipeline(VkCommandBuffer command_buffer) noexcept { vkCmdBindPipeline(command_buffer, GetPipelineBindPoint(), GetPipeline()); return true; }
inline virtual bool BindPipeline(VkCommandBuffer command_buffer) noexcept { RenderCore::Get().vkCmdBindPipeline(command_buffer, GetPipelineBindPoint(), GetPipeline()); return true; }
inline virtual void EndPipeline([[maybe_unused]] VkCommandBuffer command_buffer) noexcept {}
virtual VkPipeline GetPipeline() const = 0;

View File

@@ -1,21 +1,17 @@
#ifndef __MLX_RENDER_CORE__
#define __MLX_RENDER_CORE__
#include <Renderer/Vulkan/VulkanPrototypes.h>
#include <Renderer/Memory.h>
namespace mlx
{
constexpr const int MAX_FRAMES_IN_FLIGHT = 3;
class RenderCore : public Singleton<RenderCore>
class RenderCore
{
friend class Singleton<RenderCore>;
friend class Application;
public:
void Init() noexcept;
void Destroy() noexcept;
[[nodiscard]] MLX_FORCEINLINE VkInstance GetInstance() const noexcept { return m_instance; }
[[nodiscard]] MLX_FORCEINLINE VkInstance& GetInstanceRef() noexcept { return m_instance; }
[[nodiscard]] MLX_FORCEINLINE VkDevice GetDevice() const noexcept { return m_device; }
@@ -24,11 +20,27 @@ namespace mlx
inline void WaitDeviceIdle() const noexcept { vkDeviceWaitIdle(m_device); }
private:
RenderCore() = default;
~RenderCore() = default;
inline static bool IsInit() noexcept { return s_instance != nullptr; }
inline static RenderCore& Get() noexcept { return *s_instance; }
#define MLX_VULKAN_GLOBAL_FUNCTION(fn) PFN_##fn fn = nullptr;
#define MLX_VULKAN_INSTANCE_FUNCTION(fn) PFN_##fn fn = nullptr;
#define MLX_VULKAN_DEVICE_FUNCTION(fn) PFN_##fn fn = nullptr;
#include <Renderer/Vulkan/VulkanDefs.h>
#undef MLX_VULKAN_GLOBAL_FUNCTION
#undef MLX_VULKAN_INSTANCE_FUNCTION
#undef MLX_VULKAN_DEVICE_FUNCTION
private:
RenderCore();
void LoadKVFGlobalVulkanFunctionPointers() const noexcept;
void LoadKVFInstanceVulkanFunctionPointers() const noexcept;
void LoadKVFDeviceVulkanFunctionPointers() const noexcept;
~RenderCore();
private:
static RenderCore* s_instance;
GPUAllocator m_allocator;
VkInstance m_instance = VK_NULL_HANDLE;
VkDevice m_device = VK_NULL_HANDLE;

121
runtime/Includes/Renderer/Vulkan/VulkanDefs.h git.filemode.normal_file
View File

@@ -0,0 +1,121 @@
// No header guard
#ifdef VK_VERSION_1_0
#ifdef MLX_VULKAN_GLOBAL_FUNCTION
MLX_VULKAN_GLOBAL_FUNCTION(vkCreateInstance)
MLX_VULKAN_GLOBAL_FUNCTION(vkEnumerateInstanceExtensionProperties)
MLX_VULKAN_GLOBAL_FUNCTION(vkEnumerateInstanceLayerProperties)
MLX_VULKAN_GLOBAL_FUNCTION(vkGetInstanceProcAddr)
#endif
#ifdef MLX_VULKAN_INSTANCE_FUNCTION
MLX_VULKAN_INSTANCE_FUNCTION(vkCreateDevice)
MLX_VULKAN_INSTANCE_FUNCTION(vkDestroyInstance)
MLX_VULKAN_INSTANCE_FUNCTION(vkEnumerateDeviceExtensionProperties)
MLX_VULKAN_INSTANCE_FUNCTION(vkEnumeratePhysicalDevices)
MLX_VULKAN_INSTANCE_FUNCTION(vkGetDeviceProcAddr)
MLX_VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceFeatures)
MLX_VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceFormatProperties)
MLX_VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceImageFormatProperties)
MLX_VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceMemoryProperties)
MLX_VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceProperties)
MLX_VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceQueueFamilyProperties)
#endif
#ifdef MLX_VULKAN_DEVICE_FUNCTION
MLX_VULKAN_DEVICE_FUNCTION(vkAllocateCommandBuffers)
MLX_VULKAN_DEVICE_FUNCTION(vkAllocateDescriptorSets)
MLX_VULKAN_DEVICE_FUNCTION(vkAllocateMemory)
MLX_VULKAN_DEVICE_FUNCTION(vkBeginCommandBuffer)
MLX_VULKAN_DEVICE_FUNCTION(vkBindBufferMemory)
MLX_VULKAN_DEVICE_FUNCTION(vkBindImageMemory)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdBeginRenderPass)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdBindDescriptorSets)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdBindIndexBuffer)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdBindPipeline)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdBindVertexBuffers)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdClearAttachments)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdClearColorImage)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdClearDepthStencilImage)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdCopyBuffer)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdCopyBufferToImage)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdCopyImage)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdCopyImageToBuffer)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdDraw)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdDrawIndexed)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdEndRenderPass)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdPipelineBarrier)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdPushConstants)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdSetScissor)
MLX_VULKAN_DEVICE_FUNCTION(vkCmdSetViewport)
MLX_VULKAN_DEVICE_FUNCTION(vkCreateBuffer)
MLX_VULKAN_DEVICE_FUNCTION(vkCreateCommandPool)
MLX_VULKAN_DEVICE_FUNCTION(vkCreateDescriptorPool)
MLX_VULKAN_DEVICE_FUNCTION(vkCreateDescriptorSetLayout)
MLX_VULKAN_DEVICE_FUNCTION(vkCreateFence)
MLX_VULKAN_DEVICE_FUNCTION(vkCreateFramebuffer)
MLX_VULKAN_DEVICE_FUNCTION(vkCreateGraphicsPipelines)
MLX_VULKAN_DEVICE_FUNCTION(vkCreateImage)
MLX_VULKAN_DEVICE_FUNCTION(vkCreateImageView)
MLX_VULKAN_DEVICE_FUNCTION(vkCreatePipelineLayout)
MLX_VULKAN_DEVICE_FUNCTION(vkCreateRenderPass)
MLX_VULKAN_DEVICE_FUNCTION(vkCreateSampler)
MLX_VULKAN_DEVICE_FUNCTION(vkCreateSemaphore)
MLX_VULKAN_DEVICE_FUNCTION(vkCreateShaderModule)
MLX_VULKAN_DEVICE_FUNCTION(vkDestroyBuffer)
MLX_VULKAN_DEVICE_FUNCTION(vkDestroyCommandPool)
MLX_VULKAN_DEVICE_FUNCTION(vkDestroyDescriptorPool)
MLX_VULKAN_DEVICE_FUNCTION(vkDestroyDescriptorSetLayout)
MLX_VULKAN_DEVICE_FUNCTION(vkDestroyDevice)
MLX_VULKAN_DEVICE_FUNCTION(vkDestroyFence)
MLX_VULKAN_DEVICE_FUNCTION(vkDestroyFramebuffer)
MLX_VULKAN_DEVICE_FUNCTION(vkDestroyImage)
MLX_VULKAN_DEVICE_FUNCTION(vkDestroyImageView)
MLX_VULKAN_DEVICE_FUNCTION(vkDestroyPipeline)
MLX_VULKAN_DEVICE_FUNCTION(vkDestroyPipelineLayout)
MLX_VULKAN_DEVICE_FUNCTION(vkDestroyRenderPass)
MLX_VULKAN_DEVICE_FUNCTION(vkDestroySampler)
MLX_VULKAN_DEVICE_FUNCTION(vkDestroySemaphore)
MLX_VULKAN_DEVICE_FUNCTION(vkDestroyShaderModule)
MLX_VULKAN_DEVICE_FUNCTION(vkDeviceWaitIdle)
MLX_VULKAN_DEVICE_FUNCTION(vkEndCommandBuffer)
MLX_VULKAN_DEVICE_FUNCTION(vkFlushMappedMemoryRanges)
MLX_VULKAN_DEVICE_FUNCTION(vkFreeCommandBuffers)
MLX_VULKAN_DEVICE_FUNCTION(vkFreeMemory)
MLX_VULKAN_DEVICE_FUNCTION(vkGetBufferMemoryRequirements)
MLX_VULKAN_DEVICE_FUNCTION(vkGetDeviceMemoryCommitment)
MLX_VULKAN_DEVICE_FUNCTION(vkGetDeviceQueue)
MLX_VULKAN_DEVICE_FUNCTION(vkGetFenceStatus)
MLX_VULKAN_DEVICE_FUNCTION(vkGetImageMemoryRequirements)
MLX_VULKAN_DEVICE_FUNCTION(vkGetImageSubresourceLayout)
MLX_VULKAN_DEVICE_FUNCTION(vkInvalidateMappedMemoryRanges)
MLX_VULKAN_DEVICE_FUNCTION(vkMapMemory)
MLX_VULKAN_DEVICE_FUNCTION(vkQueueSubmit)
MLX_VULKAN_DEVICE_FUNCTION(vkQueueWaitIdle)
MLX_VULKAN_DEVICE_FUNCTION(vkResetCommandBuffer)
MLX_VULKAN_DEVICE_FUNCTION(vkResetDescriptorPool)
MLX_VULKAN_DEVICE_FUNCTION(vkResetEvent)
MLX_VULKAN_DEVICE_FUNCTION(vkResetFences)
MLX_VULKAN_DEVICE_FUNCTION(vkUnmapMemory)
MLX_VULKAN_DEVICE_FUNCTION(vkUpdateDescriptorSets)
MLX_VULKAN_DEVICE_FUNCTION(vkWaitForFences)
#endif
#endif
#ifdef VK_KHR_swapchain
#ifdef MLX_VULKAN_DEVICE_FUNCTION
MLX_VULKAN_DEVICE_FUNCTION(vkAcquireNextImageKHR)
MLX_VULKAN_DEVICE_FUNCTION(vkCreateSwapchainKHR)
MLX_VULKAN_DEVICE_FUNCTION(vkDestroySwapchainKHR)
MLX_VULKAN_DEVICE_FUNCTION(vkGetSwapchainImagesKHR)
MLX_VULKAN_DEVICE_FUNCTION(vkQueuePresentKHR)
#endif
#endif
#ifdef VK_KHR_surface
#ifdef MLX_VULKAN_INSTANCE_FUNCTION
MLX_VULKAN_INSTANCE_FUNCTION(vkDestroySurfaceKHR)
MLX_VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceCapabilitiesKHR)
MLX_VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceFormatsKHR)
MLX_VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfacePresentModesKHR)
MLX_VULKAN_INSTANCE_FUNCTION(vkGetPhysicalDeviceSurfaceSupportKHR)
#endif
#endif

View File

@@ -1,170 +0,0 @@
#ifndef __MLX_VK_PROTOTYPES__
#define __MLX_VK_PROTOTYPES__
#if defined(VULKAN_H_) && !defined(VK_NO_PROTOTYPES)
#error "define VK_NO_PROTOTYPES needed"
#endif
#ifndef VK_NO_PROTOTYPES
#define VK_NO_PROTOTYPES
#endif
#ifndef VULKAN_H_
#include <vulkan/vulkan.h>
#endif
#ifdef VK_VERSION_1_0
extern PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers;
extern PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets;
extern PFN_vkAllocateMemory vkAllocateMemory;
extern PFN_vkBeginCommandBuffer vkBeginCommandBuffer;
extern PFN_vkBindBufferMemory vkBindBufferMemory;
extern PFN_vkBindImageMemory vkBindImageMemory;
extern PFN_vkCmdBeginQuery vkCmdBeginQuery;
extern PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass;
extern PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets;
extern PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer;
extern PFN_vkCmdBindPipeline vkCmdBindPipeline;
extern PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers;
extern PFN_vkCmdBlitImage vkCmdBlitImage;
extern PFN_vkCmdClearAttachments vkCmdClearAttachments;
extern PFN_vkCmdClearColorImage vkCmdClearColorImage;
extern PFN_vkCmdClearDepthStencilImage vkCmdClearDepthStencilImage;
extern PFN_vkCmdCopyBuffer vkCmdCopyBuffer;
extern PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage;
extern PFN_vkCmdCopyImage vkCmdCopyImage;
extern PFN_vkCmdCopyImageToBuffer vkCmdCopyImageToBuffer;
extern PFN_vkCmdCopyQueryPoolResults vkCmdCopyQueryPoolResults;
extern PFN_vkCmdDispatch vkCmdDispatch;
extern PFN_vkCmdDispatchIndirect vkCmdDispatchIndirect;
extern PFN_vkCmdDraw vkCmdDraw;
extern PFN_vkCmdDrawIndexed vkCmdDrawIndexed;
extern PFN_vkCmdDrawIndexedIndirect vkCmdDrawIndexedIndirect;
extern PFN_vkCmdDrawIndirect vkCmdDrawIndirect;
extern PFN_vkCmdEndQuery vkCmdEndQuery;
extern PFN_vkCmdEndRenderPass vkCmdEndRenderPass;
extern PFN_vkCmdExecuteCommands vkCmdExecuteCommands;
extern PFN_vkCmdFillBuffer vkCmdFillBuffer;
extern PFN_vkCmdNextSubpass vkCmdNextSubpass;
extern PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier;
extern PFN_vkCmdPushConstants vkCmdPushConstants;
extern PFN_vkCmdResetEvent vkCmdResetEvent;
extern PFN_vkCmdResetQueryPool vkCmdResetQueryPool;
extern PFN_vkCmdResolveImage vkCmdResolveImage;
extern PFN_vkCmdSetBlendConstants vkCmdSetBlendConstants;
extern PFN_vkCmdSetDepthBias vkCmdSetDepthBias;
extern PFN_vkCmdSetDepthBounds vkCmdSetDepthBounds;
extern PFN_vkCmdSetEvent vkCmdSetEvent;
extern PFN_vkCmdSetLineWidth vkCmdSetLineWidth;
extern PFN_vkCmdSetScissor vkCmdSetScissor;
extern PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask;
extern PFN_vkCmdSetStencilReference vkCmdSetStencilReference;
extern PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask;
extern PFN_vkCmdSetViewport vkCmdSetViewport;
extern PFN_vkCmdUpdateBuffer vkCmdUpdateBuffer;
extern PFN_vkCmdWaitEvents vkCmdWaitEvents;
extern PFN_vkCmdWriteTimestamp vkCmdWriteTimestamp;
extern PFN_vkCreateBuffer vkCreateBuffer;
extern PFN_vkCreateBufferView vkCreateBufferView;
extern PFN_vkCreateCommandPool vkCreateCommandPool;
extern PFN_vkCreateComputePipelines vkCreateComputePipelines;
extern PFN_vkCreateDescriptorPool vkCreateDescriptorPool;
extern PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout;
extern PFN_vkCreateDevice vkCreateDevice;
extern PFN_vkCreateEvent vkCreateEvent;
extern PFN_vkCreateFence vkCreateFence;
extern PFN_vkCreateFramebuffer vkCreateFramebuffer;
extern PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines;
extern PFN_vkCreateImage vkCreateImage;
extern PFN_vkCreateImageView vkCreateImageView;
extern PFN_vkCreateInstance vkCreateInstance;
extern PFN_vkCreatePipelineCache vkCreatePipelineCache;
extern PFN_vkCreatePipelineLayout vkCreatePipelineLayout;
extern PFN_vkCreateQueryPool vkCreateQueryPool;
extern PFN_vkCreateRenderPass vkCreateRenderPass;
extern PFN_vkCreateSampler vkCreateSampler;
extern PFN_vkCreateSemaphore vkCreateSemaphore;
extern PFN_vkCreateShaderModule vkCreateShaderModule;
extern PFN_vkDestroyBuffer vkDestroyBuffer;
extern PFN_vkDestroyBufferView vkDestroyBufferView;
extern PFN_vkDestroyCommandPool vkDestroyCommandPool;
extern PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool;
extern PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout;
extern PFN_vkDestroyDevice vkDestroyDevice;
extern PFN_vkDestroyEvent vkDestroyEvent;
extern PFN_vkDestroyFence vkDestroyFence;
extern PFN_vkDestroyFramebuffer vkDestroyFramebuffer;
extern PFN_vkDestroyImage vkDestroyImage;
extern PFN_vkDestroyImageView vkDestroyImageView;
extern PFN_vkDestroyInstance vkDestroyInstance;
extern PFN_vkDestroyPipeline vkDestroyPipeline;
extern PFN_vkDestroyPipelineCache vkDestroyPipelineCache;
extern PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout;
extern PFN_vkDestroyQueryPool vkDestroyQueryPool;
extern PFN_vkDestroyRenderPass vkDestroyRenderPass;
extern PFN_vkDestroySampler vkDestroySampler;
extern PFN_vkDestroySemaphore vkDestroySemaphore;
extern PFN_vkDestroyShaderModule vkDestroyShaderModule;
extern PFN_vkDeviceWaitIdle vkDeviceWaitIdle;
extern PFN_vkEndCommandBuffer vkEndCommandBuffer;
extern PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties;
extern PFN_vkEnumerateDeviceLayerProperties vkEnumerateDeviceLayerProperties;
extern PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
extern PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties;
extern PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices;
extern PFN_vkFlushMappedMemoryRanges vkFlushMappedMemoryRanges;
extern PFN_vkFreeCommandBuffers vkFreeCommandBuffers;
extern PFN_vkFreeDescriptorSets vkFreeDescriptorSets;
extern PFN_vkFreeMemory vkFreeMemory;
extern PFN_vkGetBufferMemoryRequirements vkGetBufferMemoryRequirements;
extern PFN_vkGetDeviceMemoryCommitment vkGetDeviceMemoryCommitment;
extern PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr;
extern PFN_vkGetDeviceQueue vkGetDeviceQueue;
extern PFN_vkGetEventStatus vkGetEventStatus;
extern PFN_vkGetFenceStatus vkGetFenceStatus;
extern PFN_vkGetImageMemoryRequirements vkGetImageMemoryRequirements;
extern PFN_vkGetImageSparseMemoryRequirements vkGetImageSparseMemoryRequirements;
extern PFN_vkGetImageSubresourceLayout vkGetImageSubresourceLayout;
extern PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
extern PFN_vkGetPhysicalDeviceFeatures vkGetPhysicalDeviceFeatures;
extern PFN_vkGetPhysicalDeviceFormatProperties vkGetPhysicalDeviceFormatProperties;
extern PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties;
extern PFN_vkGetPhysicalDeviceMemoryProperties vkGetPhysicalDeviceMemoryProperties;
extern PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties;
extern PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties;
extern PFN_vkGetPhysicalDeviceSparseImageFormatProperties vkGetPhysicalDeviceSparseImageFormatProperties;
extern PFN_vkGetPipelineCacheData vkGetPipelineCacheData;
extern PFN_vkGetQueryPoolResults vkGetQueryPoolResults;
extern PFN_vkGetRenderAreaGranularity vkGetRenderAreaGranularity;
extern PFN_vkInvalidateMappedMemoryRanges vkInvalidateMappedMemoryRanges;
extern PFN_vkMapMemory vkMapMemory;
extern PFN_vkMergePipelineCaches vkMergePipelineCaches;
extern PFN_vkQueueBindSparse vkQueueBindSparse;
extern PFN_vkQueueSubmit vkQueueSubmit;
extern PFN_vkQueueWaitIdle vkQueueWaitIdle;
extern PFN_vkResetCommandBuffer vkResetCommandBuffer;
extern PFN_vkResetCommandPool vkResetCommandPool;
extern PFN_vkResetDescriptorPool vkResetDescriptorPool;
extern PFN_vkResetEvent vkResetEvent;
extern PFN_vkResetFences vkResetFences;
extern PFN_vkSetEvent vkSetEvent;
extern PFN_vkUnmapMemory vkUnmapMemory;
extern PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets;
extern PFN_vkWaitForFences vkWaitForFences;
#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
#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
#endif