設備初始化(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)。