獲取command地址
環境:Windows + VS2019 + Vulkan SDK 1.2 + Vulkan Program模板(參見:Vulkan_04)。顯卡支持的Vulkan版本爲 Vulkan 1.1
Vulkan的所有command(提供給應用程序的函數)都是通過動態庫提供的。那麼就需要在運行時獲取command的地址。vkGetInstanceProcAddr
就是用來獲取command地址的函數。
Windows的Vulkan SDK提供了頭文件和靜態庫,因此可以直接通過靜態函數調用command。
vkGetInstanceProcAddr
原型
PFN_vkVoidFunction vkGetInstanceProcAddr(
VkInstance instance,
const char* pName);
參數
- instance 爲
VkInstance
- pName 爲command名稱,UTF-8編碼。
返回值
返回值爲函數指針,定義如下:
typedef void (VKAPI_PTR *PFN_vkVoidFunction)(void);
因爲此函數指針的定義沒有參數,所以在使用前要經過強制類型轉換。下面以vkEnumerateInstanceVersion
爲例在說明vkGetInstanceProcAddr
的使用方式。
獲取平臺支持的Vulkan的版本
可以用vkEnumerateInstanceVersion
來獲取平臺支持的Vulkan版本。
原型
VkResult vkEnumerateInstanceVersion(
uint32_t* pApiVersion);
參數
- pApiVersion 傳承參數,傳出平臺支持的Vulkan版本。可以分別通過
VK_VERSION_MAJOR
,VK_VERSION_MINOR
,VK_VERSION_PATCH
來獲取major版本號、minor版本號和patch版本號
返回值
始終爲VK_SUCCESS
直接通過Vulkan SDK提供的靜態函數調用
int main()
{
uint32_t vulkanInstanceVersion = 0;
vkEnumerateInstanceVersion(&vulkanInstanceVersion);
uint32_t majorVersion = VK_VERSION_MAJOR(vulkanInstanceVersion);
uint32_t minorVersion = VK_VERSION_MINOR(vulkanInstanceVersion);
uint32_t patchVersion = VK_VERSION_PATCH(vulkanInstanceVersion);
std::cout << "Major Version is " << majorVersion << " Minor Version is " << minorVersion << " Patch Version is " << patchVersion << std::endl;
}
使用vkGetInstanceProcAddr
獲取地址的方式調用
/**按照vkEnumerateInstanceVersion說明定義函數指針類型**/
typedef VkResult(*VkEnumerateInstanceVersionCommandType)(uint32_t* version);
int main()
{
/**獲取當前平臺Vulkan實現版本**/
uint32_t vulkanInstanceVersion = 0;
//獲取vkEnumerateInstanceVersion函數指針。注意需要強制類型轉換
VkEnumerateInstanceVersionCommandType pEnumerateInstanceVersionCommand = (VkEnumerateInstanceVersionCommandType)vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceVersion");
if (NULL == pEnumerateInstanceVersionCommand)
{
return 1;
}
//調用enumerateInstanceVersionCommand
pEnumerateInstanceVersionCommand(&vulkanInstanceVersion);
uint32_t majorVersion = VK_VERSION_MAJOR(vulkanInstanceVersion);
uint32_t minorVersion = VK_VERSION_MINOR(vulkanInstanceVersion);
uint32_t patchVersion = VK_VERSION_PATCH(vulkanInstanceVersion);
std::cout << "Major Version is " << majorVersion << " Minor Version is " << minorVersion << " Patch Version is " << patchVersion << std::endl;
}
如果您的顯卡驅動不支持Valkan 1.1,vkGetInstanceProcAddr
獲取vkEnumerateInstanceVersion
地址時會返回NULL。此時請更新顯卡驅動。如果直接通過調用靜態函數的方式調用,編譯時不會報錯,但運行時會報錯,提示在動態庫中找不到vkEnumerateInstanceVersion
爲節約時間,和以免大家看得不耐煩文章寫的很簡潔。如果在實際操作中遇到問題歡迎留言交流。