Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qxcbvulkaninstance.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
5#include "qxcbwindow.h"
6#include "qxcbscreen.h"
7
9
11 : m_instance(instance),
12 m_getPhysDevPresSupport(nullptr),
13 m_createSurface(nullptr)
14{
16}
17
21
23{
24 initInstance(m_instance, QByteArrayList() << QByteArrayLiteral("VK_KHR_xcb_surface"));
25
26 if (!m_vkInst)
27 return;
28
29 m_getPhysDevPresSupport = reinterpret_cast<PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR>(
30 m_vkGetInstanceProcAddr(m_vkInst, "vkGetPhysicalDeviceXcbPresentationSupportKHR"));
31 if (!m_getPhysDevPresSupport)
32 qWarning("Failed to find vkGetPhysicalDeviceXcbPresentationSupportKHR");
33}
34
35bool QXcbVulkanInstance::supportsPresent(VkPhysicalDevice physicalDevice,
36 uint32_t queueFamilyIndex,
38{
39 if (!m_getPhysDevPresSupport || !m_getPhysDevSurfaceSupport)
40 return true;
41
42 QXcbWindow *w = static_cast<QXcbWindow *>(window->handle());
43 if (!w) {
44 qWarning("Attempted to call supportsPresent() without a valid platform window");
45 return false;
46 }
47 xcb_connection_t *connection = w->xcbScreen()->xcb_connection();
48 bool ok = m_getPhysDevPresSupport(physicalDevice, queueFamilyIndex, connection, w->visualId());
49
50 VkSurfaceKHR surface = QVulkanInstance::surfaceForWindow(window);
51 VkBool32 supported = false;
52 m_getPhysDevSurfaceSupport(physicalDevice, queueFamilyIndex, surface, &supported);
53 ok &= bool(supported);
54
55 return ok;
56}
57
59{
60 VkSurfaceKHR surface = VK_NULL_HANDLE;
61
62 if (!m_createSurface) {
63 m_createSurface = reinterpret_cast<PFN_vkCreateXcbSurfaceKHR>(
64 m_vkGetInstanceProcAddr(m_vkInst, "vkCreateXcbSurfaceKHR"));
65 }
66 if (!m_createSurface) {
67 qWarning("Failed to find vkCreateXcbSurfaceKHR");
68 return surface;
69 }
70
71 VkXcbSurfaceCreateInfoKHR surfaceInfo;
72 memset(&surfaceInfo, 0, sizeof(surfaceInfo));
73 surfaceInfo.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
74 surfaceInfo.connection = window->xcbScreen()->xcb_connection();
75 surfaceInfo.window = window->xcb_window();
76 VkResult err = m_createSurface(m_vkInst, &surfaceInfo, nullptr, &surface);
77 if (err != VK_SUCCESS)
78 qWarning("Failed to create Vulkan surface: %d", err);
79
80 return surface;
81}
82
84{
85 QXcbWindow *w = static_cast<QXcbWindow *>(window->handle());
86 if (!w) {
87 qWarning("Attempted to call presentQueued() without a valid platform window");
88 return;
89 }
90
91 if (w->needsSync())
92 w->postSyncWindowRequest();
93}
94
PFN_vkGetInstanceProcAddr m_vkGetInstanceProcAddr
PFN_vkGetPhysicalDeviceSurfaceSupportKHR m_getPhysDevSurfaceSupport
void loadVulkanLibrary(const QString &defaultLibraryName, int defaultLibraryVersion=-1)
void initInstance(QVulkanInstance *instance, const QByteArrayList &extraExts)
The QVulkanInstance class represents a native Vulkan instance, enabling Vulkan rendering onto a QSurf...
\inmodule QtGui
Definition qwindow.h:63
VkSurfaceKHR createSurface(QXcbWindow *window)
QXcbVulkanInstance(QVulkanInstance *instance)
void createOrAdoptInstance() override
void presentQueued(QWindow *window) override
bool supportsPresent(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, QWindow *window) override
Combined button and popup list for selecting options.
#define QByteArrayLiteral(str)
Definition qbytearray.h:52
QList< QByteArray > QByteArrayList
DBusConnection * connection
#define qWarning
Definition qlogging.h:166
GLfloat GLfloat GLfloat w
[0]
#define QStringLiteral(str)
QObject::connect nullptr
aWidget window() -> setWindowTitle("New Window Title")
[2]