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; version(VULKAN_DEBUG) { PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT = null; PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT = null; } // Platform Functions version(linux) { PFN_vkCreateXlibSurfaceKHR vkCreateXlibSurfaceKHR = null; }; version(Windows) { PFN_vkCreateWin32SurfaceKHR vkCreateWin32SurfaceKHR = null; }; version(AMD_GPU) { version(VULKAN_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_vkDestroyBufferView vkDestroyBufferView = 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; static string LoadDeviceFunc(alias fn, alias vk)() { import std.format : format; import std.string : chompPrefix; enum string fn_str = __traits(identifier, fn); enum string vk_str = __traits(identifier, vk); return format("%s = cast(typeof(%s))vkGetDeviceProcAddr(%s.device, \"%s\"); assert(%s != null, \"Function pointer %s is null\");", fn_str, fn_str, vk_str, chompPrefix(type_str, "PFN_"), fn_str, fn_str); } static string LoadInstanceFunc(alias fn, alias vk)() { import std.format : format; import std.string : chompPrefix; enum string fn_str = __traits(identifier, fn); enum string vk_str = __traits(identifier, vk); enum string type_str = typeof(fn).stringof; return format("%s = cast(typeof(%s))vkGetInstanceProcAddr(%s.instance, \"%s\"); assert(%s != null, \"Function pointer %s is null\");", fn_str, fn_str, vk_str, chomp_prefix(type_str, "PFN_"), fn_str, fn_str); } void LoadDeviceFunctions(Vulkan* vk) { mixin(LoadDeviceFunc!(vkCreateSwapchainKHR, vk)); mixin(LoadDeviceFunc!(vkCmdBeginRenderPass, vk)); mixin(LoadDeviceFunc!(vkCmdEndRenderPass, vk)); mixin(LoadDeviceFunc!(vkCreateFramebuffer, vk)); mixin(LoadDeviceFunc!(vkDestroyFramebuffer, vk)); mixin(LoadDeviceFunc!(vkCreateRenderPass, vk)); mixin(LoadDeviceFunc!(vkDestroyRenderPass, vk)); mixin(LoadDeviceFunc!(vkCreateImage, vk)); mixin(LoadDeviceFunc!(vkCreateImageView, vk)); mixin(LoadDeviceFunc!(vkQueueSubmit2, vk)); mixin(LoadDeviceFunc!(vkCreateBufferView, vk)); mixin(LoadDeviceFunc!(vkGetSwapchainImagesKHR, vk)); mixin(LoadDeviceFunc!(vkGetSwapchainStatusKHR, vk)); mixin(LoadDeviceFunc!(vkGetDeviceQueue, vk)); mixin(LoadDeviceFunc!(vkCreateSemaphore, vk)); mixin(LoadDeviceFunc!(vkAllocateCommandBuffers, vk)); mixin(LoadDeviceFunc!(vkCreateCommandPool, vk)); mixin(LoadDeviceFunc!(vkCmdPipelineBarrier, vk)); mixin(LoadDeviceFunc!(vkCmdPipelineBarrier2, vk)); mixin(LoadDeviceFunc!(vkCreateFence, vk)); mixin(LoadDeviceFunc!(vkCreateDescriptorPool, vk)); mixin(LoadDeviceFunc!(vkCreateDescriptorSetLayout, vk)); mixin(LoadDeviceFunc!(vkAllocateDescriptorSets, vk)); mixin(LoadDeviceFunc!(vkCreatePipelineLayout, vk)); mixin(LoadDeviceFunc!(vkResetDescriptorPool, vk)); mixin(LoadDeviceFunc!(vkCreateShaderModule, vk)); mixin(LoadDeviceFunc!(vkCreateGraphicsPipelines, vk)); mixin(LoadDeviceFunc!(vkCreateComputePipelines, vk)); mixin(LoadDeviceFunc!(vkUpdateDescriptorSets, vk)); mixin(LoadDeviceFunc!(vkDestroyDevice, vk)); mixin(LoadDeviceFunc!(vkDestroyDescriptorPool, vk)); mixin(LoadDeviceFunc!(vkDestroySwapchainKHR, vk)); mixin(LoadDeviceFunc!(vkDestroyBufferView, vk)); mixin(LoadDeviceFunc!(vkDestroyImage, vk)); mixin(LoadDeviceFunc!(vkDestroyImageView, vk)); mixin(LoadDeviceFunc!(vkDestroyCommandPool, vk)); mixin(LoadDeviceFunc!(vkDestroySemaphore, vk)); mixin(LoadDeviceFunc!(vkDestroyFence, vk)); mixin(LoadDeviceFunc!(vkDestroyPipelineLayout, vk)); mixin(LoadDeviceFunc!(vkDestroyPipeline, vk)); mixin(LoadDeviceFunc!(vkWaitForFences, vk)); mixin(LoadDeviceFunc!(vkBeginCommandBuffer, vk)); mixin(LoadDeviceFunc!(vkEndCommandBuffer, vk)); mixin(LoadDeviceFunc!(vkAcquireNextImageKHR, vk)); mixin(LoadDeviceFunc!(vkCmdBindPipeline, vk)); mixin(LoadDeviceFunc!(vkCmdBindDescriptorSets, vk)); mixin(LoadDeviceFunc!(vkCmdDispatch, vk)); mixin(LoadDeviceFunc!(vkCmdSetViewport, vk)); mixin(LoadDeviceFunc!(vkCmdSetScissor, vk)); mixin(LoadDeviceFunc!(vkCmdPushConstants, vk)); mixin(LoadDeviceFunc!(vkCmdBindIndexBuffer, vk)); mixin(LoadDeviceFunc!(vkCmdBindVertexBuffers, vk)); mixin(LoadDeviceFunc!(vkCmdDrawIndexed, vk)); mixin(LoadDeviceFunc!(vkCmdBlitImage, vk)); mixin(LoadDeviceFunc!(vkCmdCopyBufferToImage, vk)); mixin(LoadDeviceFunc!(vkCmdCopyBuffer, vk)); mixin(LoadDeviceFunc!(vkResetFences, vk)); mixin(LoadDeviceFunc!(vkResetCommandBuffer, vk)); mixin(LoadDeviceFunc!(vkFreeCommandBuffers, vk)); mixin(LoadDeviceFunc!(vkDestroyDescriptorSetLayout, vk)); mixin(LoadDeviceFunc!(vkDestroyShaderModule, vk)); mixin(LoadDeviceFunc!(vkQueuePresentKHR, vk)); mixin(LoadDeviceFunc!(vkCmdDraw, vk)); mixin(LoadDeviceFunc!(vkDeviceWaitIdle, vk)); mixin(LoadDeviceFunc!(vkCmdClearColorImage, vk)); mixin(LoadDeviceFunc!(vkCreateSampler, vk)); mixin(LoadDeviceFunc!(vkDestroySampler, vk)); mixin(LoadDeviceFunc!(vkGetBufferDeviceAddress, vk)); mixin(LoadDeviceFunc!(vkWaitSemaphores, vk)); mixin(LoadDeviceFunc!(vkQueueWaitIdle, vk)); version(AMD_GPU) { version(VULKAN_DEBUG) { mixin(LoadDeviceFunc!(vkGetShaderInfoAMD, vk)); } } } void LoadInstanceFunctions(Vulkan* vk) { mixin(LoadInstanceFunc!(vkEnumeratePhysicalDevices, vk)); mixin(LoadInstanceFunc!(vkDestroySurfaceKHR, vk)); mixin(LoadInstanceFunc!(vkDestroyInstance, vk)); mixin(LoadInstanceFunc!(vkCreateDevice, vk)); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceQueueFamilyProperties, vk)); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceSurfaceSupportKHR, vk)); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceProperties, vk)); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceFeatures2, vk)); mixin(LoadInstanceFunc!(vkEnumerateDeviceExtensionProperties, vk)); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceSurfacePresentModesKHR, vk)); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceSurfaceFormatsKHR, vk)); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceSurfaceCapabilitiesKHR, vk)); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceImageFormatProperties, vk)); mixin(LoadInstanceFunc!(vkGetDeviceProcAddr, vk)); version(linux) { mixin(LoadInstanceFunc!(vkCreateXlibSurfaceKHR, vk)); } version(Windows) { mixin(LoadInstanceFunc!(vkCreateWin32SurfaceKHR, vk)); } version(VULKAN_DEBUG) { mixin(LoadInstanceFunc!(vkCreateDebugUtilsMessengerEXT, vk)); mixin(LoadInstanceFunc!(vkDestroyDebugUtilsMessengerEXT, vk)); } }