当前位置: 首页 > news >正文

Vulkan笔记(五)-逻辑层与队列

逻辑设备与队列

        逻辑层是应用程序与GPU交互的接口.通过 vkCreateDevice 创建需指定所需的队列族扩展与特性。(如启用几何着色器)管理资源(如缓冲区、图像、管线)和命令队列(VkQueue), 提交渲染或计算任务。

抽象与隔离:一个物理设备可创建多个逻辑设备,每个逻辑设备拥有独立的状态和资源,避免冲突(例如多线程渲染时隔离资源访问)。

灵活性:可根据需求启用不同的硬件特性或扩展(如仅启用计算功能用于挖矿,而不需要图形队列)。

void CVulkanApp::createLogicalDevice()
{QueueFamilyIndices indices = findQueueFamilies(physicalDevice_);vkDeviceQueueCreateInfo  queueCreateInfo{};queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;queueCreateInfo.queueFamilyIndex = indices.graphicsFamily.value();queueCreateInfo.queueCount = 1;  float queuePriority = 1.0f;queueCreateInfo.pQueuePriorities = &queuePriority; VkPhysicalDeviceFeatures deviceFeatures{};VkDeviceCreateInfo createInfo{};createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;createInfo.queueCreateInfoCount = 1;createInfo.pQueueCreateInfos = &queueCreateInfo;createInfo.pEnabledFeatures = &deviceFeatures;createInfo.enabledExtensionCount = static_cast<uint32_t> (deviceExtensionNames.size());           createInfo.ppEnabledExtensionNames = deviceExtensionNames.data();if (enabledValidationLayer){createInfo.enabledLayerCount = static_cast<uint32_t>(LayerNames.size());createInfo.ppEnabledLayerNames = LayerNames.data();}else{createInfo.enabledLayerCount = 0;}if (vkCreateDevice(physicalDevice_, &createInfo, nullptr, &logicDevice_) != VK_SUCCESS)throw std::runtime_error("Failed to create logical device!");vkGetDeviceQueue(logicDevice_, indices.graphicsFamily.value(), 0, &graphicsQueue_);vkGetDeviceQueue(logicDevice_, indices.presentFamily.value(), 0, &presentsQueue_);}

队列创建信息配置

通过 findQueueFamilies获取物理设备的队列族索引(如图形队列和呈现队列)。

初始化 VkDeviceQueueCreateInfo结构体,指定:

  • queueFamilyIndex:目标队列族的索引(如图形队列族)。

    queueCount:创建的队列数量(通常为1)。

    pQueuePriorities:队列优先级(范围 [0.0, 1.0],优先级越高执行机会越多)。

2. 设备特性与扩展

VkPhysicalDeviceFeatures结构体用于启用硬件特性(如几何着色器),此处未启用任何特性(默认全为 VK_FALSE)。

通过 deviceExtensionNames指定设备扩展(如 VK_KHR_swapchain),用于支持交换链等功能。

3. 逻辑设备创建

填充 VkDeviceCreateInfo结构体,包含:

  • 队列创建信息(pQueueCreateInfos)。

    设备特性(pEnabledFeatures)。

    设备扩展(ppEnabledExtensionNames)。

    验证层(ppEnabledLayerNames,若启用)。

  • 调用 vkCreateDevice创建逻辑设备,失败时抛出异常。

4. 获取队列句柄

  • 通过 vkGetDeviceQueue获取图形队列(graphicsQueue_)和呈现队列(presentsQueue_)的句柄,后续用于提交渲染指令和呈现图像。

关键注意事项

  • 验证层:旧版 Vulkan 需要显式指定设备层,现代实现已忽略此字段,但保留以兼容旧驱动。

    扩展依赖:交换链扩展(如 VK_KHR_swapchain)需与窗口系统配合使用,否则无法呈现图像。

  • 多队列支持:若物理设备支持,可创建多个队列(如计算队列),但通常单队列已足够

http://www.lryc.cn/news/624229.html

相关文章:

  • halcon基于透视的可变形模型匹配
  • C预备知识01:
  • 数字电视:技术演进与未来展望
  • 用户认证技术
  • MySQL 函数大赏:聚合、日期、字符串等函数剖析
  • 静配中心配药智能化:基于高并发架构的Go语言实现
  • CPP异常
  • 新手向:Java方向讲解
  • 数据挖掘 3.5 支持向量机——边界和正则化
  • C++ const
  • CSDN转PDF【无水印且免费!!!】
  • 计算机网络:2、TCP和UDP
  • 代码随想录刷题Day36
  • 时序数据库 Apache IoTDB:从边缘到云端Apache IoTDB 全链路数据管理能力、部署流程与安全特性解读
  • RH134 管理网络安全知识点
  • 前端处理导出PDF。Vue导出pdf
  • 备份数据库数据的时候,使用全局锁会影响业务,那有什么其他方式可以避免?
  • Redis---持久化策略
  • 如何用企业微信AI 破解金融服务难题?
  • easyexcel fastexcel 官方文档 easyexcel合并单元格
  • linux:告别SSH断线烦恼,Screen命令核心使用指南
  • 前端上传excel并解析成json
  • 实现自学习系统,输入excel文件,能学习后进行相应回答
  • AI 对话高效输入指令攻略(五):AI+PicDoc文生图表工具:解锁高效图表创作新范式
  • 实战测试:多模态AI在文档解析、图表分析中的准确率对比
  • 2025年8月更新!Windows 7 旗舰版 (32位+64位 轻度优化+离线驱动)
  • 【温室气体数据集】全球总碳柱观测网络 TCCON
  • 基于NLP的文本生成系统设计与实现(LW+源码+讲解+部署)
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-59,(知识点:谐振电路,谐振频率,串联谐振,并联谐振)
  • 【WSL2笔记10】WSL-Ubuntu 环境下 ComfyUI 本地部署性能最大化指南