[Rust]wgpu学习笔记(一)Instance,Surface,Device和Queue
CSDN反馈了一年不支持Rust代码块,今天突然发现小破站的专栏竟然支持。跑了跑了。比利比利干杯= =+
vulkan和wgpu长得差不多,但是感觉wgpu更好学233。
本文内容主要参考自Learn wgpu和Vulkan tutorial。

Instance
我对Instance的理解是一个地基,有了Instance才好创建Device, Queue和Surface。里面应该是存了些函数指针啥的东西,好调到驱动里对应的函数。
我看了下vkspec里对VkInstance的描述,应该是说的Vulkan状态被打包成了Instance对象,而不使用OpenGL那样的全局状态机了。
用以下代码创建一个Instance。
没有其他的平台相关依赖。这个BackendBit参数是用来选择后端的。看了一下,目前可以选择的API后端有这些
Primary:
Vukan
metal
DX12
WebGPU
Secondary:
DX11
OpenGL
wgpu对Primary的API支持得更好。直接Primary就完事了!
Surface
按照wgpu的文档和vkspec的描述,Surface是一个对各个平台的窗口或者是(可渲染)表面的抽象。我感觉说的有些绕= =...按照我的理解,Surface就是代表了一块能够给你画东西的一个画布,换句话说就是一片屏幕区域,可以让显卡直接把渲染出的图片输出上去。
Vulkan里Surface是一个KHR拓展,并不在核心库。而且Surface和平台关系很大,不同的平台都有对应的Surface。但是wgpu里面不是拓展,用GPU API的确实也一般是用来做渲染吧233。
用以下代码创建一个Surface对象
这里的window是一个实现了HasRawWindowHandle trait的对象。这个trait的提供一个函数raw_window_handle,调用之后就能取到对应平台的窗口句柄。因此wgpu版本的Surface就没有像Vulkan那样分很多版本。
Device和Queue
这俩联系挺紧的,就放一起吧。
Device直译过来就是设备,一般就是指显卡。但是wgpu里的Device也不完全代表一块显卡。根据wgpu文档的描述,Device相当于是和显卡建立的一个连接,可以通过Device创建用于渲染或者计算的相关资源。
Queue直译过来是队列,应该指的就是这玩意的数据结构是一个队列。但是我觉得把它理解成一个CPU和GPU之间互发消息的管道入口更好。在Vulkan里面Queue分成了很多种,支持不同的功能:渲染、计算和迁移(Transfer)。
Device和Queue对象都是由Adapter来创建。wgpu文档里的描述是Adapter是一个对物理设备的句柄,想必是对应了Vulkan的Physical Device了。不过我目前的理解中Adapter只是一个用来创建Device和Queue的临时对象...
通过Instance能拿到Adapter,调用Adapter的request_device方法可以拿到Device和Queue的元组。
可以看到,这里wgpu是根据Surface来自动选择要使用的Adapter的。省去了一些Vulkan要手动选择之类的操作,很Nice。

今天差不多就记到这,摸了。直到现在写文章做回顾才发现wgpu的Render Pass在代码的表现上还是和Vulkan区别相对比较大的一个概念= =wgpu的Render Pass看起来更像是Command Buffer。有空再继续记。