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_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));
}
}