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
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
251QVulkanInstance::~QVulkanInstance()
252{
253 destroy();
254}
255
383QVulkanInfoVector<QVulkanLayer> QVulkanInstance::supportedLayers()
384{
385 return d_ptr->ensureVulkan() ? d_ptr->platformInst->supportedLayers() : QVulkanInfoVector<QVulkanLayer>();
386}
387
398QVulkanInfoVector<QVulkanExtension> QVulkanInstance::supportedExtensions()
399{
400 return d_ptr->ensureVulkan() ? d_ptr->platformInst->supportedExtensions() : QVulkanInfoVector<QVulkanExtension>();
401}
402
420QVersionNumber QVulkanInstance::supportedApiVersion() const
421{
422 return d_ptr->ensureVulkan() ? d_ptr->platformInst->supportedApiVersion() : QVersionNumber();
423}
424
437void QVulkanInstance::setVkInstance(VkInstance existingVkInstance)
438{
439 if (isValid()) {
440 qWarning("QVulkanInstance already created; setVkInstance() has no effect");
441 return;
442 }
443
444 d_ptr->vkInst = existingVkInstance;
445}
446
453void QVulkanInstance::setFlags(Flags flags)
454{
455 if (isValid()) {
456 qWarning("QVulkanInstance already created; setFlags() has no effect");
457 return;
458 }
459
460 d_ptr->flags = flags;
461}
462
471void QVulkanInstance::setLayers(const QByteArrayList &layers)
472{
473 if (isValid()) {
474 qWarning("QVulkanInstance already created; setLayers() has no effect");
475 return;
476 }
477
478 d_ptr->layers = layers;
479}
480
496void QVulkanInstance::setExtensions(const QByteArrayList &extensions)
497{
498 if (isValid()) {
499 qWarning("QVulkanInstance already created; setExtensions() has no effect");
500 return;
501 }
502
503 d_ptr->extensions = extensions;
504}
505
528void QVulkanInstance::setApiVersion(const QVersionNumber &vulkanVersion)
529{
530 if (isValid()) {
531 qWarning("QVulkanInstance already created; setApiVersion() has no effect");
532 return;
533 }
534
535 d_ptr->apiVersion = vulkanVersion;
536}
537
555bool QVulkanInstance::create()
556{
557 if (isValid())
558 destroy();
559
560 if (!d_ptr->ensureVulkan())
561 return false;
562
563 d_ptr->platformInst->createOrAdoptInstance();
564
565 if (d_ptr->platformInst->isValid()) {
566 d_ptr->vkInst = d_ptr->platformInst->vkInstance();
567 d_ptr->layers = d_ptr->platformInst->enabledLayers();
568 d_ptr->extensions = d_ptr->platformInst->enabledExtensions();
569 d_ptr->errorCode = VK_SUCCESS;
570 d_ptr->funcs.reset(new QVulkanFunctions(this));
571 d_ptr->platformInst->setDebugFilters(d_ptr->debugFilters);
572 d_ptr->platformInst->setDebugUtilsFilters(d_ptr->debugUtilsFilters);
573 return true;
574 }
575
576 qWarning("Failed to create platform Vulkan instance");
577 if (d_ptr->platformInst) {
578 d_ptr->errorCode = d_ptr->platformInst->errorCode();
579 d_ptr->platformInst.reset();
580 } else {
581 d_ptr->errorCode = VK_NOT_READY;
582 }
583 return false;
584}
585
591void QVulkanInstance::destroy()
592{
593 d_ptr->reset();
594}
595
599bool QVulkanInstance::isValid() const
600{
601 return d_ptr->platformInst && d_ptr->platformInst->isValid();
602}
603
611VkResult QVulkanInstance::errorCode() const
612{
613 return d_ptr->errorCode;
614}
615
621VkInstance QVulkanInstance::vkInstance() const
622{
623 return d_ptr->vkInst;
624}
625
629QVulkanInstance::Flags QVulkanInstance::flags() const
630{
631 return d_ptr->flags;
632}
633
638QByteArrayList QVulkanInstance::layers() const
639{
640 return d_ptr->layers;
641}
642
647QByteArrayList QVulkanInstance::extensions() const
648{
649 return d_ptr->extensions;
650}
651
657QVersionNumber QVulkanInstance::apiVersion() const
658{
659 return d_ptr->apiVersion;
660}
661
668PFN_vkVoidFunction QVulkanInstance::getInstanceProcAddr(const char *name)
669{
670 // The return value is PFN_vkVoidFunction instead of QFunctionPointer or
671 // similar because on some platforms honoring VKAPI_PTR is important.
672 return d_ptr->platformInst->getInstanceProcAddr(name);
673}
674
680QPlatformVulkanInstance *QVulkanInstance::handle() const
681{
682 return d_ptr->platformInst.data();
683}
684
705QVulkanFunctions *QVulkanInstance::functions() const
706{
707 return d_ptr->funcs.data();
708}
709
740QVulkanDeviceFunctions *QVulkanInstance::deviceFunctions(VkDevice device)
741{
742 QVulkanDeviceFunctions *&f = d_ptr->deviceFuncs[device];
743 if (!f)
744 f = new QVulkanDeviceFunctions(this, device);
745 return f;
746}
747
761void QVulkanInstance::resetDeviceFunctions(VkDevice device)
762{
763 QVulkanDeviceFunctions *&f = d_ptr->deviceFuncs[device];
764 delete f;
765 f = nullptr;
766}
767
774VkSurfaceKHR QVulkanInstance::surfaceForWindow(QWindow *window)
775{
776 QPlatformNativeInterface *nativeInterface = qGuiApp->platformNativeInterface();
777 // VkSurfaceKHR is non-dispatchable and maps to a pointer on x64 and a uint64 on x86.
778 // Therefore a pointer is returned from the platform plugin, not the value itself.
779 void *p = nativeInterface->nativeResourceForWindow(QByteArrayLiteral("vkSurface"), window);
780 return p ? *static_cast<VkSurfaceKHR *>(p) : VK_NULL_HANDLE;
781}
782
790bool QVulkanInstance::supportsPresent(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, QWindow *window)
791{
792 return d_ptr->platformInst->supportsPresent(physicalDevice, queueFamilyIndex, window);
793}
794
806void QVulkanInstance::presentAboutToBeQueued(QWindow *window)
807{
808 d_ptr->platformInst->presentAboutToBeQueued(window);
809}
810
819void QVulkanInstance::presentQueued(QWindow *window)
820{
821 d_ptr->platformInst->presentQueued(window);
822}
823
860void QVulkanInstance::installDebugOutputFilter(DebugFilter filter)
861{
862 if (!d_ptr->debugFilters.contains(filter)) {
863 d_ptr->debugFilters.append(filter);
864 if (d_ptr->platformInst)
865 d_ptr->platformInst->setDebugFilters(d_ptr->debugFilters);
866 }
867}
868
879void QVulkanInstance::removeDebugOutputFilter(DebugFilter filter)
880{
881 d_ptr->debugFilters.removeOne(filter);
882 if (d_ptr->platformInst)
883 d_ptr->platformInst->setDebugFilters(d_ptr->debugFilters);
884}
885
938void QVulkanInstance::installDebugOutputFilter(DebugUtilsFilter filter)
939{
940 d_ptr->debugUtilsFilters.append(filter);
941 if (d_ptr->platformInst)
942 d_ptr->platformInst->setDebugUtilsFilters(d_ptr->debugUtilsFilters);
943}
944
954void QVulkanInstance::clearDebugOutputFilters()
955{
956 d_ptr->debugFilters.clear();
957 d_ptr->debugUtilsFilters.clear();
958 if (d_ptr->platformInst) {
959 d_ptr->platformInst->setDebugFilters(d_ptr->debugFilters);
960 d_ptr->platformInst->setDebugUtilsFilters(d_ptr->debugUtilsFilters);
961 }
962}
963
964#ifndef QT_NO_DEBUG_STREAM
966{
967 QDebugStateSaver saver(dbg);
968 dbg.nospace() << "QVulkanLayer(" << layer.name << " " << layer.version
969 << " " << layer.specVersion << " " << layer.description << ")";
970 return dbg;
971}
972
974{
975 QDebugStateSaver saver(dbg);
976 dbg.nospace() << "QVulkanExtension(" << extension.name << " " << extension.version << ")";
977 return dbg;
978}
979#endif
980
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
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:166
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]