首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对GPU驱动程序的Vulkan API调用

对GPU驱动程序的Vulkan API调用
EN

Stack Overflow用户
提问于 2021-05-26 11:26:15
回答 1查看 383关注 0票数 2

背景:

我一直在考虑编写一个需要非常基本但快速的图形的应用程序(只需要绘制线条和方格),如果我要使用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调用是如何进行的。希望下图能说明我的问题。

代码语言:javascript
复制
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等)链接在一起吗?更像下面的图表吗?

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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.cloader.c上。它非常简单,每一层都只调用它下面的一层。从蹦床开始,以终结者层结束,而终结者层将被称为ICD层。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67703924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档