public import vulkan_includes; import vulkan_util; import vulkan : Vulkan, VULKAN_LIBS; // Global Functions PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr = null; PFN_vkCreateInstance vkCreateInstance = null; PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties = null; // Instance Functions PFN_vkEnumeratePhysicalDevices vkEnumeratePhysicalDevices = null; PFN_vkCreateDevice vkCreateDevice = null; PFN_vkGetPhysicalDeviceQueueFamilyProperties vkGetPhysicalDeviceQueueFamilyProperties = null; PFN_vkGetPhysicalDeviceSurfaceSupportKHR vkGetPhysicalDeviceSurfaceSupportKHR = null; PFN_vkGetPhysicalDeviceProperties vkGetPhysicalDeviceProperties = null; PFN_vkGetPhysicalDeviceFeatures2 vkGetPhysicalDeviceFeatures2 = null; PFN_vkEnumerateDeviceExtensionProperties vkEnumerateDeviceExtensionProperties = null; PFN_vkGetPhysicalDeviceSurfacePresentModesKHR vkGetPhysicalDeviceSurfacePresentModesKHR = null; PFN_vkGetPhysicalDeviceSurfaceFormatsKHR vkGetPhysicalDeviceSurfaceFormatsKHR = null; PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR vkGetPhysicalDeviceSurfaceCapabilitiesKHR = null; PFN_vkGetPhysicalDeviceImageFormatProperties vkGetPhysicalDeviceImageFormatProperties = null; PFN_vkGetDeviceProcAddr vkGetDeviceProcAddr = null; PFN_vkDestroyInstance vkDestroyInstance = null; PFN_vkDestroySurfaceKHR vkDestroySurfaceKHR = null; debug { PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT = null; PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT = null; } // Platform Functions version(linux) { PFN_vkCreateXcbSurfaceKHR vkCreateXcbSurfaceKHR = null; }; version(Windows) { PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR = null; }; version(AMD_GPU) { debug { PFN_vkGetShaderInfoAMD vkGetShaderInfoAMD = null; } } // Device Functions PFN_vkCreateSwapchainKHR vkCreateSwapchainKHR = null; PFN_vkCmdBeginRenderPass vkCmdBeginRenderPass = null; PFN_vkCmdEndRenderPass vkCmdEndRenderPass = null; PFN_vkCreateFramebuffer vkCreateFramebuffer = null; PFN_vkDestroyFramebuffer vkDestroyFramebuffer = null; PFN_vkCreateRenderPass vkCreateRenderPass = null; PFN_vkDestroyRenderPass vkDestroyRenderPass = null; PFN_vkCreateImage vkCreateImage = null; PFN_vkCreateImageView vkCreateImageView = null; PFN_vkCreateBufferView vkCreateBufferView = null; PFN_vkGetSwapchainImagesKHR vkGetSwapchainImagesKHR = null; PFN_vkGetSwapchainStatusKHR vkGetSwapchainStatusKHR = null; PFN_vkGetDeviceQueue vkGetDeviceQueue = null; PFN_vkCreateSemaphore vkCreateSemaphore = null; PFN_vkAllocateCommandBuffers vkAllocateCommandBuffers = null; PFN_vkCreateCommandPool vkCreateCommandPool = null; PFN_vkCreateFence vkCreateFence = null; PFN_vkCreateDescriptorPool vkCreateDescriptorPool = null; PFN_vkCreateDescriptorSetLayout vkCreateDescriptorSetLayout = null; PFN_vkAllocateDescriptorSets vkAllocateDescriptorSets = null; PFN_vkCreatePipelineLayout vkCreatePipelineLayout = null; PFN_vkResetDescriptorPool vkResetDescriptorPool = null; PFN_vkCreateShaderModule vkCreateShaderModule = null; PFN_vkCreateGraphicsPipelines vkCreateGraphicsPipelines = null; PFN_vkCreateComputePipelines vkCreateComputePipelines = null; PFN_vkUpdateDescriptorSets vkUpdateDescriptorSets = null; PFN_vkDestroyDevice vkDestroyDevice = null; PFN_vkDestroyDescriptorPool vkDestroyDescriptorPool = null; PFN_vkDestroySwapchainKHR vkDestroySwapchainKHR = null; PFN_vkQueueSubmit2 vkQueueSubmit2 = null; PFN_vkDestroyImage vkDestroyImage = null; PFN_vkCmdBlitImage vkCmdBlitImage = null; PFN_vkDestroyImageView vkDestroyImageView = null; PFN_vkDestroyCommandPool vkDestroyCommandPool = null; PFN_vkDestroySemaphore vkDestroySemaphore = null; PFN_vkDestroyFence vkDestroyFence = null; PFN_vkDestroyPipelineLayout vkDestroyPipelineLayout = null; PFN_vkCmdPipelineBarrier vkCmdPipelineBarrier = null; PFN_vkCmdPipelineBarrier2 vkCmdPipelineBarrier2 = null; PFN_vkDestroyPipeline vkDestroyPipeline = null; PFN_vkWaitForFences vkWaitForFences = null; PFN_vkBeginCommandBuffer vkBeginCommandBuffer = null; PFN_vkEndCommandBuffer vkEndCommandBuffer = null; PFN_vkAcquireNextImageKHR vkAcquireNextImageKHR = null; PFN_vkCmdBindPipeline vkCmdBindPipeline = null; PFN_vkCmdBindDescriptorSets vkCmdBindDescriptorSets = null; PFN_vkCmdDispatch vkCmdDispatch = null; PFN_vkCmdSetViewport vkCmdSetViewport = null; PFN_vkCmdSetScissor vkCmdSetScissor = null; PFN_vkCmdPushConstants vkCmdPushConstants = null; PFN_vkCmdBindIndexBuffer vkCmdBindIndexBuffer = null; PFN_vkCmdBindVertexBuffers vkCmdBindVertexBuffers = null; PFN_vkCmdDrawIndexed vkCmdDrawIndexed = null; PFN_vkCmdCopyBufferToImage vkCmdCopyBufferToImage = null; PFN_vkCmdCopyBuffer vkCmdCopyBuffer = null; PFN_vkResetFences vkResetFences = null; PFN_vkResetCommandBuffer vkResetCommandBuffer = null; PFN_vkFreeCommandBuffers vkFreeCommandBuffers = null; PFN_vkDestroyDescriptorSetLayout vkDestroyDescriptorSetLayout = null; PFN_vkDestroyShaderModule vkDestroyShaderModule = null; PFN_vkQueuePresentKHR vkQueuePresentKHR = null; PFN_vkCmdDraw vkCmdDraw = null; PFN_vkDeviceWaitIdle vkDeviceWaitIdle = null; PFN_vkCmdClearColorImage vkCmdClearColorImage = null; PFN_vkCreateSampler vkCreateSampler = null; PFN_vkDestroySampler vkDestroySampler = null; PFN_vkGetBufferDeviceAddress vkGetBufferDeviceAddress = null; PFN_vkWaitSemaphores vkWaitSemaphores = null; PFN_vkQueueWaitIdle vkQueueWaitIdle = null; bool LoadGlobalFunctions() { Library lib; Function fn; foreach(name; VULKAN_LIBS) { lib = LoadLibrary(name); if(lib.ptr) { fn = LoadFunction(lib, "vkGetInstanceProcAddr"); vkGetInstanceProcAddr = cast(PFN_vkGetInstanceProcAddr)fn.ptr; } } if(fn.ptr) { vkGetInstanceProcAddr = cast(PFN_vkGetInstanceProcAddr)vkGetInstanceProcAddr(null, "vkGetInstanceProcAddr"); assert(vkGetInstanceProcAddr != null, "LoadGlobalFunctions failure: Unable to load vkGetInstanceProcAddr"); vkCreateInstance = cast(PFN_vkCreateInstance)vkGetInstanceProcAddr(null, "vkCreateInstance"); assert(vkCreateInstance != null, "LoadGlobalFunctions failure: Unable to load VkCreateInstance"); vkEnumerateInstanceLayerProperties = cast(PFN_vkEnumerateInstanceLayerProperties)vkGetInstanceProcAddr(null, "vkEnumerateInstanceLayerProperties"); assert(vkEnumerateInstanceLayerProperties != null, "LoadGlobalFunctions failure: Unable to load vkEnumerateInstanceLayerProperties"); } return fn.ptr != null; } void LoadDeviceFunctions(Vulkan* vk) { vkCreateSwapchainKHR = cast(PFN_vkCreateSwapchainKHR)vkGetDeviceProcAddr(vk.device, "vkCreateSwapchainKHR"); vkCmdBeginRenderPass = cast(PFN_vkCmdBeginRenderPass)vkGetDeviceProcAddr(vk.device, "vkCmdBeginRenderPass"); vkCmdEndRenderPass = cast(PFN_vkCmdEndRenderPass)vkGetDeviceProcAddr(vk.device, "vkCmdEndRenderPass"); vkCreateFramebuffer = cast(PFN_vkCreateFramebuffer)vkGetDeviceProcAddr(vk.device, "vkCreateFramebuffer"); vkDestroyFramebuffer = cast(PFN_vkDestroyFramebuffer)vkGetDeviceProcAddr(vk.device, "vkDestroyFramebuffer"); vkCreateRenderPass = cast(PFN_vkCreateRenderPass)vkGetDeviceProcAddr(vk.device, "vkCreateRenderPass"); vkDestroyRenderPass = cast(PFN_vkDestroyRenderPass)vkGetDeviceProcAddr(vk.device, "vkDestroyRenderPass"); vkCreateImage = cast(PFN_vkCreateImage)vkGetDeviceProcAddr(vk.device, "vkCreateImage"); vkCreateImageView = cast(PFN_vkCreateImageView)vkGetDeviceProcAddr(vk.device, "vkCreateImageView"); vkQueueSubmit2 = cast(PFN_vkQueueSubmit2KHR)vkGetDeviceProcAddr(vk.device, "vkQueueSubmit2KHR"); vkCreateBufferView = cast(PFN_vkCreateBufferView)vkGetDeviceProcAddr(vk.device, "vkCreateBufferView"); vkGetSwapchainImagesKHR = cast(PFN_vkGetSwapchainImagesKHR)vkGetDeviceProcAddr(vk.device, "vkGetSwapchainImagesKHR"); vkGetSwapchainStatusKHR = cast(PFN_vkGetSwapchainStatusKHR)vkGetDeviceProcAddr(vk.device, "vkGetSwapchainStatusKHR"); vkGetDeviceQueue = cast(PFN_vkGetDeviceQueue)vkGetDeviceProcAddr(vk.device, "vkGetDeviceQueue"); vkCreateSemaphore = cast(PFN_vkCreateSemaphore)vkGetDeviceProcAddr(vk.device, "vkCreateSemaphore"); vkAllocateCommandBuffers = cast(PFN_vkAllocateCommandBuffers)vkGetDeviceProcAddr(vk.device, "vkAllocateCommandBuffers"); vkCreateCommandPool = cast(PFN_vkCreateCommandPool)vkGetDeviceProcAddr(vk.device, "vkCreateCommandPool"); vkCmdPipelineBarrier = cast(PFN_vkCmdPipelineBarrier)vkGetDeviceProcAddr(vk.device, "vkCmdPipelineBarrier"); vkCmdPipelineBarrier2 = cast(PFN_vkCmdPipelineBarrier2KHR)vkGetDeviceProcAddr(vk.device, "vkCmdPipelineBarrier2KHR"); vkCreateFence = cast(PFN_vkCreateFence)vkGetDeviceProcAddr(vk.device, "vkCreateFence"); vkCreateDescriptorPool = cast(PFN_vkCreateDescriptorPool)vkGetDeviceProcAddr(vk.device, "vkCreateDescriptorPool"); vkCreateDescriptorSetLayout = cast(PFN_vkCreateDescriptorSetLayout)vkGetDeviceProcAddr(vk.device, "vkCreateDescriptorSetLayout"); vkAllocateDescriptorSets = cast(PFN_vkAllocateDescriptorSets)vkGetDeviceProcAddr(vk.device, "vkAllocateDescriptorSets"); vkCreatePipelineLayout = cast(PFN_vkCreatePipelineLayout)vkGetDeviceProcAddr(vk.device, "vkCreatePipelineLayout"); vkResetDescriptorPool = cast(PFN_vkResetDescriptorPool)vkGetDeviceProcAddr(vk.device, "vkResetDescriptorPool"); vkCreateShaderModule = cast(PFN_vkCreateShaderModule)vkGetDeviceProcAddr(vk.device, "vkCreateShaderModule"); vkCreateGraphicsPipelines = cast(PFN_vkCreateGraphicsPipelines)vkGetDeviceProcAddr(vk.device, "vkCreateGraphicsPipelines"); vkCreateComputePipelines = cast(PFN_vkCreateComputePipelines)vkGetDeviceProcAddr(vk.device, "vkCreateComputePipelines"); vkUpdateDescriptorSets = cast(PFN_vkUpdateDescriptorSets)vkGetDeviceProcAddr(vk.device, "vkUpdateDescriptorSets"); vkDestroyDevice = cast(PFN_vkDestroyDevice)vkGetDeviceProcAddr(vk.device, "vkDestroyDevice"); vkDestroyDescriptorPool = cast(PFN_vkDestroyDescriptorPool)vkGetDeviceProcAddr(vk.device, "vkDestroyDescriptorPool"); vkDestroySwapchainKHR = cast(PFN_vkDestroySwapchainKHR)vkGetDeviceProcAddr(vk.device, "vkDestroySwapchainKHR"); vkDestroyImage = cast(PFN_vkDestroyImage)vkGetDeviceProcAddr(vk.device, "vkDestroyImage"); vkDestroyImageView = cast(PFN_vkDestroyImageView)vkGetDeviceProcAddr(vk.device, "vkDestroyImageView"); vkDestroyCommandPool = cast(PFN_vkDestroyCommandPool)vkGetDeviceProcAddr(vk.device, "vkDestroyCommandPool"); vkDestroySemaphore = cast(PFN_vkDestroySemaphore)vkGetDeviceProcAddr(vk.device, "vkDestroySemaphore"); vkDestroyFence = cast(PFN_vkDestroyFence)vkGetDeviceProcAddr(vk.device, "vkDestroyFence"); vkDestroyPipelineLayout = cast(PFN_vkDestroyPipelineLayout)vkGetDeviceProcAddr(vk.device, "vkDestroyPipelineLayout"); vkDestroyPipeline = cast(PFN_vkDestroyPipeline)vkGetDeviceProcAddr(vk.device, "vkDestroyPipeline"); vkWaitForFences = cast(PFN_vkWaitForFences)vkGetDeviceProcAddr(vk.device, "vkWaitForFences"); vkBeginCommandBuffer = cast(PFN_vkBeginCommandBuffer)vkGetDeviceProcAddr(vk.device, "vkBeginCommandBuffer"); vkEndCommandBuffer = cast(PFN_vkEndCommandBuffer)vkGetDeviceProcAddr(vk.device, "vkEndCommandBuffer"); vkAcquireNextImageKHR = cast(PFN_vkAcquireNextImageKHR)vkGetDeviceProcAddr(vk.device, "vkAcquireNextImageKHR"); vkCmdBindPipeline = cast(PFN_vkCmdBindPipeline)vkGetDeviceProcAddr(vk.device, "vkCmdBindPipeline"); vkCmdBindDescriptorSets = cast(PFN_vkCmdBindDescriptorSets)vkGetDeviceProcAddr(vk.device, "vkCmdBindDescriptorSets"); vkCmdDispatch = cast(PFN_vkCmdDispatch)vkGetDeviceProcAddr(vk.device, "vkCmdDispatch"); vkCmdSetViewport = cast(PFN_vkCmdSetViewport)vkGetDeviceProcAddr(vk.device, "vkCmdSetViewport"); vkCmdSetScissor = cast(PFN_vkCmdSetScissor)vkGetDeviceProcAddr(vk.device, "vkCmdSetScissor"); vkCmdPushConstants = cast(PFN_vkCmdPushConstants)vkGetDeviceProcAddr(vk.device, "vkCmdPushConstants"); vkCmdBindIndexBuffer = cast(PFN_vkCmdBindIndexBuffer)vkGetDeviceProcAddr(vk.device, "vkCmdBindIndexBuffer"); vkCmdBindVertexBuffers = cast(PFN_vkCmdBindVertexBuffers)vkGetDeviceProcAddr(vk.device, "vkCmdBindVertexBuffers"); vkCmdDrawIndexed = cast(PFN_vkCmdDrawIndexed)vkGetDeviceProcAddr(vk.device, "vkCmdDrawIndexed"); vkCmdBlitImage = cast(PFN_vkCmdBlitImage)vkGetDeviceProcAddr(vk.device, "vkCmdBlitImage"); vkCmdCopyBufferToImage = cast(PFN_vkCmdCopyBufferToImage)vkGetDeviceProcAddr(vk.device, "vkCmdCopyBufferToImage"); vkCmdCopyBuffer = cast(PFN_vkCmdCopyBuffer)vkGetDeviceProcAddr(vk.device, "vkCmdCopyBuffer"); vkResetFences = cast(PFN_vkResetFences)vkGetDeviceProcAddr(vk.device, "vkResetFences"); vkResetCommandBuffer = cast(PFN_vkResetCommandBuffer)vkGetDeviceProcAddr(vk.device, "vkResetCommandBuffer"); vkFreeCommandBuffers = cast(PFN_vkFreeCommandBuffers)vkGetDeviceProcAddr(vk.device, "vkFreeCommandBuffers"); vkDestroyDescriptorSetLayout = cast(PFN_vkDestroyDescriptorSetLayout)vkGetDeviceProcAddr(vk.device, "vkDestroyDescriptorSetLayout"); vkDestroyShaderModule = cast(PFN_vkDestroyShaderModule)vkGetDeviceProcAddr(vk.device, "vkDestroyShaderModule"); vkQueuePresentKHR = cast(PFN_vkQueuePresentKHR)vkGetDeviceProcAddr(vk.device, "vkQueuePresentKHR"); vkCmdDraw = cast(PFN_vkCmdDraw)vkGetDeviceProcAddr(vk.device, "vkCmdDraw"); vkDeviceWaitIdle = cast(PFN_vkDeviceWaitIdle)vkGetDeviceProcAddr(vk.device, "vkDeviceWaitIdle"); vkCmdClearColorImage = cast(PFN_vkCmdClearColorImage)vkGetDeviceProcAddr(vk.device, "vkCmdClearColorImage"); vkCreateSampler = cast(PFN_vkCreateSampler)vkGetDeviceProcAddr(vk.device, "vkCreateSampler"); vkDestroySampler = cast(PFN_vkDestroySampler)vkGetDeviceProcAddr(vk.device, "vkDestroySampler"); vkGetBufferDeviceAddress = cast(PFN_vkGetBufferDeviceAddress)vkGetDeviceProcAddr(vk.device, "vkGetBufferDeviceAddress"); vkWaitSemaphores = cast(PFN_vkWaitSemaphores)vkGetDeviceProcAddr(vk.device, "vkWaitSemaphores"); vkQueueWaitIdle = cast(PFN_vkQueueWaitIdle)vkGetDeviceProcAddr(vk.device, "vkQueueWaitIdle"); version(AMD_GPU) { debug { vkGetShaderInfoAMD = cast(PFN_vkGetShaderInfoAMD)vkGetDeviceProcAddr(vk.device, "vkGetShaderInfoAMD"); assert(vkGetShaderInfoAMD != null, "vkGetShaderInfoAMD pointer is null"); } } assert(vkCreateSwapchainKHR != null, "LoadDeviceFunctions failure: function pointer is null"); } void LoadInstanceFunctions(Vulkan* vk) { vkEnumeratePhysicalDevices = cast(PFN_vkEnumeratePhysicalDevices)vkGetInstanceProcAddr(vk.instance, "vkEnumeratePhysicalDevices"); vkDestroySurfaceKHR = cast(PFN_vkDestroySurfaceKHR)vkGetInstanceProcAddr(vk.instance, "vkDestroySurfaceKHR"); vkDestroyInstance = cast(PFN_vkDestroyInstance)vkGetInstanceProcAddr(vk.instance, "vkDestroyInstance"); vkCreateDevice = cast(PFN_vkCreateDevice)vkGetInstanceProcAddr(vk.instance, "vkCreateDevice"); vkGetPhysicalDeviceQueueFamilyProperties = cast(PFN_vkGetPhysicalDeviceQueueFamilyProperties)vkGetInstanceProcAddr(vk.instance, "vkGetPhysicalDeviceQueueFamilyProperties"); vkGetPhysicalDeviceSurfaceSupportKHR = cast(PFN_vkGetPhysicalDeviceSurfaceSupportKHR)vkGetInstanceProcAddr(vk.instance, "vkGetPhysicalDeviceSurfaceSupportKHR"); vkGetPhysicalDeviceProperties = cast(PFN_vkGetPhysicalDeviceProperties)vkGetInstanceProcAddr(vk.instance, "vkGetPhysicalDeviceProperties"); vkGetPhysicalDeviceFeatures2 = cast(PFN_vkGetPhysicalDeviceFeatures2)vkGetInstanceProcAddr(vk.instance, "vkGetPhysicalDeviceFeatures2"); vkEnumerateDeviceExtensionProperties = cast(PFN_vkEnumerateDeviceExtensionProperties)vkGetInstanceProcAddr(vk.instance, "vkEnumerateDeviceExtensionProperties"); vkGetPhysicalDeviceSurfacePresentModesKHR = cast(PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)vkGetInstanceProcAddr(vk.instance, "vkGetPhysicalDeviceSurfacePresentModesKHR"); vkGetPhysicalDeviceSurfaceFormatsKHR = cast(PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)vkGetInstanceProcAddr(vk.instance, "vkGetPhysicalDeviceSurfaceFormatsKHR"); vkGetPhysicalDeviceSurfaceCapabilitiesKHR = cast(PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)vkGetInstanceProcAddr(vk.instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"); vkGetPhysicalDeviceImageFormatProperties = cast(PFN_vkGetPhysicalDeviceImageFormatProperties)vkGetInstanceProcAddr(vk.instance, "vkGetPhysicalDeviceImageFormatProperties"); vkGetDeviceProcAddr = cast(PFN_vkGetDeviceProcAddr)vkGetInstanceProcAddr(vk.instance, "vkGetDeviceProcAddr"); version(linux) { vkCreateXcbSurfaceKHR = cast(PFN_vkCreateXcbSurfaceKHR)vkGetInstanceProcAddr(vk.instance, "vkCreateXcbSurfaceKHR"); } version(Windows) { vkCreateWin32SurfaceKHR = cast(PFN_vkCreateWin32SurfaceKHR)vkGetInstanceProcAddr(vk.instance, "vkCreateWin32SurfaceKHR"); } debug { vkCreateDebugUtilsMessengerEXT = cast(PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(vk.instance, "vkCreateDebugUtilsMessengerEXT"); vkDestroyDebugUtilsMessengerEXT = cast(PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(vk.instance, "vkDestroyDebugUtilsMessengerEXT"); } assert(vkEnumeratePhysicalDevices != null, "LoadInstanceFunctions failure: failed to load function"); }