From cb3a8143ca1d55e55dc11726ba1cc99ce71dfb32 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 11 Jan 2026 12:29:54 +1100 Subject: [PATCH] update function loading with template --- vulkan_funcs.d | 223 ++++++++++++++++++++++++++----------------------- 1 file changed, 120 insertions(+), 103 deletions(-) diff --git a/vulkan_funcs.d b/vulkan_funcs.d index f066aa7..22d0932 100644 --- a/vulkan_funcs.d +++ b/vulkan_funcs.d @@ -126,125 +126,142 @@ 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); + enum string type_str = typeof(fn).stringof; + return format("%s = cast(%s)vkGetDeviceProcAddr(%s.device, \"%s\"); assert(%s != null, \"Function pointer %s is null\");", fn_str, type_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(%s)vkGetInstanceProcAddr(%s.instance, \"%s\"); assert(%s != null, \"Function pointer %s is null\");", fn_str, type_str, vk_str, chomp_prefix(type_str, "PFN_"), fn_str, fn_str); +} + 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"); - vkDestroyBufferView = cast(PFN_vkDestroyBufferView)vkGetDeviceProcAddr(vk.device, "vkDestroyBufferView"); - 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"); + 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) { - vkGetShaderInfoAMD = cast(PFN_vkGetShaderInfoAMD)vkGetDeviceProcAddr(vk.device, "vkGetShaderInfoAMD"); - assert(vkGetShaderInfoAMD != null, "vkGetShaderInfoAMD pointer is null"); + mixin(LoadDeviceFunc!(vkGetShaderInfoAMD, vk)); } } - - 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"); + 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) -{ - vkCreateXlibSurfaceKHR = cast(PFN_vkCreateXlibSurfaceKHR)vkGetInstanceProcAddr(vk.instance, "vkCreateXlibSurfaceKHR"); -} + version(linux) + { + mixin(LoadInstanceFunc!(vkCreateXlibSurfaceKHR, vk)); + } -version(Windows) -{ - vkCreateWin32SurfaceKHR = cast(PFN_vkCreateWin32SurfaceKHR)vkGetInstanceProcAddr(vk.instance, "vkCreateWin32SurfaceKHR"); -} + version(Windows) + { + mixin(LoadInstanceFunc!(vkCreateWin32SurfaceKHR, vk)); + } -version(VULKAN_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"); + version(VULKAN_DEBUG) + { + mixin(LoadInstanceFunc!(vkCreateDebugUtilsMessengerEXT, vk)); + mixin(LoadInstanceFunc!(vkDestroyDebugUtilsMessengerEXT, vk)); + } }