【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

相关推荐
EniacCheng4 天前
【Vulkan入门】04-开启Debug输出
debug·vulkan
不如学也17 天前
图形渲染性能优化
vulkan
穷人小水滴2 个月前
Windows (rust) vulkan 画一个三角形: 窗口创建与渲染初始化
开发语言·windows·rust·gpu·窗口·vulkan
穷人小水滴2 个月前
Android (rust) vulkan (JNI) 画一个三角形: VulkanSurfaceView 初始化
android·开发语言·rust·gpu·jni·vulkan·surfaceview
穷人小水滴3 个月前
(章节 3.1) 本地运行 AI 有多慢 ? 大模型推理测速 (llama.cpp, Intel GPU A770)
人工智能·llama·llama.cpp·a770·vulkan·gnu/linux·sycl
穷人小水滴4 个月前
编译运行 llama.cpp (vulkan, Intel GPU SYCL)
ai·gpu·intel·llama.cpp·a770·vulkan·sycl
Justgoodnight8 个月前
M芯片 mac配置Vulkan环境报错 Xcode
macos·xcode·vulkan