1
0
mirror of https://github.com/elima/gpu-playground.git synced 2025-06-06 15:36:35 +00:00

Adds a Vulkan API loader helper

This commit is contained in:
Eduardo Lima Mitev 2016-09-28 19:09:24 +02:00
parent a731e75f93
commit df4e267e45
3 changed files with 191 additions and 0 deletions

97
common/vk-api.c Normal file
View File

@ -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 <assert.h>
#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);
}

93
common/vk-api.h Normal file
View File

@ -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 <vulkan/vulkan.h>
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);

1
vulkan-triangle/common Symbolic link
View File

@ -0,0 +1 @@
../common