启用Vulkan窗口扩展后,仍需检查物理设备的呈现支持吗?
必须要检查,原因如下:
启用窗口Surface相关扩展仅仅是让你的应用具备调用Vulkan呈现类API的权限,但不代表系统内的所有物理设备都能和你创建的这个Surface交互。不同GPU的硬件规格、驱动实现差异很大,比如部分老旧GPU、特殊用途的计算卡可能完全不支持向窗口Surface输出图像。
你贴的这段代码逻辑是标准且必要的:
vkGetPhysicalDeviceSurfaceSupportKHR函数的作用,就是验证当前遍历的物理设备队列族,是否具备向你创建的Surface做呈现输出的能力。毕竟最终要把渲染结果显示到窗口上,必须确保你选定的队列族(可以是同时支持图形+呈现的队列,也可以是单独的呈现队列)能完成这个任务。额外提醒:就算选到了支持呈现的物理设备,后续创建逻辑设备时,也必须把这个支持呈现的队列族纳入创建参数,否则依然无法正常输出画面。
整理后的代码(补全了队列族索引递增的逻辑,原代码遗漏了这步):
// 遍历每个队列族,检查是否至少包含一种所需类型的队列 int i = 0; for (const auto& queueFamily : queueFamilyList) { // 首先检查该队列族是否至少有一个可用队列(可能存在队列数为0的情况) // 检查队列族是否支持呈现 VkBool32 presentationSupport = false; vkGetPhysicalDeviceSurfaceSupportKHR(device, i, surface, &presentationSupport); // 检查队列是否为呈现类型(也可以同时是图形和呈现类型) if (queueFamily.queueCount > 0 && presentationSupport) { indices.presentationFamily = i; } i++; }
内容的提问来源于stack exchange,提问作者sai teja reddy
相关产品推荐
相关产品推荐

