23 QByteArrayList extraExtensions;
24 extraExtensions << QByteArrayLiteral(
"VK_KHR_wayland_surface");
25 initInstance(m_instance, extraExtensions);
30 m_getPhysDevPresSupport =
reinterpret_cast<PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR>(
31 m_vkGetInstanceProcAddr(m_vkInst,
"vkGetPhysicalDeviceWaylandPresentationSupportKHR"));
32 if (!m_getPhysDevPresSupport)
33 qWarning() <<
"Failed to find vkGetPhysicalDeviceWaylandPresentationSupportKHR";
37 uint32_t queueFamilyIndex,
40 if (!m_getPhysDevPresSupport || !m_getPhysDevSurfaceSupport)
43 auto *w =
static_cast<QWaylandWindow *>(window->handle());
45 qWarning() <<
"Attempted to call supportsPresent() without a valid platform window";
48 wl_display *display = w->display()->wl_display();
49 bool ok = m_getPhysDevPresSupport(physicalDevice, queueFamilyIndex, display);
51 VkSurfaceKHR surface = QVulkanInstance::surfaceForWindow(window);
52 VkBool32 supported =
false;
53 m_getPhysDevSurfaceSupport(physicalDevice, queueFamilyIndex, surface, &supported);
54 ok &=
bool(supported);
61 VkSurfaceKHR surface = VK_NULL_HANDLE;
63 if (!m_createSurface) {
64 m_createSurface =
reinterpret_cast<PFN_vkCreateWaylandSurfaceKHR>(
65 m_vkGetInstanceProcAddr(m_vkInst,
"vkCreateWaylandSurfaceKHR"));
67 if (!m_createSurface) {
68 qWarning() <<
"Failed to find vkCreateWaylandSurfaceKHR";
72 VkWaylandSurfaceCreateInfoKHR surfaceInfo;
73 memset(&surfaceInfo, 0,
sizeof(surfaceInfo));
74 surfaceInfo.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
75 surfaceInfo.display = window->display()->wl_display();
76 surfaceInfo.surface = window->wlSurface();
77 VkResult err = m_createSurface(m_vkInst, &surfaceInfo,
nullptr, &surface);
78 if (err != VK_SUCCESS)
79 qWarning(
"Failed to create Vulkan surface: %d", err);
86 auto *w =
static_cast<QWaylandWindow *>(window->handle());
88 qWarning() <<
"Attempted to call presentAboutToBeQueued() without a valid platform window";
93 int frameCallbackTimeout = qEnvironmentVariableIntValue(
"QT_WAYLAND_FRAME_CALLBACK_TIMEOUT", &ok);
96 mFrameCallbackTimeout = frameCallbackTimeout;
98 if (w->format().swapInterval() > 0)
99 w->waitForFrameSync(mFrameCallbackTimeout);