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
)需与窗口系统配合使用,否则无法呈现图像。多队列支持:若物理设备支持,可创建多个队列(如计算队列),但通常单队列已足够