設備初始化(huà)Instance –> GPU –> Device

Instance表示具體(tǐ)的Vulkan

應用。在一(yī)個(gè)應用程序中可以創建多個(gè)實例,這(zhè)些(xiē)實例之間(jiān)相互獨立,互不幹擾。

當調用API創建Vulkan

實例的時(shí)候,Vulkan SDK内部會經由驅動裝載器(qì)(loader)查找可用的GPU設備。

創建Vulkan實例需要兩個(gè)輸入信息:

應用程序的信息

内存分(fēn)配回調函數

Vulkan通過用戶輸入的内存分(fēn)配器(qì)來(lái)分(fēn)配内存。

創建好(hǎo)(hǎo)Instance,就(jiù)可以用Instance枚舉所有可用的Vulkan GPU設備。

有了(le)GPU設備,就(jiù)可以獲取具體(tǐ)GPU的信息。如(rú)果系統中安裝了(le)多個(gè)GPU設備,就(jiù)可用GPU信息比較GPU設備之間(jiān)的兼容性等。

找到了(le)合适的GPU後,就(jiù)可以通過GPU創建設備示例。

繪制Queues

有了(le)設備,就(jiù)可以創建命令隊列。命令隊列是與設備綁定的,不能(néng)跨設備使用。

隊列封裝了(le)圖形、計算(suàn)、直接内存訪問功能(néng),獨立調度、異步等調度操作(zuò)。

Command Buffer

有了(le)設備,就(jiù)可以創建命令緩沖。命令緩沖是繪制命令的批次集合。

用戶可創建任意多的命令緩沖,支持在多線程中創建。

Command占用的内存是通過Command Buffer内存池動态分(fēn)配,不需要指定内存池的大小。

Command

在命令緩沖區中可以創建多個(gè)命令。多個(gè)命令完成批次即命令緩沖後,可以重複利用。

這(zhè)裏有點像OpenGL

裏面的NameList。

Command Buffer的操作(zuò)使用pipeline barrier區分(fēn)。barrier可以等待和觸發事(shì)件。

注:

這(zhè)裏可以看出Command被包裝在Command Buffer中,當把Command Buffer提交給Queue中後,Queue中執行的是Command Buffer中的Command。

另外,Command Buffer和Queue的類别需要匹配,否則不能(néng)正确執行,但(dàn)一(yī)個(gè)Command Buffer并不會跟任何Queue有聯系。也(yě)就(jiù)意味着,一(yī)個(gè)Command Buffer可以被提交給多個(gè)Queue,隻要他們的類别匹配。

Shaders

使用設備創建Shader。

同樣支持多線程。

Pipeline

渲染管線同樣需要設備創建。

渲染管線狀态包括:Shaders,混合、深度、剔除、模版狀态等。

另外Vulkan提供了(le)API保存和加載渲染管線的狀态。

Descriptors

Vulkan資源都用descriptor表示, descriptor分(fēn)成descriptor set,descriptor set從descriptor pool分(fēn)配。

每個(gè)descriptor set都有個(gè)layout布局,布局是在pipeline創建的時(shí)候确定的。layout在descriptor set 和pipeline之間(jiān)共享,并且必須匹配。

pipeline可以切換使用相同layout的descriptor set。

多個(gè)不同layout的set可以組成鏈在一(yī)個(gè)pipeline中使用。

Render Pass

Render Pass表示一(yī)幀的某個(gè)階段,包含了(le)繪制過程中的很多信息,包括:

– Layout和framebuffer attachment的類型

-Render Pass在開始和結束的時(shí)候該做什(shén)麽

-Render Pass影響framebuffer的區域-分(fēn)塊渲染和延遲渲染需要的信息

Drawing

Draws位于Render Pass内,在Command Buffer的上(shàng)下(xià)文中執行。支持多種繪制類型:基于索引的和非索引的,直接的和間(jiān)接的等

多線程支持同步

使用事(shì)件同步任務(wù),可以設置、重置、查詢和等待事(shì)件。

Command Buffer執行完成後可以觸發事(shì)件。

任務(wù)隊列

任務(wù)在設備所屬的隊列中執行,準備好(hǎo)(hǎo)的Command buffer送到隊列中執行。

隊列保留内存,驅動不負責管理(lǐ)内存,同樣由程序管理(lǐ)。

隊列可以觸發事(shì)件,等待信号量。

Presentation

展現(xiàn)就(jiù)是如(rú)何在屏幕上(shàng)顯示圖片。

可顯示的資源使用與framebuffer綁定的“圖片”展現(xiàn),由與平台相關(guān)的模塊創建,即所謂的窗口系統接口WSI。

WSI用了(le)列舉系統的顯示設備和視(shì)頻模式,全屏,控制顯示垂直同步等。

Presenta跟命令緩沖一(yī)起進入隊列。

資源創建和釋放(fàng)

資源包括CPU資源和GPU資源。

CPU資源通過vkCreate創建,GPU資源由vkAllocMemory創建,由vkBindObjectMemory與CPU對象綁定。

應用程序負責Vulkan對象的析構,需要保證順序。Vuilkan資源沒有引用計數機制,都需要顯式釋放(fàng)。