Vulkan 2 建立Vulkan例項

2021-08-22 03:12:57 字數 4323 閱讀 4150

本節的源**是01-init_instance.cpp

vulkan程式的第一步是建立乙個vulkan例項。

當你閱讀到本節的時候,可以在lunarg vulkan 示例**倉庫中api-samples資料夾下找到01-init_instance.cpp

vulkan api使用vkinstance物件 來儲存 所有每個應用的狀態。應用程式必須在執行任何其他vulkan操作之前建立乙個vulkan例項。

基本的vulkan架構看起來是這樣的:

上面的圖顯示了乙個vulkan應用程式鏈結到乙個通常被稱為載入器(loader)的vulkan庫。建立例項會初始化裝載器。載入器還載入並初始化低階圖形驅動程式,通常由gpu硬體的**商提供。

請注意,圖中有一些層(layer),這些層也被載入器載入。層通常用於驗證,通常是由驅動執行的錯誤檢查。在vulkan中,驅動程式比opengl等其他api要輕量得多,部分原因是它將功能驗證委託給驗證層。

層是可選的,每次應用程式建立乙個例項時都可以選擇性地裝載。

vulkan層超出了本教程的範圍和示例的進展。因此,本教程不進一步介紹這些層。關於圖層的進一步資訊可以在下面的**找到

lunarg lunarxchange website.

看下01-init_instance.cpp**然後找到vkcreateinstance函式呼叫,函式原型如下:

vkresult vkcreateinstance(

const vkinstancecreateinfo* pcreateinfo,

const vkallocationcallbacks* pallocator,

vkinstance* pinstance);

一點一點來看:

vkresult-

這是函式的返回狀態。你可能想要開啟「vulkan.h」的標頭檔案。當我們遇到這些定義時,請檢查其中的一些定義。你可以在「include」目錄中找到這個檔案

vkinstancecreateinfo-

這個結構包含了用來建立例項的額外的資訊。由於這是乙個很重要的一項,您稍後將更詳細得了解它。

vkallocationcallbacks-

分配主機記憶體的函式都有乙個引數,允許應用程式執行自己的主機記憶體管理。否則,vulkan使用預設系統記憶體管理設施。應用程式可能想要管理自己的主機記憶體,例如,為了記錄記憶體分配。

本示例不使用這個特性,因此您將始終看到null被傳遞到這個和其他函式的引數中。

vkinstance-

這是函式返回的控制代碼如果例項建立成功。

這是乙個不可見的控制代碼,所以不要試圖去引用它。

許多vulkan函式建立物件返回控制代碼,它們以這種方式建立的物件。

建立物件的vulkan函式通常有乙個vk_object_createinfo引數。

找到初始化這個結構的**:

typedef

struct vkinstancecreateinfo vkinstancecreateinfo;

前兩個成員通常出現在許多vulkan的createinfo結構中。

stype-

「stype」字段表示結構的型別。在本例中,您將其設定為vk_structure_type_instance_create_info,因為它是乙個vkinstancecreateinfo 結構。這可能看起來是多餘的,因為只有這種型別的結構可以是作為vkcreateinstance()的第乙個引數傳遞。但它有一些價值,原因如下:

* 乙個驅動程式、驗證層或結構的其他使用者可以執行乙個簡單的有效性檢查,如果「stype」不像預期的那樣,可能會請求失敗。

* 通過沒有完全定義到介面引數型別化的介面,可以通過無型別(void)指標傳遞給消費者。例如,如果乙個驅動程式支援例項建立的擴充套件,它可以檢視通過無型別pnext指標(接下來討論)傳遞的這樣乙個結構。在這種情況下,stype將被設定為擴充套件識別的值。

由於這個成員總是結構中的第乙個成員,所以使用者可以很容易地確定結構的型別並決定如何處理它。

pnext-

你會經常將pnext設定為null。這個空指標有時用於在型別化結構中傳遞特定於擴充套件的資訊,其中stype被設定為乙個擴充套件定義的值。正如上面所討論的,擴充套件可以分析在這個pnext指標鏈中傳遞的任何結構,以找到它們識別的結構。

flags-

目前還沒有定義,所以將其設定為零。

- 這是乙個指向另乙個結構的指標,你需要設定它。你一會兒就會了解到。

enabledlayercountppenabledlayernames-

本教程中的示例不使用層,因此這些成員被清空。

enabledextensioncountppenabledextensionnames-

本教程中的示例不使用擴充套件。稍後,另乙個示例將顯示擴充套件的用法。

該結構為vulkan的實現提供了關於應用程式的一些基本資訊:

typedef

vkstructuretype stype;

const

void* pnext;

const

const

char* penginename;

uint32_t engineversion;

uint32_t apiversion;

stypeandpnext-

含義和vkinstancecreateinfo結構中的一樣.

- 如果需要的話,這些是應用程式可以提供的自由字段。

工具、載入器、層或驅動程式的一些實現在除錯或收集時使用這些欄位來提供資訊,或者資訊報告等。

驅動甚至有可能改變它們的行為,取決於正在執行的應用程式。

apiversion-

這個字段表示用於編譯應用程式的vulkan api的主版本、子版本和補丁版本。如果你使用的是vulkan 1.0,那麼主版本是1,而子版本應該是0。使用來自vulkan.hvk_api_version_1_0巨集來完成,補丁級別為0。補丁版本的差異不會影響只在補丁版本上不同的版本之間的完整相容性。通常,您應該將這個字段設定為vk_api_version_1_0,除非您有充分的理由不這樣做。

一旦結構被填充,樣例應用程式就會建立例項:

vkinstance inst;

vkresult res;

res = vkcreateinstance(&inst_info, null, &inst);

if (res == vk_error_incompatible_driver) else

if (res)

vkdestroyinstance(inst, null);

在上面的**中,應用程式根據結果快速檢查可能出現的錯誤並報告它,或者其他一些錯誤。請注意,成功(vk_success)的值為0,許多應用程式將非零結果解釋為乙個錯誤。

最後,應用在退出前銷毀這個物件。

現在您已經建立了乙個vulkan例項,現在是時候發現您的vulkan例項可用的圖形裝置了。

vulkan管線學習2

instance之後要弄乙個驗證層,這個根據描述是用來除錯的,release的時候就不需要他了,所以可以用巨集來開關 吶 下面是教程獲取可用驗證層的方法,是同乙個api,克洛羅斯api介紹第二個給null會返回可用的layer的數量。不給null就要指定一下要幾個屬性,然後會裝到第二個傳入引數裡返回...

Vulkan入門流程

vulkan是khronos group opengl標準的維護組織 開發的乙個新api,它提供了對現代顯示卡的乙個更好的抽象,與opengl和direct3d等現有api相比,vulkan可以更詳細的向顯示卡描述你的應用程式打算做什麼,從而可以獲得更好的效能和更小的驅動開銷。vulkan的設計理念...

搭建Vulkan環境

必備三件套 開啟vulkansdk 1.2.148.1 installer.exe 等待安裝 安裝完成 檢驗vulkan 1.開啟vulkan安裝的路徑 c vulkansdk 1.2.148.1 2.進入bin資料夾 c vulkansdk 1.2.148.1 bin 3.開啟vkcube.exe...