make vulkan struct a global variable

This commit is contained in:
Matthew 2026-03-07 10:31:15 +11:00
parent 8c4c91d1db
commit 38f7bcf3d6
2 changed files with 669 additions and 608 deletions

1005
vulkan.d

File diff suppressed because it is too large Load Diff

View File

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