Vulkan Cookbook 第一章 6 載入全域性級函式
載入全域性級函式
我們已經獲得了vkGetInstanceProcAddr()函式,通過這個函式,我們可以以獨立於OS的方式載入所有其他Vulkan API入口點。
Vulkan函式可分為全域性函式、例項函式和裝置函式三個層次。裝置級函式用於執行典型的操作,如繪圖、著色器模組建立、影象建立或資料複製。例項級函式允許我們建立邏輯裝置。要載入裝置和例項級函式,我們需要建立一個例項。這個操作是用全域性級函式來執行的,我們需要先載入它。
怎麼做...
1.建立一個型別PFN_vkEnumerateInstanceExtensionProperties名為vkEnumerateInstanceExtensionProperties
這個怎麼運作...
在Vulkan中,只有三個全域性級函式:vkEnumerateInstanceExtensionProperties()、vkEnumerateInstanceLayerProperties()和vkCreateInstance()。它們在例項建立期間用於檢查哪些例項級擴充套件和層可用,以及建立例項本身。
獲取全域性級函式的過程類似於從Vulkan Loader匯出的載入函式。這就是為什麼最方便的方法是將全域性級函式的名稱新增到ListOfVulkanFunctions.inl檔案中,如下:
#ifndef GLOBAL_LEVEL_VULKAN_FUNCTION
#define GLOBAL_LEVEL_VULKAN_FUNCTION( function )
#endif
GLOBAL_LEVEL_VULKAN_FUNCTION( vkEnumerateInstanceExtensionProperties )
GLOBAL_LEVEL_VULKAN_FUNCTION( vkEnumerateInstanceLayerProperties )
GLOBAL_LEVEL_VULKAN_FUNCTION( vkCreateInstance )
#undef GLOBAL_LEVEL_VULKAN_FUNCTION
如前所述需要載入全域性級函式,我們不需要改變VulkanFunctions.h,只需要修改實現如下:
#define GLOBAL_LEVEL_VULKAN_FUNCTION( name ) \
name = (PFN_##name)vkGetInstanceProcAddr( nullptr, #name ); \
if( name == nullptr ) { \
std::cout << "Could not load global-level function named: " \
#name << std::endl; \
return false; \
}
#include "ListOfVulkanFunctions.inl"
return true;
自定義GLOBAL_LEVEL_VULKAN_FUNCTION巨集獲取函式名並將其提供給vkGetInstanceProcAddr()函式。它試圖載入給定的函式,在失敗的情況下,返回nullptr。由vkGetInstanceProcAddr()函式返回的結果都被轉換到PFN_<name>型別,並存儲在適當的變數中。 在失敗的情況下,顯示一條訊息,以便使用者知道哪個函式不能載入。