【问题标题】:Vulkan API calls to GPU drivers对 GPU 驱动程序的 Vulkan API 调用
【发布时间】:2021-05-26 11:26:15
【问题描述】:

背景:
我一直在关注编写一个需要非常基本但快速的图形(仅绘制线条和正方形)的应用程序,如果我要使用 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 调用调用的,以及它是如何在系统中传播的。理想情况下,我正在寻找一个 code-sn-p 或链接到 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 (answer from krOoze) 的答案,并给出了上述文档中的“Vulkan loader”概述图后,我可以更准确地表达我的问题。

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

【问题讨论】:

  • 我想了解 API 调用是如何传播到 GPU 驱动程序的。”这完全取决于相关操作系统的图形堆栈。
  • @NicolBolas 是的,我一直在寻找一个有点不可知的答案,但我会更新我的问题。在阅读了 krOoz 的答案后,我想我可以更好地正式提出我的问题。

标签: api gpu driver vulkan icd


【解决方案1】:

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

应用程序与加载程序(有时称为 Vulkan RT 或 Vulkan 运行时)交互。那就是vulkan-1.dll(或so)。

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

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

现在,当您调用通过 vkGetInstanceProcAddress 获得的命令(如果您仅使用 *.lib或全部)被调用。然后调用堆栈被展开,所以它会朝着另一个方向前进,直到返回到应用程序。加载器互斥并将输入和输出合并到 ICD。

使用vkGetDeviceProcAddress 获得的命令更加精简,因为它们不需要互斥或合并,并且可以在没有加载器过多干预的情况下传递给 ICD。

代码也在同一个 repo 中:trampoline.cloader.c。这很简单;每层只调用它下面的层。从蹦床开始,到终结者层结束,终结者层又将调用 ICD 层。

【讨论】:

  • 是的!文档部分“Vulkan Installable Client Driver Interface With the Loader”回答了我的大部分问题(谢谢)。只是为了确保我正确理解这一点:我没有 Windows 系统来检查注册表“HKEY_LOCAL_MACHINE\...\VulkanDriverName”(通过 ICD 清单文件)实际指向的内容,但我认为它是“ nvoglv64.dll”。这个 .dll 是否可以被视为 Nvidia 的(专有)驱动程序的一部分?我知道这个 .dll 知道堆栈的其余部分是如何在内部工作的,所以我很乐意将其保留。
  • 注:任何人阅读。文档 (link) 回答了大多数平台(例如 Windows、Linux 和 macOS)的问题,而不仅仅是 Windows。
  • @Mah 注册表指向nv-vk64.json(对应nv-vk32.json),后者又指向nvoglv64.dll(对应nvoglv32.dll)。它可安装客户端驱动程序(“Nvidia 专有驱动程序”)的一部分。
猜你喜欢
  • 1970-01-01
  • 2021-08-06
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
相关资源
最近更新 更多