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:
parent
a731e75f93
commit
df4e267e45
97
common/vk-api.c
Normal file
97
common/vk-api.c
Normal 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
93
common/vk-api.h
Normal 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
1
vulkan-triangle/common
Symbolic link
@ -0,0 +1 @@
|
||||
../common
|
Loading…
x
Reference in New Issue
Block a user