1. 程式人生 > >Vulkan Cookbook 第一章 6 載入全域性級函式

Vulkan Cookbook 第一章 6 載入全域性級函式

載入全域性級函式

我們已經獲得了vkGetInstanceProcAddr()函式,通過這個函式,我們可以以獨立於OS的方式載入所有其他Vulkan API入口點。

Vulkan函式可分為全域性函式例項函式裝置函式三個層次。裝置級函式用於執行典型的操作,如繪圖、著色器模組建立、影象建立或資料複製。例項級函式允許我們建立邏輯裝置。要載入裝置和例項級函式,我們需要建立一個例項。這個操作是用全域性級函式來執行的,我們需要先載入它。

怎麼做...

1.建立一個型別PFN_vkEnumerateInstanceExtensionProperties名為vkEnumerateInstanceExtensionProperties

的變數。 2.建立一個型別PFN_vkEnumerateInstanceLayerProperties名為vkEnumerateInstanceLayerProperties的不變數。 3.建立一個型別PFN_vkCreateInstance名為vkCreateInstance的變數。 4.呼叫vkGetInstanceProcAddr(nullptr,"vkEnumerateInstanceExtensionProperties"),將結果強轉成PFN_vkEnumerateInstanceExtensionProperties型別,並賦值給vkEnumerateInstanceExtensionProperties
變數。 5.呼叫vkGetInstanceProcAddr(nullptr,"vkEnumerateInstanceLayerProperties"),將結果強轉成PFN_vkEnumerateInstanceLayerProperties型別,並賦值給vkEnumerateInstanceLayerProperties變數。 6.呼叫vkGetInstanceProcAddr(nullptr,"vkCreateInstance"),將結果強轉成PFN_vkCreateInstance型別,並賦值給vkCreateInstance變數。 7.判斷所有變數的值是否不等於nullptr,確認檢查是否成功。

這個怎麼運作...

在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>型別,並存儲在適當的變數中。 在失敗的情況下,顯示一條訊息,以便使用者知道哪個函式不能載入。