From df4e267e451e3dfa15a2000e92483357dda26ff8 Mon Sep 17 00:00:00 2001 From: Eduardo Lima Mitev Date: Wed, 28 Sep 2016 19:09:24 +0200 Subject: [PATCH] Adds a Vulkan API loader helper --- common/vk-api.c | 97 ++++++++++++++++++++++++++++++++++++++++++ common/vk-api.h | 93 ++++++++++++++++++++++++++++++++++++++++ vulkan-triangle/common | 1 + 3 files changed, 191 insertions(+) create mode 100644 common/vk-api.c create mode 100644 common/vk-api.h create mode 120000 vulkan-triangle/common diff --git a/common/vk-api.c b/common/vk-api.c new file mode 100644 index 0000000..2797291 --- /dev/null +++ b/common/vk-api.c @@ -0,0 +1,97 @@ +/* + * Vulkan API loader helper + * + * This code is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 3, or (at your option) any later version as published by + * the Free Software Foundation. + * + * THIS CODE IS PROVIDED AS-IS, WITHOUT WARRANTY OF ANY KIND, OR POSSIBLE + * LIABILITY TO THE AUTHORS FOR ANY CLAIM OR DAMAGE. + */ + +#include +#include "vk-api.h" + +void +vk_api_load_from_icd (struct vk_api* vk) +{ + /* load API entry points from ICD */ + GET_ICD_PROC_ADDR (*vk, GetInstanceProcAddr); + GET_PROC_ADDR (*vk, EnumerateInstanceLayerProperties); + GET_PROC_ADDR (*vk, EnumerateInstanceExtensionProperties); + GET_PROC_ADDR (*vk, CreateInstance); +} + +void +vk_api_load_from_instance (struct vk_api* vk, VkInstance* instance) +{ + assert (instance != VK_NULL_HANDLE); + if (vk->GetInstanceProcAddr == NULL) + vk_api_load_from_icd (vk); + + /* load instance-dependent API entry points */ + GET_INSTANCE_PROC_ADDR (*vk, *instance, GetDeviceProcAddr); + + GET_INSTANCE_PROC_ADDR (*vk, *instance, DestroyInstance); + GET_INSTANCE_PROC_ADDR (*vk, *instance, EnumeratePhysicalDevices); + GET_INSTANCE_PROC_ADDR (*vk, *instance, GetPhysicalDeviceQueueFamilyProperties); + GET_INSTANCE_PROC_ADDR (*vk, *instance, CreateDevice); + GET_INSTANCE_PROC_ADDR (*vk, *instance, EnumerateDeviceExtensionProperties); + GET_INSTANCE_PROC_ADDR (*vk, *instance, GetPhysicalDeviceProperties); + + GET_INSTANCE_PROC_ADDR (*vk, *instance, DestroySurfaceKHR); + GET_INSTANCE_PROC_ADDR (*vk, *instance, GetPhysicalDeviceSurfaceSupportKHR); + GET_INSTANCE_PROC_ADDR (*vk, *instance, GetPhysicalDeviceSurfaceFormatsKHR); + GET_INSTANCE_PROC_ADDR (*vk, *instance, + GetPhysicalDeviceSurfacePresentModesKHR); + GET_INSTANCE_PROC_ADDR (*vk, (*instance), + GetPhysicalDeviceSurfaceCapabilitiesKHR); + +#ifdef VK_USE_PLATFORM_XCB_KHR + GET_INSTANCE_PROC_ADDR (*vk, *instance, CreateXcbSurfaceKHR); +#endif +} + +void +vk_api_load_from_device (struct vk_api* vk, VkDevice* device) +{ + assert (device != VK_NULL_HANDLE); + assert (vk->GetDeviceProcAddr != NULL); + + /* load device-dependent API entry points */ + GET_DEVICE_PROC_ADDR (*vk, *device, CreateCommandPool); + GET_DEVICE_PROC_ADDR (*vk, *device, CmdBeginRenderPass); + GET_DEVICE_PROC_ADDR (*vk, *device, CmdDraw); + GET_DEVICE_PROC_ADDR (*vk, *device, CmdEndRenderPass); + GET_DEVICE_PROC_ADDR (*vk, *device, AllocateCommandBuffers); + GET_DEVICE_PROC_ADDR (*vk, *device, FreeCommandBuffers); + GET_DEVICE_PROC_ADDR (*vk, *device, GetDeviceQueue); + GET_DEVICE_PROC_ADDR (*vk, *device, CreateRenderPass); + GET_DEVICE_PROC_ADDR (*vk, *device, DestroyRenderPass); + GET_DEVICE_PROC_ADDR (*vk, *device, DestroyCommandPool); + GET_DEVICE_PROC_ADDR (*vk, *device, DestroyDevice); + GET_DEVICE_PROC_ADDR (*vk, *device, CreateGraphicsPipelines); + GET_DEVICE_PROC_ADDR (*vk, *device, DestroyPipeline); + GET_DEVICE_PROC_ADDR (*vk, *device, CreateShaderModule); + GET_DEVICE_PROC_ADDR (*vk, *device, DestroyShaderModule); + GET_DEVICE_PROC_ADDR (*vk, *device, CreatePipelineLayout); + GET_DEVICE_PROC_ADDR (*vk, *device, DestroyPipelineLayout); + GET_DEVICE_PROC_ADDR (*vk, *device, CreateImageView); + GET_DEVICE_PROC_ADDR (*vk, *device, DestroyImageView); + GET_DEVICE_PROC_ADDR (*vk, *device, CreateFramebuffer); + GET_DEVICE_PROC_ADDR (*vk, *device, DestroyFramebuffer); + GET_DEVICE_PROC_ADDR (*vk, *device, BeginCommandBuffer); + GET_DEVICE_PROC_ADDR (*vk, *device, EndCommandBuffer); + GET_DEVICE_PROC_ADDR (*vk, *device, CmdBindPipeline); + GET_DEVICE_PROC_ADDR (*vk, *device, CreateSemaphore); + GET_DEVICE_PROC_ADDR (*vk, *device, DestroySemaphore); + GET_DEVICE_PROC_ADDR (*vk, *device, QueueSubmit); + GET_DEVICE_PROC_ADDR (*vk, *device, DeviceWaitIdle); + + GET_DEVICE_PROC_ADDR (*vk, *device, CreateSwapchainKHR); + GET_DEVICE_PROC_ADDR (*vk, *device, DestroySwapchainKHR); + GET_DEVICE_PROC_ADDR (*vk, *device, GetSwapchainImagesKHR); + GET_DEVICE_PROC_ADDR (*vk, *device, AcquireNextImageKHR); + GET_DEVICE_PROC_ADDR (*vk, *device, QueuePresentKHR); +} diff --git a/common/vk-api.h b/common/vk-api.h new file mode 100644 index 0000000..1848d4d --- /dev/null +++ b/common/vk-api.h @@ -0,0 +1,93 @@ +/* + * Vulkan API loader helper + * + * This code is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * version 3, or (at your option) any later version as published by + * the Free Software Foundation. + * + * THIS CODE IS PROVIDED AS-IS, WITHOUT WARRANTY OF ANY KIND, OR POSSIBLE + * LIABILITY TO THE AUTHORS FOR ANY CLAIM OR DAMAGE. + */ + +#pragma once + +#include + +PFN_vkVoidFunction vk_icdGetInstanceProcAddr (VkInstance instance, + const char* pName); + +#define GET_ICD_PROC_ADDR(api, symbol) \ + (api).symbol = (PFN_vk ##symbol) vk_icdGetInstanceProcAddr(NULL, "vk" #symbol); + +#define GET_PROC_ADDR(api, symbol) \ + (api).symbol = (PFN_vk ##symbol) (api).GetInstanceProcAddr(NULL, "vk" #symbol); + +#define GET_INSTANCE_PROC_ADDR(api, instance, symbol) \ + (api).symbol = (PFN_vk ##symbol) (api).GetInstanceProcAddr(instance, "vk" #symbol); + +#define GET_DEVICE_PROC_ADDR(api, device, symbol) \ + (api).symbol = (PFN_vk ##symbol) (api).GetDeviceProcAddr(device, "vk" #symbol); + +struct vk_api { + PFN_vkGetInstanceProcAddr GetInstanceProcAddr; + PFN_vkGetDeviceProcAddr GetDeviceProcAddr; + PFN_vkEnumerateInstanceLayerProperties EnumerateInstanceLayerProperties; + PFN_vkEnumerateInstanceExtensionProperties EnumerateInstanceExtensionProperties; + PFN_vkCreateInstance CreateInstance; + PFN_vkEnumeratePhysicalDevices EnumeratePhysicalDevices; + PFN_vkGetPhysicalDeviceProperties GetPhysicalDeviceProperties; + PFN_vkGetPhysicalDeviceQueueFamilyProperties GetPhysicalDeviceQueueFamilyProperties; + PFN_vkCreateDevice CreateDevice; + PFN_vkEnumerateDeviceExtensionProperties EnumerateDeviceExtensionProperties; + PFN_vkGetDeviceQueue GetDeviceQueue; + PFN_vkCreateCommandPool CreateCommandPool; + PFN_vkAllocateCommandBuffers AllocateCommandBuffers; + PFN_vkFreeCommandBuffers FreeCommandBuffers; + PFN_vkCreateRenderPass CreateRenderPass; + PFN_vkDestroyRenderPass DestroyRenderPass; + PFN_vkDestroyCommandPool DestroyCommandPool; + PFN_vkDestroyDevice DestroyDevice; + PFN_vkDestroyInstance DestroyInstance; + PFN_vkCreateGraphicsPipelines CreateGraphicsPipelines; + PFN_vkDestroyPipeline DestroyPipeline; + PFN_vkCreateShaderModule CreateShaderModule; + PFN_vkDestroyShaderModule DestroyShaderModule; + PFN_vkCreatePipelineLayout CreatePipelineLayout; + PFN_vkDestroyPipelineLayout DestroyPipelineLayout; + PFN_vkCreateImageView CreateImageView; + PFN_vkDestroyImageView DestroyImageView; + PFN_vkCreateFramebuffer CreateFramebuffer; + PFN_vkDestroyFramebuffer DestroyFramebuffer; + PFN_vkBeginCommandBuffer BeginCommandBuffer; + PFN_vkEndCommandBuffer EndCommandBuffer; + PFN_vkCmdBeginRenderPass CmdBeginRenderPass; + PFN_vkCmdBindPipeline CmdBindPipeline; + PFN_vkCmdDraw CmdDraw; + PFN_vkCmdEndRenderPass CmdEndRenderPass; + PFN_vkCreateSemaphore CreateSemaphore; + PFN_vkDestroySemaphore DestroySemaphore; + PFN_vkQueueSubmit QueueSubmit; + PFN_vkDeviceWaitIdle DeviceWaitIdle; + + PFN_vkDestroySurfaceKHR DestroySurfaceKHR; + PFN_vkGetPhysicalDeviceSurfaceSupportKHR GetPhysicalDeviceSurfaceSupportKHR; + PFN_vkGetPhysicalDeviceSurfaceFormatsKHR GetPhysicalDeviceSurfaceFormatsKHR; + PFN_vkGetPhysicalDeviceSurfacePresentModesKHR GetPhysicalDeviceSurfacePresentModesKHR; + PFN_vkGetPhysicalDeviceSurfaceCapabilitiesKHR GetPhysicalDeviceSurfaceCapabilitiesKHR; + PFN_vkCreateSwapchainKHR CreateSwapchainKHR; + PFN_vkDestroySwapchainKHR DestroySwapchainKHR; + PFN_vkGetSwapchainImagesKHR GetSwapchainImagesKHR; + PFN_vkAcquireNextImageKHR AcquireNextImageKHR; + PFN_vkQueuePresentKHR QueuePresentKHR; + +#ifdef VK_USE_PLATFORM_XCB_KHR + PFN_vkCreateXcbSurfaceKHR CreateXcbSurfaceKHR; +#endif +}; + +void vk_api_load_from_icd (struct vk_api* vk); + +void vk_api_load_from_instance (struct vk_api* vk, VkInstance* instance); + +void vk_api_load_from_device (struct vk_api* vk, VkDevice* device); diff --git a/vulkan-triangle/common b/vulkan-triangle/common new file mode 120000 index 0000000..60d3b0a --- /dev/null +++ b/vulkan-triangle/common @@ -0,0 +1 @@ +../common \ No newline at end of file