24 QByteArrayList extraExtensions;
25 extraExtensions << QByteArrayLiteral(
"VK_KHR_wayland_surface");
26 initInstance(m_instance, extraExtensions);
31 m_getPhysDevPresSupport =
reinterpret_cast<PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR>(
32 m_vkGetInstanceProcAddr(m_vkInst,
"vkGetPhysicalDeviceWaylandPresentationSupportKHR"));
33 if (!m_getPhysDevPresSupport)
34 qWarning() <<
"Failed to find vkGetPhysicalDeviceWaylandPresentationSupportKHR";
38 uint32_t queueFamilyIndex,
41 if (!m_getPhysDevPresSupport || !m_getPhysDevSurfaceSupport)
44 auto *w =
static_cast<QWaylandWindow *>(window->handle());
46 qWarning() <<
"Attempted to call supportsPresent() without a valid platform window";
49 wl_display *display = w->display()->wl_display();
50 bool ok = m_getPhysDevPresSupport(physicalDevice, queueFamilyIndex, display);
52 VkSurfaceKHR surface = QVulkanInstance::surfaceForWindow(window);
53 VkBool32 supported =
false;
54 m_getPhysDevSurfaceSupport(physicalDevice, queueFamilyIndex, surface, &supported);
55 ok &=
bool(supported);
62 VkSurfaceKHR surface = VK_NULL_HANDLE;
64 if (!m_createSurface) {
65 m_createSurface =
reinterpret_cast<PFN_vkCreateWaylandSurfaceKHR>(
66 m_vkGetInstanceProcAddr(m_vkInst,
"vkCreateWaylandSurfaceKHR"));
68 if (!m_createSurface) {
69 qWarning() <<
"Failed to find vkCreateWaylandSurfaceKHR";
73 VkWaylandSurfaceCreateInfoKHR surfaceInfo;
74 memset(&surfaceInfo, 0,
sizeof(surfaceInfo));
75 surfaceInfo.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
76 surfaceInfo.display = window->display()->wl_display();
77 surfaceInfo.surface = window->wlSurface();
78 VkResult err = m_createSurface(m_vkInst, &surfaceInfo,
nullptr, &surface);
79 if (err != VK_SUCCESS)
80 qWarning(
"Failed to create Vulkan surface: %d", err);
87 auto *w =
static_cast<QWaylandWindow *>(window->handle());
89 qWarning() <<
"Attempted to call presentAboutToBeQueued() without a valid platform window";
94 int frameCallbackTimeout = qEnvironmentVariableIntValue(
"QT_WAYLAND_FRAME_CALLBACK_TIMEOUT", &ok);
97 mFrameCallbackTimeout = frameCallbackTimeout;
99 if (w->format().swapInterval() > 0)
100 w->waitForFrameSync(mFrameCallbackTimeout);