关注专栏 写文章
第 3 章 与设备握手

第 3 章 与设备握手

1 人 赞同了该文章

利用我们前两章中获得的知识,我们现在已经达到了可以从 0 开始进行 Vulkan 编程的水平。 这两章奠定了基础,并帮助我们理解这一革命性 API 的基本原理。 现在,在更高层次上,我们要了解该技术背后的动机,核心块以及相关的功能和术语。 另外,我们通过 Vulkan 伪代码,并构建了一个简单的程序来理解以及可视化 Vulkan 编程模型。

从本章开始,我们会深入 Vulkan 编程的核心,并开始将我们的 Hello World!伪代码转换成现实世界可执行的程序。

注意

本书的所有章节都是以结构化的方式设计和编写的;每一个新章节都依赖于前一章的内容。 建议您按照章节的顺序进行高效的学习体验。

在本章中,我们将介绍以下主题:

  • LunarG SDK 入门
  • 用 CMake 设置第一个项目
  • 层和扩展的介绍
  • 创建一个 Vulkan 实例
  • 理解物理和逻辑设备
  • 理解队列和队列族
  • 将设备喝队列整合在一起

LunarG SDK 入门

本书中的所有章节都使用 LunarG SDK 进行 Vulkan 编程。 该 SDK 可以从 vulkan.lunarg.com 下载;你需要一个 LunarG 账户才能下载。

SDK 的默认安装路径始终位于 C:\ VulkanSDK \ 『版本』。 安装成功后,将 SDK 的 Bin 目录位置添加到 PATH 环境变量(C:\ VulkanSDK \ 1.0.26.0 \ Bin)中。 另外,添加 VK_SDK_PATH 环境变量,指向 SDK 的路径(C:\ VulkanSDK \ 1.0.26.0)。

安装程序还会将 Vulkan 加载程序(vulkan-1.dll)添加到 C:\ Windows \ System32 目录中。 根据不同的目标窗口系统,加载器会是一个 32 位或 64 位的 DLL。

以下是本章通用的一些常用术语:

ICD :这是 Installable Client Driver 的缩写。 这是一个 Vulkan 兼容的显卡驱动程序。 多个 ICD - 例如 NVIDIA 和英特尔的驱动程序 - 可以共存,而不会相互干扰。

Layers :这些是可插拔的组件,可以 hook 或拦截 Vulkan 命令。 它们提供诸如调试、验证、跟踪等服务。

Loader :加载程序的工作是定位显卡驱动程序并以平台无关的方式暴露层的库。 在 Windows 上,加载库(vulkan-1.dll)使用注册表来定位 ICD 和层配置。

以下是 LunarG SDK 目录中文件夹结构以及相应的说明:

Bin 和 Bin32 :它们包含可执行文件和加载程序的 32 位(Bin32 文件夹)和 64 位(Bin 文件夹)发行版本。 它们还包含层的库和工具。

Config :这是为了存储不同的 Vulkan 配置。 例如,它包含 vk_layer_settings.txt 文件,该文件用于在不同验证层设置配置参数。 这些配置可以动态地影响层。

Demo :这是 cub、tri 和 vulkaninfo 程序的 Vulkan 示例源码。

Doc :其中包含规范、手册,发行说明以及其他重要的文档。

glslang :其中包含 glslang 的源代码和头文件。 它为 GLSL 提供了一个前端解析器,并为 shader 验证提供了一个名为 glslangValidator 的独立包装工具。

Include :其中包含了用于构建和编译 Vulkan 应用程序所需的头文件。

Runtime installer :Vulkan 运行时安装程序提供的 Vulkan 运行时库,可由 Vulkan 应用程序或驱动程序包含这些运行环境。 有关更多信息,请参阅 README.txt 文件。 Source :其中包含加载器(vulkan-1.dll)和层库的源代码实现。 spir-v tools :其中包括 SPIR-V 工具的源代码和头文件。

注意

多个 SDK 的安装不会影响其他 SDK 的安装。 PATH 环境变量总是指向最近安装的 SDK 版本。

使用 CMake 设置我们的第一个项目

CMake 是一种构建过程管理工具,可以以独立于编译器的方式在操作系统中工作。 它利用 CMakeLists.txt 文件构建项目的解决方案。 在本节中,我们将学习为第一个 Vulkan 应用程序构建 CMake 文件的过程。 请参阅以下说明了解这个配置文件(CMakeLists.txt)的创建方法:

  1. 按照指定的文件夹结构约定创建一个空的 CMakeLists.txt 文件,即 chapter_3> Sample Name> CMakeLists.txt。 为了确保不同 CMake 版本之间的兼容性,您需要指定最低支持的 CMake 版本号。 如果当前版本的 CMake 碰巧低于指定的版本,它就会停止构建解决方案。 CMake 的最小支持版本是用 cmake_minimum_required 指定的。 以下是 CMakeList.txt 文件中的代码:
cmake_minimum_required(VERSION 3.7.1)
  1. 使用 set CMake 关键字指定用来查找 Vulkan SDK 路径的必要变量。 另外,在起一个有意义的名字:
set (Recipe_Name "3_0_DeviceHandshake")
  1. 在这个小节中,我们使用的 CMake 版本为 3.7.1,因为 Vulkan 模块自带的就是这个版本。 此模块有助于自动查找 Vulkan SDK 安装,包含目录以及所需的库,来构建 Vulkan 应用程序。 在下面的 CMake 代码中,我们首先尝试使用 CMake Vulkan 模块来定位 Vulkan SDK,如果不成功,我们就使用手动的方式指定 Vulkan SDK 路径。 请根据代码中给定的注释获得更加详细的描述:
# AUTO_LOCATE_VULKAN - accepted value ON or OFF # ON    - Use CMake to auto locate the Vulkan SDK.
# OFF - Vulkan SDK path can be specified manually.