Vulkan_05_獲取Command地址

獲取command地址

參考文檔:https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/chap3.html#initialization-instances

環境: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

爲節約時間,和以免大家看得不耐煩文章寫的很簡潔。如果在實際操作中遇到問題歡迎留言交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章