public import vulkan_includes; import vulkan_util; import vulkan : Vulkan, VULKAN_LIBS, g_vk; // 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_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_vkQueueSubmit2KHR vkQueueSubmit2KHR = 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_vkCmdPipelineBarrier2KHR vkCmdPipelineBarrier2KHR = 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; PFN_vkCmdSetStencilTestEnableEXT vkCmdSetStencilTestEnableEXT = null; PFN_vkCmdSetStencilOpEXT vkCmdSetStencilOpEXT = null; PFN_vkCmdSetStencilReference vkCmdSetStencilReference = null; PFN_vkCmdSetStencilCompareMask vkCmdSetStencilCompareMask = null; PFN_vkCmdSetStencilWriteMask vkCmdSetStencilWriteMask = null; alias vkQueueSubmit2 = vkQueueSubmit2KHR; alias vkCmdPipelineBarrier2 = vkCmdPipelineBarrier2KHR; alias vkCmdSetStencilTestEnable = vkCmdSetStencilTestEnableEXT; alias vkCmdSetStencilOp = vkCmdSetStencilOpEXT; static string LoadDeviceFunc(alias fn)() { import std.format : format; import std.string : chompPrefix; enum string fn_str = __traits(identifier, fn); enum string vk_str = __traits(identifier, g_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, fn_str, fn_str, fn_str); } static string LoadInstanceFunc(alias fn)() { import std.format : format; import std.string : chompPrefix; enum string fn_str = __traits(identifier, fn); enum string vk_str = __traits(identifier, g_vk); return format("%s = cast(typeof(%s))vkGetInstanceProcAddr(%s.instance, \"%s\"); assert(%s != null, \"Function pointer %s is null\");", fn_str, fn_str, vk_str, fn_str, fn_str, fn_str); } void LoadDeviceFunctions() { mixin(LoadDeviceFunc!(vkCreateSwapchainKHR)); mixin(LoadDeviceFunc!(vkCmdBeginRenderPass)); mixin(LoadDeviceFunc!(vkCmdEndRenderPass)); mixin(LoadDeviceFunc!(vkCreateFramebuffer)); mixin(LoadDeviceFunc!(vkDestroyFramebuffer)); mixin(LoadDeviceFunc!(vkCreateRenderPass)); mixin(LoadDeviceFunc!(vkDestroyRenderPass)); mixin(LoadDeviceFunc!(vkCreateImage)); mixin(LoadDeviceFunc!(vkCreateImageView)); mixin(LoadDeviceFunc!(vkQueueSubmit2)); mixin(LoadDeviceFunc!(vkCreateBufferView)); mixin(LoadDeviceFunc!(vkGetSwapchainImagesKHR)); mixin(LoadDeviceFunc!(vkGetDeviceQueue)); mixin(LoadDeviceFunc!(vkCreateSemaphore)); mixin(LoadDeviceFunc!(vkAllocateCommandBuffers)); mixin(LoadDeviceFunc!(vkCreateCommandPool)); mixin(LoadDeviceFunc!(vkCmdPipelineBarrier)); mixin(LoadDeviceFunc!(vkCmdPipelineBarrier2)); mixin(LoadDeviceFunc!(vkCreateFence)); mixin(LoadDeviceFunc!(vkCreateDescriptorPool)); mixin(LoadDeviceFunc!(vkCreateDescriptorSetLayout)); mixin(LoadDeviceFunc!(vkAllocateDescriptorSets)); mixin(LoadDeviceFunc!(vkCreatePipelineLayout)); mixin(LoadDeviceFunc!(vkResetDescriptorPool)); mixin(LoadDeviceFunc!(vkCreateShaderModule)); mixin(LoadDeviceFunc!(vkCreateGraphicsPipelines)); mixin(LoadDeviceFunc!(vkCreateComputePipelines)); mixin(LoadDeviceFunc!(vkUpdateDescriptorSets)); mixin(LoadDeviceFunc!(vkDestroyDevice)); mixin(LoadDeviceFunc!(vkDestroyDescriptorPool)); mixin(LoadDeviceFunc!(vkDestroySwapchainKHR)); mixin(LoadDeviceFunc!(vkDestroyBufferView)); mixin(LoadDeviceFunc!(vkDestroyImage)); mixin(LoadDeviceFunc!(vkDestroyImageView)); mixin(LoadDeviceFunc!(vkDestroyCommandPool)); mixin(LoadDeviceFunc!(vkDestroySemaphore)); mixin(LoadDeviceFunc!(vkDestroyFence)); mixin(LoadDeviceFunc!(vkDestroyPipelineLayout)); mixin(LoadDeviceFunc!(vkDestroyPipeline)); mixin(LoadDeviceFunc!(vkWaitForFences)); mixin(LoadDeviceFunc!(vkBeginCommandBuffer)); mixin(LoadDeviceFunc!(vkEndCommandBuffer)); mixin(LoadDeviceFunc!(vkAcquireNextImageKHR)); mixin(LoadDeviceFunc!(vkCmdBindPipeline)); mixin(LoadDeviceFunc!(vkCmdBindDescriptorSets)); mixin(LoadDeviceFunc!(vkCmdDispatch)); mixin(LoadDeviceFunc!(vkCmdSetViewport)); mixin(LoadDeviceFunc!(vkCmdSetScissor)); mixin(LoadDeviceFunc!(vkCmdPushConstants)); mixin(LoadDeviceFunc!(vkCmdBindIndexBuffer)); mixin(LoadDeviceFunc!(vkCmdBindVertexBuffers)); mixin(LoadDeviceFunc!(vkCmdDrawIndexed)); mixin(LoadDeviceFunc!(vkCmdBlitImage)); mixin(LoadDeviceFunc!(vkCmdCopyBufferToImage)); mixin(LoadDeviceFunc!(vkCmdCopyBuffer)); mixin(LoadDeviceFunc!(vkResetFences)); mixin(LoadDeviceFunc!(vkResetCommandBuffer)); mixin(LoadDeviceFunc!(vkFreeCommandBuffers)); mixin(LoadDeviceFunc!(vkDestroyDescriptorSetLayout)); mixin(LoadDeviceFunc!(vkDestroyShaderModule)); mixin(LoadDeviceFunc!(vkQueuePresentKHR)); mixin(LoadDeviceFunc!(vkCmdDraw)); mixin(LoadDeviceFunc!(vkDeviceWaitIdle)); mixin(LoadDeviceFunc!(vkCmdClearColorImage)); mixin(LoadDeviceFunc!(vkCreateSampler)); mixin(LoadDeviceFunc!(vkDestroySampler)); mixin(LoadDeviceFunc!(vkGetBufferDeviceAddress)); mixin(LoadDeviceFunc!(vkWaitSemaphores)); mixin(LoadDeviceFunc!(vkQueueWaitIdle)); mixin(LoadDeviceFunc!(vkCmdSetStencilTestEnableEXT)); mixin(LoadDeviceFunc!(vkCmdSetStencilOpEXT)); mixin(LoadDeviceFunc!(vkCmdSetStencilReference)); mixin(LoadDeviceFunc!(vkCmdSetStencilCompareMask)); mixin(LoadDeviceFunc!(vkCmdSetStencilWriteMask)); version(AMD_GPU) version(VULKAN_DEBUG) { mixin(LoadDeviceFunc!(vkGetShaderInfoAMD)); } } void LoadInstanceFunctions() { mixin(LoadInstanceFunc!(vkEnumeratePhysicalDevices)); mixin(LoadInstanceFunc!(vkDestroySurfaceKHR)); mixin(LoadInstanceFunc!(vkDestroyInstance)); mixin(LoadInstanceFunc!(vkCreateDevice)); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceQueueFamilyProperties)); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceSurfaceSupportKHR)); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceProperties)); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceFeatures2)); mixin(LoadInstanceFunc!(vkEnumerateDeviceExtensionProperties)); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceSurfacePresentModesKHR)); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceSurfaceFormatsKHR)); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceSurfaceCapabilitiesKHR)); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceImageFormatProperties)); mixin(LoadInstanceFunc!(vkGetDeviceProcAddr)); version(linux) { mixin(LoadInstanceFunc!(vkCreateXlibSurfaceKHR)); } version(Windows) { mixin(LoadInstanceFunc!(vkCreateWin32SurfaceKHR)); } version(VULKAN_DEBUG) { mixin(LoadInstanceFunc!(vkCreateDebugUtilsMessengerEXT)); mixin(LoadInstanceFunc!(vkDestroyDebugUtilsMessengerEXT)); } }