277 lines
12 KiB
D
277 lines
12 KiB
D
public import vulkan_includes;
|
|
import vulkan_util;
|
|
import vulkan : Vulkan, VULKAN_LIBS;
|
|
|
|
// 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, alias vk)()
|
|
{
|
|
import std.format : format;
|
|
import std.string : chompPrefix;
|
|
enum string fn_str = __traits(identifier, fn);
|
|
enum string vk_str = __traits(identifier, 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, alias vk)()
|
|
{
|
|
import std.format : format;
|
|
import std.string : chompPrefix;
|
|
enum string fn_str = __traits(identifier, fn);
|
|
enum string vk_str = __traits(identifier, 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(Vulkan* vk)
|
|
{
|
|
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!(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));
|
|
mixin(LoadDeviceFunc!(vkCmdSetStencilTestEnableEXT, vk));
|
|
mixin(LoadDeviceFunc!(vkCmdSetStencilOpEXT, vk));
|
|
mixin(LoadDeviceFunc!(vkCmdSetStencilReference, vk));
|
|
mixin(LoadDeviceFunc!(vkCmdSetStencilCompareMask, vk));
|
|
mixin(LoadDeviceFunc!(vkCmdSetStencilWriteMask, vk));
|
|
|
|
version(AMD_GPU) version(VULKAN_DEBUG)
|
|
{
|
|
mixin(LoadDeviceFunc!(vkGetShaderInfoAMD, vk));
|
|
}
|
|
}
|
|
|
|
void
|
|
LoadInstanceFunctions(Vulkan* vk)
|
|
{
|
|
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)
|
|
{
|
|
mixin(LoadInstanceFunc!(vkCreateXlibSurfaceKHR, vk));
|
|
}
|
|
|
|
version(Windows)
|
|
{
|
|
mixin(LoadInstanceFunc!(vkCreateWin32SurfaceKHR, vk));
|
|
}
|
|
|
|
version(VULKAN_DEBUG)
|
|
{
|
|
mixin(LoadInstanceFunc!(vkCreateDebugUtilsMessengerEXT, vk));
|
|
mixin(LoadInstanceFunc!(vkDestroyDebugUtilsMessengerEXT, vk));
|
|
}
|
|
}
|
|
|