update function loading with template

This commit is contained in:
Matthew 2026-01-11 12:29:54 +11:00
parent c2b7544979
commit cb3a8143ca

View File

@ -126,125 +126,142 @@ PFN_vkGetBufferDeviceAddress vkGetBufferDeviceAddress = null;
PFN_vkWaitSemaphores vkWaitSemaphores = null; PFN_vkWaitSemaphores vkWaitSemaphores = null;
PFN_vkQueueWaitIdle vkQueueWaitIdle = 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 void
LoadDeviceFunctions(Vulkan* vk) LoadDeviceFunctions(Vulkan* vk)
{ {
vkCreateSwapchainKHR = cast(PFN_vkCreateSwapchainKHR)vkGetDeviceProcAddr(vk.device, "vkCreateSwapchainKHR"); mixin(LoadDeviceFunc!(vkCreateSwapchainKHR, vk));
vkCmdBeginRenderPass = cast(PFN_vkCmdBeginRenderPass)vkGetDeviceProcAddr(vk.device, "vkCmdBeginRenderPass"); mixin(LoadDeviceFunc!(vkCmdBeginRenderPass, vk));
vkCmdEndRenderPass = cast(PFN_vkCmdEndRenderPass)vkGetDeviceProcAddr(vk.device, "vkCmdEndRenderPass"); mixin(LoadDeviceFunc!(vkCmdEndRenderPass, vk));
vkCreateFramebuffer = cast(PFN_vkCreateFramebuffer)vkGetDeviceProcAddr(vk.device, "vkCreateFramebuffer"); mixin(LoadDeviceFunc!(vkCreateFramebuffer, vk));
vkDestroyFramebuffer = cast(PFN_vkDestroyFramebuffer)vkGetDeviceProcAddr(vk.device, "vkDestroyFramebuffer"); mixin(LoadDeviceFunc!(vkDestroyFramebuffer, vk));
vkCreateRenderPass = cast(PFN_vkCreateRenderPass)vkGetDeviceProcAddr(vk.device, "vkCreateRenderPass"); mixin(LoadDeviceFunc!(vkCreateRenderPass, vk));
vkDestroyRenderPass = cast(PFN_vkDestroyRenderPass)vkGetDeviceProcAddr(vk.device, "vkDestroyRenderPass"); mixin(LoadDeviceFunc!(vkDestroyRenderPass, vk));
vkCreateImage = cast(PFN_vkCreateImage)vkGetDeviceProcAddr(vk.device, "vkCreateImage"); mixin(LoadDeviceFunc!(vkCreateImage, vk));
vkCreateImageView = cast(PFN_vkCreateImageView)vkGetDeviceProcAddr(vk.device, "vkCreateImageView"); mixin(LoadDeviceFunc!(vkCreateImageView, vk));
vkQueueSubmit2 = cast(PFN_vkQueueSubmit2KHR)vkGetDeviceProcAddr(vk.device, "vkQueueSubmit2KHR"); mixin(LoadDeviceFunc!(vkQueueSubmit2, vk));
vkCreateBufferView = cast(PFN_vkCreateBufferView)vkGetDeviceProcAddr(vk.device, "vkCreateBufferView"); mixin(LoadDeviceFunc!(vkCreateBufferView, vk));
vkGetSwapchainImagesKHR = cast(PFN_vkGetSwapchainImagesKHR)vkGetDeviceProcAddr(vk.device, "vkGetSwapchainImagesKHR"); mixin(LoadDeviceFunc!(vkGetSwapchainImagesKHR, vk));
vkGetSwapchainStatusKHR = cast(PFN_vkGetSwapchainStatusKHR)vkGetDeviceProcAddr(vk.device, "vkGetSwapchainStatusKHR"); mixin(LoadDeviceFunc!(vkGetSwapchainStatusKHR, vk));
vkGetDeviceQueue = cast(PFN_vkGetDeviceQueue)vkGetDeviceProcAddr(vk.device, "vkGetDeviceQueue"); mixin(LoadDeviceFunc!(vkGetDeviceQueue, vk));
vkCreateSemaphore = cast(PFN_vkCreateSemaphore)vkGetDeviceProcAddr(vk.device, "vkCreateSemaphore"); mixin(LoadDeviceFunc!(vkCreateSemaphore, vk));
vkAllocateCommandBuffers = cast(PFN_vkAllocateCommandBuffers)vkGetDeviceProcAddr(vk.device, "vkAllocateCommandBuffers"); mixin(LoadDeviceFunc!(vkAllocateCommandBuffers, vk));
vkCreateCommandPool = cast(PFN_vkCreateCommandPool)vkGetDeviceProcAddr(vk.device, "vkCreateCommandPool"); mixin(LoadDeviceFunc!(vkCreateCommandPool, vk));
vkCmdPipelineBarrier = cast(PFN_vkCmdPipelineBarrier)vkGetDeviceProcAddr(vk.device, "vkCmdPipelineBarrier"); mixin(LoadDeviceFunc!(vkCmdPipelineBarrier, vk));
vkCmdPipelineBarrier2 = cast(PFN_vkCmdPipelineBarrier2KHR)vkGetDeviceProcAddr(vk.device, "vkCmdPipelineBarrier2KHR"); mixin(LoadDeviceFunc!(vkCmdPipelineBarrier2, vk));
vkCreateFence = cast(PFN_vkCreateFence)vkGetDeviceProcAddr(vk.device, "vkCreateFence"); mixin(LoadDeviceFunc!(vkCreateFence, vk));
vkCreateDescriptorPool = cast(PFN_vkCreateDescriptorPool)vkGetDeviceProcAddr(vk.device, "vkCreateDescriptorPool"); mixin(LoadDeviceFunc!(vkCreateDescriptorPool, vk));
vkCreateDescriptorSetLayout = cast(PFN_vkCreateDescriptorSetLayout)vkGetDeviceProcAddr(vk.device, "vkCreateDescriptorSetLayout"); mixin(LoadDeviceFunc!(vkCreateDescriptorSetLayout, vk));
vkAllocateDescriptorSets = cast(PFN_vkAllocateDescriptorSets)vkGetDeviceProcAddr(vk.device, "vkAllocateDescriptorSets"); mixin(LoadDeviceFunc!(vkAllocateDescriptorSets, vk));
vkCreatePipelineLayout = cast(PFN_vkCreatePipelineLayout)vkGetDeviceProcAddr(vk.device, "vkCreatePipelineLayout"); mixin(LoadDeviceFunc!(vkCreatePipelineLayout, vk));
vkResetDescriptorPool = cast(PFN_vkResetDescriptorPool)vkGetDeviceProcAddr(vk.device, "vkResetDescriptorPool"); mixin(LoadDeviceFunc!(vkResetDescriptorPool, vk));
vkCreateShaderModule = cast(PFN_vkCreateShaderModule)vkGetDeviceProcAddr(vk.device, "vkCreateShaderModule"); mixin(LoadDeviceFunc!(vkCreateShaderModule, vk));
vkCreateGraphicsPipelines = cast(PFN_vkCreateGraphicsPipelines)vkGetDeviceProcAddr(vk.device, "vkCreateGraphicsPipelines"); mixin(LoadDeviceFunc!(vkCreateGraphicsPipelines, vk));
vkCreateComputePipelines = cast(PFN_vkCreateComputePipelines)vkGetDeviceProcAddr(vk.device, "vkCreateComputePipelines"); mixin(LoadDeviceFunc!(vkCreateComputePipelines, vk));
vkUpdateDescriptorSets = cast(PFN_vkUpdateDescriptorSets)vkGetDeviceProcAddr(vk.device, "vkUpdateDescriptorSets"); mixin(LoadDeviceFunc!(vkUpdateDescriptorSets, vk));
vkDestroyDevice = cast(PFN_vkDestroyDevice)vkGetDeviceProcAddr(vk.device, "vkDestroyDevice"); mixin(LoadDeviceFunc!(vkDestroyDevice, vk));
vkDestroyDescriptorPool = cast(PFN_vkDestroyDescriptorPool)vkGetDeviceProcAddr(vk.device, "vkDestroyDescriptorPool"); mixin(LoadDeviceFunc!(vkDestroyDescriptorPool, vk));
vkDestroySwapchainKHR = cast(PFN_vkDestroySwapchainKHR)vkGetDeviceProcAddr(vk.device, "vkDestroySwapchainKHR"); mixin(LoadDeviceFunc!(vkDestroySwapchainKHR, vk));
vkDestroyBufferView = cast(PFN_vkDestroyBufferView)vkGetDeviceProcAddr(vk.device, "vkDestroyBufferView"); mixin(LoadDeviceFunc!(vkDestroyBufferView, vk));
vkDestroyImage = cast(PFN_vkDestroyImage)vkGetDeviceProcAddr(vk.device, "vkDestroyImage"); mixin(LoadDeviceFunc!(vkDestroyImage, vk));
vkDestroyImageView = cast(PFN_vkDestroyImageView)vkGetDeviceProcAddr(vk.device, "vkDestroyImageView"); mixin(LoadDeviceFunc!(vkDestroyImageView, vk));
vkDestroyCommandPool = cast(PFN_vkDestroyCommandPool)vkGetDeviceProcAddr(vk.device, "vkDestroyCommandPool"); mixin(LoadDeviceFunc!(vkDestroyCommandPool, vk));
vkDestroySemaphore = cast(PFN_vkDestroySemaphore)vkGetDeviceProcAddr(vk.device, "vkDestroySemaphore"); mixin(LoadDeviceFunc!(vkDestroySemaphore, vk));
vkDestroyFence = cast(PFN_vkDestroyFence)vkGetDeviceProcAddr(vk.device, "vkDestroyFence"); mixin(LoadDeviceFunc!(vkDestroyFence, vk));
vkDestroyPipelineLayout = cast(PFN_vkDestroyPipelineLayout)vkGetDeviceProcAddr(vk.device, "vkDestroyPipelineLayout"); mixin(LoadDeviceFunc!(vkDestroyPipelineLayout, vk));
vkDestroyPipeline = cast(PFN_vkDestroyPipeline)vkGetDeviceProcAddr(vk.device, "vkDestroyPipeline"); mixin(LoadDeviceFunc!(vkDestroyPipeline, vk));
vkWaitForFences = cast(PFN_vkWaitForFences)vkGetDeviceProcAddr(vk.device, "vkWaitForFences"); mixin(LoadDeviceFunc!(vkWaitForFences, vk));
vkBeginCommandBuffer = cast(PFN_vkBeginCommandBuffer)vkGetDeviceProcAddr(vk.device, "vkBeginCommandBuffer"); mixin(LoadDeviceFunc!(vkBeginCommandBuffer, vk));
vkEndCommandBuffer = cast(PFN_vkEndCommandBuffer)vkGetDeviceProcAddr(vk.device, "vkEndCommandBuffer"); mixin(LoadDeviceFunc!(vkEndCommandBuffer, vk));
vkAcquireNextImageKHR = cast(PFN_vkAcquireNextImageKHR)vkGetDeviceProcAddr(vk.device, "vkAcquireNextImageKHR"); mixin(LoadDeviceFunc!(vkAcquireNextImageKHR, vk));
vkCmdBindPipeline = cast(PFN_vkCmdBindPipeline)vkGetDeviceProcAddr(vk.device, "vkCmdBindPipeline"); mixin(LoadDeviceFunc!(vkCmdBindPipeline, vk));
vkCmdBindDescriptorSets = cast(PFN_vkCmdBindDescriptorSets)vkGetDeviceProcAddr(vk.device, "vkCmdBindDescriptorSets"); mixin(LoadDeviceFunc!(vkCmdBindDescriptorSets, vk));
vkCmdDispatch = cast(PFN_vkCmdDispatch)vkGetDeviceProcAddr(vk.device, "vkCmdDispatch"); mixin(LoadDeviceFunc!(vkCmdDispatch, vk));
vkCmdSetViewport = cast(PFN_vkCmdSetViewport)vkGetDeviceProcAddr(vk.device, "vkCmdSetViewport"); mixin(LoadDeviceFunc!(vkCmdSetViewport, vk));
vkCmdSetScissor = cast(PFN_vkCmdSetScissor)vkGetDeviceProcAddr(vk.device, "vkCmdSetScissor"); mixin(LoadDeviceFunc!(vkCmdSetScissor, vk));
vkCmdPushConstants = cast(PFN_vkCmdPushConstants)vkGetDeviceProcAddr(vk.device, "vkCmdPushConstants"); mixin(LoadDeviceFunc!(vkCmdPushConstants, vk));
vkCmdBindIndexBuffer = cast(PFN_vkCmdBindIndexBuffer)vkGetDeviceProcAddr(vk.device, "vkCmdBindIndexBuffer"); mixin(LoadDeviceFunc!(vkCmdBindIndexBuffer, vk));
vkCmdBindVertexBuffers = cast(PFN_vkCmdBindVertexBuffers)vkGetDeviceProcAddr(vk.device, "vkCmdBindVertexBuffers"); mixin(LoadDeviceFunc!(vkCmdBindVertexBuffers, vk));
vkCmdDrawIndexed = cast(PFN_vkCmdDrawIndexed)vkGetDeviceProcAddr(vk.device, "vkCmdDrawIndexed"); mixin(LoadDeviceFunc!(vkCmdDrawIndexed, vk));
vkCmdBlitImage = cast(PFN_vkCmdBlitImage)vkGetDeviceProcAddr(vk.device, "vkCmdBlitImage"); mixin(LoadDeviceFunc!(vkCmdBlitImage, vk));
vkCmdCopyBufferToImage = cast(PFN_vkCmdCopyBufferToImage)vkGetDeviceProcAddr(vk.device, "vkCmdCopyBufferToImage"); mixin(LoadDeviceFunc!(vkCmdCopyBufferToImage, vk));
vkCmdCopyBuffer = cast(PFN_vkCmdCopyBuffer)vkGetDeviceProcAddr(vk.device, "vkCmdCopyBuffer"); mixin(LoadDeviceFunc!(vkCmdCopyBuffer, vk));
vkResetFences = cast(PFN_vkResetFences)vkGetDeviceProcAddr(vk.device, "vkResetFences"); mixin(LoadDeviceFunc!(vkResetFences, vk));
vkResetCommandBuffer = cast(PFN_vkResetCommandBuffer)vkGetDeviceProcAddr(vk.device, "vkResetCommandBuffer"); mixin(LoadDeviceFunc!(vkResetCommandBuffer, vk));
vkFreeCommandBuffers = cast(PFN_vkFreeCommandBuffers)vkGetDeviceProcAddr(vk.device, "vkFreeCommandBuffers"); mixin(LoadDeviceFunc!(vkFreeCommandBuffers, vk));
vkDestroyDescriptorSetLayout = cast(PFN_vkDestroyDescriptorSetLayout)vkGetDeviceProcAddr(vk.device, "vkDestroyDescriptorSetLayout"); mixin(LoadDeviceFunc!(vkDestroyDescriptorSetLayout, vk));
vkDestroyShaderModule = cast(PFN_vkDestroyShaderModule)vkGetDeviceProcAddr(vk.device, "vkDestroyShaderModule"); mixin(LoadDeviceFunc!(vkDestroyShaderModule, vk));
vkQueuePresentKHR = cast(PFN_vkQueuePresentKHR)vkGetDeviceProcAddr(vk.device, "vkQueuePresentKHR"); mixin(LoadDeviceFunc!(vkQueuePresentKHR, vk));
vkCmdDraw = cast(PFN_vkCmdDraw)vkGetDeviceProcAddr(vk.device, "vkCmdDraw"); mixin(LoadDeviceFunc!(vkCmdDraw, vk));
vkDeviceWaitIdle = cast(PFN_vkDeviceWaitIdle)vkGetDeviceProcAddr(vk.device, "vkDeviceWaitIdle"); mixin(LoadDeviceFunc!(vkDeviceWaitIdle, vk));
vkCmdClearColorImage = cast(PFN_vkCmdClearColorImage)vkGetDeviceProcAddr(vk.device, "vkCmdClearColorImage"); mixin(LoadDeviceFunc!(vkCmdClearColorImage, vk));
vkCreateSampler = cast(PFN_vkCreateSampler)vkGetDeviceProcAddr(vk.device, "vkCreateSampler"); mixin(LoadDeviceFunc!(vkCreateSampler, vk));
vkDestroySampler = cast(PFN_vkDestroySampler)vkGetDeviceProcAddr(vk.device, "vkDestroySampler"); mixin(LoadDeviceFunc!(vkDestroySampler, vk));
vkGetBufferDeviceAddress = cast(PFN_vkGetBufferDeviceAddress)vkGetDeviceProcAddr(vk.device, "vkGetBufferDeviceAddress"); mixin(LoadDeviceFunc!(vkGetBufferDeviceAddress, vk));
vkWaitSemaphores = cast(PFN_vkWaitSemaphores)vkGetDeviceProcAddr(vk.device, "vkWaitSemaphores"); mixin(LoadDeviceFunc!(vkWaitSemaphores, vk));
vkQueueWaitIdle = cast(PFN_vkQueueWaitIdle)vkGetDeviceProcAddr(vk.device, "vkQueueWaitIdle"); mixin(LoadDeviceFunc!(vkQueueWaitIdle, vk));
version(AMD_GPU) version(AMD_GPU)
{ {
version(VULKAN_DEBUG) version(VULKAN_DEBUG)
{ {
vkGetShaderInfoAMD = cast(PFN_vkGetShaderInfoAMD)vkGetDeviceProcAddr(vk.device, "vkGetShaderInfoAMD"); mixin(LoadDeviceFunc!(vkGetShaderInfoAMD, vk));
assert(vkGetShaderInfoAMD != null, "vkGetShaderInfoAMD pointer is null");
} }
} }
assert(vkCreateSwapchainKHR != null, "LoadDeviceFunctions failure: function pointer is null");
} }
void void
LoadInstanceFunctions(Vulkan* vk) LoadInstanceFunctions(Vulkan* vk)
{ {
vkEnumeratePhysicalDevices = cast(PFN_vkEnumeratePhysicalDevices)vkGetInstanceProcAddr(vk.instance, "vkEnumeratePhysicalDevices"); mixin(LoadInstanceFunc!(vkEnumeratePhysicalDevices, vk));
vkDestroySurfaceKHR = cast(PFN_vkDestroySurfaceKHR)vkGetInstanceProcAddr(vk.instance, "vkDestroySurfaceKHR"); mixin(LoadInstanceFunc!(vkDestroySurfaceKHR, vk));
vkDestroyInstance = cast(PFN_vkDestroyInstance)vkGetInstanceProcAddr(vk.instance, "vkDestroyInstance"); mixin(LoadInstanceFunc!(vkDestroyInstance, vk));
vkCreateDevice = cast(PFN_vkCreateDevice)vkGetInstanceProcAddr(vk.instance, "vkCreateDevice"); mixin(LoadInstanceFunc!(vkCreateDevice, vk));
vkGetPhysicalDeviceQueueFamilyProperties = cast(PFN_vkGetPhysicalDeviceQueueFamilyProperties)vkGetInstanceProcAddr(vk.instance, "vkGetPhysicalDeviceQueueFamilyProperties"); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceQueueFamilyProperties, vk));
vkGetPhysicalDeviceSurfaceSupportKHR = cast(PFN_vkGetPhysicalDeviceSurfaceSupportKHR)vkGetInstanceProcAddr(vk.instance, "vkGetPhysicalDeviceSurfaceSupportKHR"); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceSurfaceSupportKHR, vk));
vkGetPhysicalDeviceProperties = cast(PFN_vkGetPhysicalDeviceProperties)vkGetInstanceProcAddr(vk.instance, "vkGetPhysicalDeviceProperties"); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceProperties, vk));
vkGetPhysicalDeviceFeatures2 = cast(PFN_vkGetPhysicalDeviceFeatures2)vkGetInstanceProcAddr(vk.instance, "vkGetPhysicalDeviceFeatures2"); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceFeatures2, vk));
vkEnumerateDeviceExtensionProperties = cast(PFN_vkEnumerateDeviceExtensionProperties)vkGetInstanceProcAddr(vk.instance, "vkEnumerateDeviceExtensionProperties"); mixin(LoadInstanceFunc!(vkEnumerateDeviceExtensionProperties, vk));
vkGetPhysicalDeviceSurfacePresentModesKHR = cast(PFN_vkGetPhysicalDeviceSurfacePresentModesKHR)vkGetInstanceProcAddr(vk.instance, "vkGetPhysicalDeviceSurfacePresentModesKHR"); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceSurfacePresentModesKHR, vk));
vkGetPhysicalDeviceSurfaceFormatsKHR = cast(PFN_vkGetPhysicalDeviceSurfaceFormatsKHR)vkGetInstanceProcAddr(vk.instance, "vkGetPhysicalDeviceSurfaceFormatsKHR"); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceSurfaceFormatsKHR, vk));
vkGetPhysicalDeviceSurfaceCapabilitiesKHR = cast(PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR)vkGetInstanceProcAddr(vk.instance, "vkGetPhysicalDeviceSurfaceCapabilitiesKHR"); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceSurfaceCapabilitiesKHR, vk));
vkGetPhysicalDeviceImageFormatProperties = cast(PFN_vkGetPhysicalDeviceImageFormatProperties)vkGetInstanceProcAddr(vk.instance, "vkGetPhysicalDeviceImageFormatProperties"); mixin(LoadInstanceFunc!(vkGetPhysicalDeviceImageFormatProperties, vk));
vkGetDeviceProcAddr = cast(PFN_vkGetDeviceProcAddr)vkGetInstanceProcAddr(vk.instance, "vkGetDeviceProcAddr"); mixin(LoadInstanceFunc!(vkGetDeviceProcAddr, vk));
version(linux) version(linux)
{ {
vkCreateXlibSurfaceKHR = cast(PFN_vkCreateXlibSurfaceKHR)vkGetInstanceProcAddr(vk.instance, "vkCreateXlibSurfaceKHR"); mixin(LoadInstanceFunc!(vkCreateXlibSurfaceKHR, vk));
} }
version(Windows) version(Windows)
{ {
vkCreateWin32SurfaceKHR = cast(PFN_vkCreateWin32SurfaceKHR)vkGetInstanceProcAddr(vk.instance, "vkCreateWin32SurfaceKHR"); mixin(LoadInstanceFunc!(vkCreateWin32SurfaceKHR, vk));
} }
version(VULKAN_DEBUG) version(VULKAN_DEBUG)
{ {
vkCreateDebugUtilsMessengerEXT = cast(PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(vk.instance, "vkCreateDebugUtilsMessengerEXT"); mixin(LoadInstanceFunc!(vkCreateDebugUtilsMessengerEXT, vk));
vkDestroyDebugUtilsMessengerEXT = cast(PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(vk.instance, "vkDestroyDebugUtilsMessengerEXT"); mixin(LoadInstanceFunc!(vkDestroyDebugUtilsMessengerEXT, vk));
} }
assert(vkEnumeratePhysicalDevices != null, "LoadInstanceFunctions failure: failed to load function");
} }