背景:
我一直在考虑编写一个需要非常基本但快速的图形的应用程序(只需要绘制线条和方格),如果我要使用Rust,我可能会使用诸如GLFW或Vulkano这样的库。
我想了解Vulkan API的一个具体细节,我猜这是相当实用的。我知道GPU可能是一个相当复杂的话题,但我想强调的是,我没有任何低层次图形或Vulkan的背景,所以我理解我的问题是否无法回答,或者我的问题甚至没有意义。我将尽我所能使用正确的术语。我不得不承认,我不是最擅长浏览和查看大量源代码的人--我不太理解并且仍然掌握着总体概念,这就是为什么我希望在这里找到我的答案。我试过查看Vulkan和Mesa驱动程序的源代码,但是没有结果。
原始问题:
我想了解API调用是如何传播到GPU驱动程序的。
我到处找过,但找不到我要找的细节。我发现最近的两篇文章是:
他们都提到了类似于“为了让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比我想象的更多的是司机吗?可能是驱动程序包含与我的"MyVulkanProgram.c“相同的Vulkan头,驱动程序与库文件(如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 (来自krOoze的回答)的答案之后,并给出了上述文档中的"Vulkan“概述图,我可以更准确地表达我的问题。
通过Vulkan API调用的应用程序如何通过Vulkan加载程序到达ICD?
发布于 2021-05-26 13:39:39
您正在寻找Vulkan-Loader/LoaderAndLayerInterface.md文档。
该应用程序与Loader (有时称为Vulkan RT,或Vulkan Runtime)接口。这就是vulkan-1.dll (或so)。
装载机也有vulkan-1.lib,这是典型的dll shim。这是加载核心版本和WSI命令的地方,但是您可以跳过lib并使用vkGetInstanceProcAddr直接从dll手动完成这一切。
然后是ICD (Installable客户端驱动程序)。这些都是类似于nvoglv64.dll的东西,你可以在你的电脑上有更多的(例如英特尔iGPU + NV)。名称是任意的,并且是特定于供应商的。Loader通过配置文件找到它们。
现在,当您调用使用vkGetInstanceProcAddress获得的命令(如果您只使用*.lib的话,这是所有的东西),您将进入一个加载器蹦床,它调用一个层链,然后调用相关的ICD (或所有这些层)。然后,调用堆栈被打开,所以它向相反的方向走,直到返回到应用程序。加载程序互斥并将输入和输出合并到ICD。
使用vkGetDeviceProcAddress获得的命令要稍微精简一些,因为它们不需要互斥或合并,而且不需要从加载程序获得太多的干预就可以传递给ICD。
代码也位于同一个repo:trampoline.c和loader.c上。它非常简单,每一层都只调用它下面的一层。从蹦床开始,以终结者层结束,而终结者层将被称为ICD层。
https://stackoverflow.com/questions/67703924
复制相似问题