[Rust]wgpu學(xué)習(xí)筆記(一)Instance,Surface,Device和Queue
CSDN反饋了一年不支持Rust代碼塊,今天突然發(fā)現(xiàn)小破站的專欄竟然支持。跑了跑了。比利比利干杯= =+
vulkan和wgpu長得差不多,但是感覺wgpu更好學(xué)233。
本文內(nèi)容主要參考自Learn wgpu和Vulkan tutorial。

Instance
我對Instance的理解是一個地基,有了Instance才好創(chuàng)建Device, Queue和Surface。里面應(yīng)該是存了些函數(shù)指針啥的東西,好調(diào)到驅(qū)動里對應(yīng)的函數(shù)。
我看了下vkspec里對VkInstance的描述,應(yīng)該是說的Vulkan狀態(tài)被打包成了Instance對象,而不使用OpenGL那樣的全局狀態(tài)機(jī)了。
用以下代碼創(chuàng)建一個Instance。
沒有其他的平臺相關(guān)依賴。這個BackendBit參數(shù)是用來選擇后端的。看了一下,目前可以選擇的API后端有這些
Primary:
Vukan
metal
DX12
WebGPU
Secondary:
DX11
OpenGL
wgpu對Primary的API支持得更好。直接Primary就完事了!
Surface
按照wgpu的文檔和vkspec的描述,Surface是一個對各個平臺的窗口或者是(可渲染)表面的抽象。我感覺說的有些繞= =...按照我的理解,Surface就是代表了一塊能夠給你畫東西的一個畫布,換句話說就是一片屏幕區(qū)域,可以讓顯卡直接把渲染出的圖片輸出上去。
Vulkan里Surface是一個KHR拓展,并不在核心庫。而且Surface和平臺關(guān)系很大,不同的平臺都有對應(yīng)的Surface。但是wgpu里面不是拓展,用GPU API的確實(shí)也一般是用來做渲染吧233。
用以下代碼創(chuàng)建一個Surface對象
這里的window是一個實(shí)現(xiàn)了HasRawWindowHandle trait的對象。這個trait的提供一個函數(shù)raw_window_handle,調(diào)用之后就能取到對應(yīng)平臺的窗口句柄。因此wgpu版本的Surface就沒有像Vulkan那樣分很多版本。
Device和Queue
這倆聯(lián)系挺緊的,就放一起吧。
Device直譯過來就是設(shè)備,一般就是指顯卡。但是wgpu里的Device也不完全代表一塊顯卡。根據(jù)wgpu文檔的描述,Device相當(dāng)于是和顯卡建立的一個連接,可以通過Device創(chuàng)建用于渲染或者計算的相關(guān)資源。
Queue直譯過來是隊(duì)列,應(yīng)該指的就是這玩意的數(shù)據(jù)結(jié)構(gòu)是一個隊(duì)列。但是我覺得把它理解成一個CPU和GPU之間互發(fā)消息的管道入口更好。在Vulkan里面Queue分成了很多種,支持不同的功能:渲染、計算和遷移(Transfer)。
Device和Queue對象都是由Adapter來創(chuàng)建。wgpu文檔里的描述是Adapter是一個對物理設(shè)備的句柄,想必是對應(yīng)了Vulkan的Physical Device了。不過我目前的理解中Adapter只是一個用來創(chuàng)建Device和Queue的臨時對象...
通過Instance能拿到Adapter,調(diào)用Adapter的request_device方法可以拿到Device和Queue的元組。
可以看到,這里wgpu是根據(jù)Surface來自動選擇要使用的Adapter的。省去了一些Vulkan要手動選擇之類的操作,很Nice。

今天差不多就記到這,摸了。直到現(xiàn)在寫文章做回顧才發(fā)現(xiàn)wgpu的Render Pass在代碼的表現(xiàn)上還是和Vulkan區(qū)別相對比較大的一個概念= =wgpu的Render Pass看起來更像是Command Buffer。有空再繼續(xù)記。