Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qwindowsvulkaninstance.cpp
Go to the documentation of this file.
1// Copyright (C) 2017 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
6
8
9QWindowsVulkanInstance::QWindowsVulkanInstance(QVulkanInstance *instance)
10 : m_instance(instance),
11 m_getPhysDevPresSupport(nullptr),
12 m_createSurface(nullptr)
13{
14 loadVulkanLibrary(QStringLiteral("vulkan-1"));
15}
16
17void QWindowsVulkanInstance::createOrAdoptInstance()
18{
19 initInstance(m_instance, QByteArrayList() << QByteArrayLiteral("VK_KHR_win32_surface"));
20
21 if (!m_vkInst)
22 return;
23
24 m_getPhysDevPresSupport = reinterpret_cast<PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR>(
25 m_vkGetInstanceProcAddr(m_vkInst, "vkGetPhysicalDeviceWin32PresentationSupportKHR"));
26 if (!m_getPhysDevPresSupport)
27 qWarning("Failed to find vkGetPhysicalDeviceWin32PresentationSupportKHR");
28}
29
30bool QWindowsVulkanInstance::supportsPresent(VkPhysicalDevice physicalDevice,
31 uint32_t queueFamilyIndex,
32 QWindow *window)
33{
34 if (!m_getPhysDevPresSupport || !m_getPhysDevSurfaceSupport)
35 return true;
36
37 bool ok = m_getPhysDevPresSupport(physicalDevice, queueFamilyIndex);
38
39 VkSurfaceKHR surface = QVulkanInstance::surfaceForWindow(window);
40 VkBool32 supported = false;
41 m_getPhysDevSurfaceSupport(physicalDevice, queueFamilyIndex, surface, &supported);
42 ok &= bool(supported);
43
44 return ok;
45}
46
47VkSurfaceKHR QWindowsVulkanInstance::createSurface(HWND win)
48{
49 VkSurfaceKHR surface = VK_NULL_HANDLE;
50
51 if (!m_createSurface) {
52 m_createSurface = reinterpret_cast<PFN_vkCreateWin32SurfaceKHR>(
53 m_vkGetInstanceProcAddr(m_vkInst, "vkCreateWin32SurfaceKHR"));
54 }
55 if (!m_createSurface) {
56 qWarning("Failed to find vkCreateWin32SurfaceKHR");
57 return surface;
58 }
59
60 VkWin32SurfaceCreateInfoKHR surfaceInfo;
61 memset(&surfaceInfo, 0, sizeof(surfaceInfo));
62 surfaceInfo.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
63 surfaceInfo.hinstance = GetModuleHandle(nullptr);
64 surfaceInfo.hwnd = win;
65 VkResult err = m_createSurface(m_vkInst, &surfaceInfo, nullptr, &surface);
66 if (err != VK_SUCCESS)
67 qWarning("Failed to create Vulkan surface: %d", err);
68
69 return surface;
70}
71
72QT_END_NAMESPACE
Combined button and popup list for selecting options.