【Vulkan入门】03-创建Device

目录

先叨叨

在上篇已经选择了一个合适的PhysicalDevice。

本篇要为这个PhysicalDevice创将一个Device。Device可以理解为APP与PhysicalDevice之间的代理。

所有APP与PhysicalDevice之间交互的资源都通过Device进行管理。当然APP与PhysicalDevice通信用的Queue也是挂在Device进行管理的。Vulkan的接口设计,也暗含了在创建Device时同时创建Device下的Queue.

git信息

关键代码

VulkanEnv::CreateDevice()

  1. 本方法的作用是为选中的PhysicalDeivce创建的Device对象。
  2. 由VkDeviceCreateInfo可知,创建Device时需要同时提供创建Queue的信息,因此需要填充VkDeviceQueueCreateInfo。
  3. 填充VkDeviceQueueCreateInfo,需要提供QueueFamily的index,因此本方法最开始的循环是为了查询出支持图形功能的QueueFamily的index。
  4. 创建完Device后,对应的Queue也被创建了,因此方法最后用**vkGetDeviceQueue()**接口获取已创建的Queue。
cpp 复制代码
void VulkanEnv::CreateDevice()
{
    std::vector<VkQueueFamilyProperties> queueFamilies = GetQueueFamiliesOfPhysicalDevice(m_selectedPhysicalDevice);
    for (uint32_t i = 0; i < queueFamilies.size(); ++i)
    {
        if (queueFamilies[i].queueFlags & VK_QUEUE_GRAPHICS_BIT)
        {
            m_graphicsQueueFamilyIndex = i;
            break;
        }
    }

    //https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VkDeviceQueueCreateInfo
    float queuePriority = 1.0f;
    VkDeviceQueueCreateInfo queueCreateInfo {};
    queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
    queueCreateInfo.pNext = nullptr;
    queueCreateInfo.queueFamilyIndex = m_graphicsQueueFamilyIndex;
    queueCreateInfo.queueCount = 1;
    queueCreateInfo.pQueuePriorities = &queuePriority;


    //https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VkDeviceCreateInfo
    VkDeviceCreateInfo createInfo{};
    createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
    createInfo.pNext = nullptr;
    createInfo.queueCreateInfoCount = 1;
    createInfo.pQueueCreateInfos = &queueCreateInfo;
    createInfo.enabledExtensionCount = 0;
    createInfo.ppEnabledExtensionNames = nullptr;
    createInfo.pEnabledFeatures = nullptr;

    
    //https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#vkCreateDevice
    if (VK_SUCCESS != vkCreateDevice(m_selectedPhysicalDevice, &createInfo, nullptr, &m_device))
    {
        throw std::runtime_error("To create device is failed");
    }

    //https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#vkGetDeviceQueue
    vkGetDeviceQueue(m_device, m_graphicsQueueFamilyIndex, 0, &m_graphicsQueue);
}

编译并运行程序

运行不报错就是最好的消息

题外话

实际上每个PhysicalDevice可以创建多个Device。每个Device又可以创建多个Queue。但我还是的初学者,为了简单起见我只创建一个Device和一个Queue

相关推荐
Vex2une2 天前
异构双卡渲染避坑指南:AMD+NVIDIA混合架构下的DLSS 5适配与性能调优实战
nvidia·amd·vulkan·ai渲染·dlss5·异构双卡·dx12
蒸鱼Yuzheng14 天前
Shader 指令成本回归:离线编译、设备权重与误报控制
ci/cd·性能优化·gpu·shader·vulkan
蒸鱼Yuzheng16 天前
RenderDoc 跨版本回放治理:驱动、API、资源与兼容性矩阵
数据治理·gpu·兼容性测试·vulkan·renderdoc
天天代码码天天19 天前
C# + Vulkan 部署 APISR 动漫超分辨率:VS2022 直接编译,附 ONNX Runtime GPU 耗时与显存对比
vulkan·动漫超分辨率
DeeplyMind20 天前
XDC2026: Vulkan Gallium(代号 “Shiva”)技术报告
vulkan·xdc2026·shiva
x863 个月前
在 WSL 里把 Vulkan 跑起来
wsl·vulkan
cv魔法师5 个月前
WSL2 中使用 AMD Radeon 780M 核显配置 Vulkan
amd·wsl2·vulkan
千里马-horse7 个月前
When and Why to use Extensions -- VK_KHR_descriptor_update_template
vulkan
火柴-人7 个月前
我用 C++ 写了个 MCP ,让 AI 看懂了每一帧 GPU 在画什么
图形渲染·claude·codex·skill·vulkan·mcp·renderdoc
千里马-horse7 个月前
Using Vulkan -- Atomics
vulkan