VkInstance 和 VkDevice 是 Vulkan 中两个非常重要但不同层次的概念:

VkInstance

  1. 是 Vulkan 程序的全局上下文,代表着与 Vulkan 系统的连接
  2. 主要职责:
    • 初始化 Vulkan 库
    • 加载全局扩展
    • 设置调试回调
    • 枚举物理设备 (GPU)
  3. 每个程序通常只需要一个 VkInstance

示例代码:

VkInstanceCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
createInfo.pApplicationInfo = &appInfo;
// 设置需要的扩展和验证层
 
VkInstance instance;
vkCreateInstance(&createInfo, nullptr, &instance);

VkDevice

  1. 是对物理设备 (GPU) 的逻辑抽象,代表着与具体 GPU 的连接
  2. 主要职责:
    • 创建各种 Vulkan 资源 (缓冲区、图像、命令缓冲区等)
    • 执行渲染命令
    • 管理设备队列
    • 处理设备级别的扩展
  3. 一个程序可以有多个 VkDevice,每个对应一个物理设备

示例代码:

VkDeviceCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
createInfo.pQueueCreateInfos = &queueCreateInfo;
createInfo.queueCreateInfoCount = 1;
// 设置需要的设备特性和扩展
 
VkDevice device;
vkCreateDevice(physicalDevice, &createInfo, nullptr, &device);

两者的关系

  • VkInstance 是程序级别的,而 VkDevice 是设备级别的
  • 必须先创建 VkInstance 才能创建 VkDevice
  • VkInstance 用于枚举物理设备,然后基于物理设备创建 VkDevice
  • 销毁时顺序相反:先销毁所有 VkDevice,最后销毁 VkInstance