如何解决来自 QtWidget/QtWindow 的无效 VkSurfaceKHR 句柄
我尝试在 Ubuntu Linux 18.04 上的 Qt 5.10.1 C++ 应用程序中为 QWidget 派生类创建一个有效的 VkSurfaceKHR 表面对象。获取 vulkan 实例和表面的代码如下所示:
QVulkanInstance inst;
inst.setLayers(QByteArrayList() << "VK_LAYER_KHRONOS_validation");
if (!inst.create())
qFatal("Failed to create Vulkan instance: %d",inst.errorCode());
… A QtWidget is created. code is omitted …
widget->show();
QWindow* realWindow = widget->windowHandle();
if ( !realWindow && widget->nativeParentWidget() )
realWindow = widget->nativeParentWidget()->windowHandle();
realWindow->setSurfaceType ( QSurface::VulkanSurface );
realWindow->setVulkanInstance ( &inst );
m_VulkanSurface = QVulkanInstance::surfaceForWindow ( realWindow );
在成功创建 vulcan 实例并从中创建设备后,我在使用此表面的 vkGetPhysicalDeviceSurfaceSupportKHR 调用中遇到段错误,尽管 surfaceForWindow 不返回 0。
在崩溃前不久,我从 VK_LAYER_KHRONOS_validation_layer 收到了这些错误消息:
vkDebug: Validation: 0: Validation Error: [ VUID-vkGetPhysicalDeviceSurfaceSupportKHR-surface-parameter ] Object 0: VK_NULL_HANDLE,type = VK_OBJECT_TYPE_INSTANCE; | MessageID = 0x801f247e | Invalid VkSurfaceKHR Object 0x55555777b560. The Vulkan spec states: surface must be a valid VkSurfaceKHR handle (https://vulkan.lunarg.com/doc/view/1.2.154.0/linux/1.2-extensions/vkspec.html#VUID-vkGetPhysicalDeviceSurfaceSupportKHR-surface-parameter)
vkDebug: Validation: 0: Validation Error: [ UNASSIGNED-Threading-Info ] Object 0: handle = 0x55555777b560,type = VK_OBJECT_TYPE_SURFACE_KHR; | MessageID = 0x5d6b67e2 | Couldn't find VkSurfaceKHR Object 0x55555777b560. This should not happen and may indicate a bug in the application.
解决方法
我猜你错过了
realWindow->show();
它对我有用,下面的代码:
realWindow->setSurfaceType(QSurface::VulkanSurface);
realWindow->show();
realWindow->setVulkanInstance(&inst);
surface = inst.surfaceForWindow(realWindow);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。