Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qvulkaninstance.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
4#include "qvulkaninstance_p.h"
5#include <qpa/qplatformvulkaninstance.h>
6#include <qpa/qplatformintegration.h>
7#include <qpa/qplatformnativeinterface.h>
8#include <QtGui/private/qguiapplication_p.h>
9
11
213bool QVulkanInstancePrivate::ensureVulkan()
214{
215 if (!platformInst) {
216 platformInst.reset(QGuiApplicationPrivate::platformIntegration()->createPlatformVulkanInstance(q_ptr));
217 if (!platformInst) {
218 qWarning("QVulkanInstance: Failed to initialize Vulkan");
219 return false;
220 }
221 }
222 return true;
223}
224
225void QVulkanInstancePrivate::reset()
226{
227 qDeleteAll(deviceFuncs);
228 deviceFuncs.clear();
229 funcs.reset();
230 platformInst.reset();
231 vkInst = VK_NULL_HANDLE;
232 errorCode = VK_SUCCESS;
233}
234
240QVulkanInstance::QVulkanInstance()
241 : d_ptr(new QVulkanInstancePrivate(this))
242{
243}
244
250QVulkanInstance::~QVulkanInstance()
251{
252 destroy();
253}
254
382QVulkanInfoVector<QVulkanLayer> QVulkanInstance::supportedLayers()
383{
384 return d_ptr->ensureVulkan() ? d_ptr->platformInst->supportedLayers() : QVulkanInfoVector<QVulkanLayer>();
385}
386
397QVulkanInfoVector<QVulkanExtension> QVulkanInstance::supportedExtensions()
398{
399 return d_ptr->ensureVulkan() ? d_ptr->platformInst->supportedExtensions() : QVulkanInfoVector<QVulkanExtension>();
400}
401
419QVersionNumber QVulkanInstance::supportedApiVersion() const
420{
421 return d_ptr->ensureVulkan() ? d_ptr->platformInst->supportedApiVersion() : QVersionNumber();
422}
423
436void QVulkanInstance::setVkInstance(VkInstance existingVkInstance)
437{
438 if (isValid()) {
439 qWarning("QVulkanInstance already created; setVkInstance() has no effect");
440 return;
441 }
442
443 d_ptr->vkInst = existingVkInstance;
444}
445
452void QVulkanInstance::setFlags(Flags flags)
453{
454 if (isValid()) {
455 qWarning("QVulkanInstance already created; setFlags() has no effect");
456 return;
457 }
458
459 d_ptr->flags = flags;
460}
461
470void QVulkanInstance::setLayers(const QByteArrayList &layers)
471{
472 if (isValid()) {
473 qWarning("QVulkanInstance already created; setLayers() has no effect");
474 return;
475 }
476
477 d_ptr->layers = layers;
478}
479
495void QVulkanInstance::setExtensions(const QByteArrayList &extensions)
496{
497 if (isValid()) {
498 qWarning("QVulkanInstance already created; setExtensions() has no effect");
499 return;
500 }
501
502 d_ptr->extensions = extensions;
503}
504
527void QVulkanInstance::setApiVersion(const QVersionNumber &vulkanVersion)
528{
529 if (isValid()) {
530 qWarning("QVulkanInstance already created; setApiVersion() has no effect");
531 return;
532 }
533
534 d_ptr->apiVersion = vulkanVersion;
535}
536
554bool QVulkanInstance::create()
555{
556 if (isValid())
557 destroy();
558
559 if (!d_ptr->ensureVulkan())
560 return false;
561
562 d_ptr->platformInst->createOrAdoptInstance();
563
564 if (d_ptr->platformInst->isValid()) {
565 d_ptr->vkInst = d_ptr->platformInst->vkInstance();
566 d_ptr->layers = d_ptr->platformInst->enabledLayers();
567 d_ptr->extensions = d_ptr->platformInst->enabledExtensions();
568 d_ptr->errorCode = VK_SUCCESS;
569 d_ptr->funcs.reset(new QVulkanFunctions(this));
570 d_ptr->platformInst->setDebugFilters(d_ptr->debugFilters);
571 d_ptr->platformInst->setDebugUtilsFilters(d_ptr->debugUtilsFilters);
572 return true;
573 }
574
575 qWarning("Failed to create platform Vulkan instance");
576 if (d_ptr->platformInst) {
577 d_ptr->errorCode = d_ptr->platformInst->errorCode();
578 d_ptr->platformInst.reset();
579 } else {
580 d_ptr->errorCode = VK_NOT_READY;
581 }
582 return false;
583}
584
590void QVulkanInstance::destroy()
591{
592 d_ptr->reset();
593}
594
598bool QVulkanInstance::isValid() const
599{
600 return d_ptr->platformInst && d_ptr->platformInst->isValid();
601}
602
610VkResult QVulkanInstance::errorCode() const
611{
612 return d_ptr->errorCode;
613}
614
620VkInstance QVulkanInstance::vkInstance() const
621{
622 return d_ptr->vkInst;
623}
624
628QVulkanInstance::Flags QVulkanInstance::flags() const
629{
630 return d_ptr->flags;
631}
632
637QByteArrayList QVulkanInstance::layers() const
638{
639 return d_ptr->layers;
640}
641
646QByteArrayList QVulkanInstance::extensions() const
647{
648 return d_ptr->extensions;
649}
650
656QVersionNumber QVulkanInstance::apiVersion() const
657{
658 return d_ptr->apiVersion;
659}
660
667PFN_vkVoidFunction QVulkanInstance::getInstanceProcAddr(const char *name)
668{
669 // The return value is PFN_vkVoidFunction instead of QFunctionPointer or
670 // similar because on some platforms honoring VKAPI_PTR is important.
671 return d_ptr->platformInst->getInstanceProcAddr(name);
672}
673
679QPlatformVulkanInstance *QVulkanInstance::handle() const
680{
681 return d_ptr->platformInst.data();
682}
683
704QVulkanFunctions *QVulkanInstance::functions() const
705{
706 return d_ptr->funcs.data();
707}
708
739QVulkanDeviceFunctions *QVulkanInstance::deviceFunctions(VkDevice device)
740{
741 QVulkanDeviceFunctions *&f = d_ptr->deviceFuncs[device];
742 if (!f)
743 f = new QVulkanDeviceFunctions(this, device);
744 return f;
745}
746
760void QVulkanInstance::resetDeviceFunctions(VkDevice device)
761{
762 QVulkanDeviceFunctions *&f = d_ptr->deviceFuncs[device];
763 delete f;
764 f = nullptr;
765}
766
773VkSurfaceKHR QVulkanInstance::surfaceForWindow(QWindow *window)
774{
775 QPlatformNativeInterface *nativeInterface = qGuiApp->platformNativeInterface();
776 // VkSurfaceKHR is non-dispatchable and maps to a pointer on x64 and a uint64 on x86.
777 // Therefore a pointer is returned from the platform plugin, not the value itself.
778 void *p = nativeInterface->nativeResourceForWindow(QByteArrayLiteral("vkSurface"), window);
779 return p ? *static_cast<VkSurfaceKHR *>(p) : VK_NULL_HANDLE;
780}
781
789bool QVulkanInstance::supportsPresent(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, QWindow *window)
790{
791 return d_ptr->platformInst->supportsPresent(physicalDevice, queueFamilyIndex, window);
792}
793
805void QVulkanInstance::presentAboutToBeQueued(QWindow *window)
806{
807 d_ptr->platformInst->presentAboutToBeQueued(window);
808}
809
818void QVulkanInstance::presentQueued(QWindow *window)
819{
820 d_ptr->platformInst->presentQueued(window);
821}
822
859void QVulkanInstance::installDebugOutputFilter(DebugFilter filter)
860{
861 if (!d_ptr->debugFilters.contains(filter)) {
862 d_ptr->debugFilters.append(filter);
863 if (d_ptr->platformInst)
864 d_ptr->platformInst->setDebugFilters(d_ptr->debugFilters);
865 }
866}
867
878void QVulkanInstance::removeDebugOutputFilter(DebugFilter filter)
879{
880 d_ptr->debugFilters.removeOne(filter);
881 if (d_ptr->platformInst)
882 d_ptr->platformInst->setDebugFilters(d_ptr->debugFilters);
883}
884
937void QVulkanInstance::installDebugOutputFilter(DebugUtilsFilter filter)
938{
939 d_ptr->debugUtilsFilters.append(filter);
940 if (d_ptr->platformInst)
941 d_ptr->platformInst->setDebugUtilsFilters(d_ptr->debugUtilsFilters);
942}
943
953void QVulkanInstance::clearDebugOutputFilters()
954{
955 d_ptr->debugFilters.clear();
956 d_ptr->debugUtilsFilters.clear();
957 if (d_ptr->platformInst) {
958 d_ptr->platformInst->setDebugFilters(d_ptr->debugFilters);
959 d_ptr->platformInst->setDebugUtilsFilters(d_ptr->debugUtilsFilters);
960 }
961}
962
963#ifndef QT_NO_DEBUG_STREAM
965{
966 QDebugStateSaver saver(dbg);
967 dbg.nospace() << "QVulkanLayer(" << layer.name << " " << layer.version
968 << " " << layer.specVersion << " " << layer.description << ")";
969 return dbg;
970}
971
973{
974 QDebugStateSaver saver(dbg);
975 dbg.nospace() << "QVulkanExtension(" << extension.name << " " << extension.version << ")";
976 return dbg;
977}
978#endif
979
IOBluetoothDevice * device
\inmodule QtCore
\inmodule QtCore
\inmodule QtCore
static QPlatformIntegration * platformIntegration()
The QPlatformNativeInterface class provides an abstraction for retrieving native resource handles.
virtual void * nativeResourceForWindow(const QByteArray &resource, QWindow *window)
The QPlatformVulkanInstance class provides an abstraction for Vulkan instances.
\inmodule QtCore
The QVulkanDeviceFunctions class provides cross-platform access to the device level core Vulkan 1....
\inmodule QtGui
The QVulkanFunctions class provides cross-platform access to the instance level core Vulkan 1....
\inmodule QtGui
\inmodule QtGui
\inmodule QtGui
Definition qwindow.h:63
static VulkanServerBufferGlFunctions * funcs
void extension()
[6]
Definition dialogs.cpp:230
#define this
Definition dialogs.cpp:9
qDeleteAll(list.begin(), list.end())
Combined button and popup list for selecting options.
#define QByteArrayLiteral(str)
Definition qbytearray.h:52
const EGLAttrib EGLOutputLayerEXT * layers
EGLOutputLayerEXT layer
Flags
#define qGuiApp
#define qWarning
Definition qlogging.h:162
GLfloat GLfloat f
GLbitfield flags
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLuint name
GLfloat GLfloat p
[1]
QDebug operator<<(QDebug dbg, const QVulkanLayer &layer)
aWidget window() -> setWindowTitle("New Window Title")
[2]