对GPU驱动程序的Vulkan API调用



背景:
我一直在考虑编写一个需要非常基本但快速的图形(只画直线和正方形(的应用程序,如果我要使用Rust,我可能会使用GLFW或Vulkano等库。

我想了解Vulkan API的具体细节,我想这是非常实际的。我知道GPU可能是一个相当复杂的话题,但我想强调的是,我没有任何底层图形或Vulkan的背景,所以我理解我的问题是否无法回答,或者我的问题甚至没有意义。我会尽量使用正确的术语。我不得不承认,我不是最擅长浏览和查看大量源代码的人,我不太理解,仍然掌握整个概念,这就是为什么我希望我能在这里找到答案。我试过查看Vulkan和Mesa驱动程序的源代码,但没有结果。

原始问题:
我想了解API调用是如何传播到GPU驱动程序的。

我四处寻找,但找不到我正在寻找的细节。我找到的最接近的帖子是这两个:
https://softwareengineering.stackexchange.com/questions/279069/how-does-a-program-talk-to-a-graphics-card
https://superuser.com/questions/461022/how-does-the-cpu-and-gpu-interact-in-displaying-computer-graphics

他们都提到了类似于";为了让GPU做一些事情,你必须通过支持的API进行调用;。我知道这一点,但两人都没有深入了解如何进行API调用的细节。希望下图能说明我的问题。

MyVulkanProgram.c with "#include <vulkan/vulkan.h>"
|
| (Makes call via Vulkan API)
v
This is the part I don't understand!
|
v
Driver (Mesa, for example) takes the request sent via the Vulkan API.
|
| (Driver asks GPU to perform task)
v
GPU does task

我不在乎GPU是怎么做的。它是如何通过Vulkan通过API调用调用的,以及它是如何在系统中传播的。理想情况下,我要找的是一个代码片段或链接,指向Vulkan源代码中实际请求发送到驱动程序的位置。

还是我都搞错了?Vulkan是不是比我意识到的更像是司机?可能是驾驶员包括与我的"Vulkan"相同的Vulkan标题的情况吗;MyVulkanProgram.c";驱动程序与库文件(如libvulkan.so等(链接在一起?它更像下图吗?

MyVulkanProgram.c with "#include <vulkan/vulkan.h>"
|
| (Makes call via Vulkan API)
v
Driver (Mesa, for example, which includes the vulkan headers and is linked with the Vulkan shared object-files) takes the request sent via the Vulkan API.
|
| (Driver asks GPU to perform task)
v
GPU does task

这可能是一个基本问题,也可能不是,但我还是很困惑。非常感谢您的回答!

更新问题:
在阅读@krOoze的答案(来自krOoz的答案(后;Vulkan装载机";在上述文件中,我可以更准确地表达我的问题。

通过Vulkan API进行调用的应用程序如何通过Vulken加载器到达ICD?

您正在寻找Vulkan Loader/LoaderAndLayerInterface.md文档。

该应用程序与加载器接口(有时称为Vulkan RT或Vulkan Runtime(。即vulkan-1.dll(或so(。

Loader还有vulkan-1.lib,它是典型的dll填充程序。这是加载核心版本和WSI命令的地方,但您可以跳过lib,使用vkGetInstanceProcAddr直接从dll手动完成所有操作。

然后你就有了ICD(可安装的客户端驱动程序(。它们类似于nvoglv64.dll,您可以在PC上拥有更多它们(例如Intel iGPU+NV(。该名称是任意的,并且特定于供应商。Loader通过配置文件找到它们。

现在,当你对用vkGetInstanceProcAddress获得的命令调用某些东西时(如果你只使用*.lib,这就是一切(,你会进入一个加载蹦床,它调用一系列层,然后调用相关的ICD(或所有层(。然后调用堆栈被展开,所以它会转到另一个方向,直到返回到应用程序。加载器互斥并合并输入和输出到ICD。

使用vkGetDeviceProcAddress获得的命令稍微精简了一点,因为它们不需要互斥或合并,并且可以在没有Loader太多干预的情况下传递给ICD。

代码也在同一个repo中:蹦床.c和loader.c。它非常简单;每一层都只调用它下面的层。从蹦床开始,到终止层结束,终止层又称为ICD层。

最新更新