QVulkanInstance Class
Die Klasse QVulkanInstance repräsentiert eine native Vulkan-Instanz, die das Rendering von Vulkan auf QSurface ermöglicht. ...
Kopfzeile: | #include <QVulkanInstance> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake: | QT += gui |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- QVulkanInstance ist Teil von Rendering in 3D.
Öffentliche Typen
DebugFilter | |
(since 6.5) enum | DebugMessageSeverityFlag { VerboseSeverity, InfoSeverity, WarningSeverity, ErrorSeverity } |
flags | DebugMessageSeverityFlags |
(since 6.5) enum | DebugMessageTypeFlag { GeneralMessage, ValidationMessage, PerformanceMessage } |
flags | DebugMessageTypeFlags |
(since 6.5) | DebugUtilsFilter |
enum | Flag { NoDebugOutputRedirect, NoPortabilityDrivers } |
flags | Flags |
Öffentliche Funktionen
QVulkanInstance() | |
~QVulkanInstance() | |
QVersionNumber | apiVersion() const |
(since 6.5) void | clearDebugOutputFilters() |
bool | create() |
void | destroy() |
QVulkanDeviceFunctions * | deviceFunctions(VkDevice device) |
VkResult | errorCode() const |
QByteArrayList | extensions() const |
QVulkanInstance::Flags | flags() const |
QVulkanFunctions * | functions() const |
PFN_vkVoidFunction | getInstanceProcAddr(const char *name) |
(since 6.5) void | installDebugOutputFilter(QVulkanInstance::DebugUtilsFilter filter) |
void | installDebugOutputFilter(QVulkanInstance::DebugFilter filter) |
bool | isValid() const |
QByteArrayList | layers() const |
void | presentAboutToBeQueued(QWindow *window) |
void | presentQueued(QWindow *window) |
void | removeDebugOutputFilter(QVulkanInstance::DebugFilter filter) |
void | resetDeviceFunctions(VkDevice device) |
void | setApiVersion(const QVersionNumber &vulkanVersion) |
void | setExtensions(const QByteArrayList &extensions) |
void | setFlags(QVulkanInstance::Flags flags) |
void | setLayers(const QByteArrayList &layers) |
void | setVkInstance(VkInstance existingVkInstance) |
QVersionNumber | supportedApiVersion() const |
QVulkanInfoVector<QVulkanExtension> | supportedExtensions() const |
QVulkanInfoVector<QVulkanLayer> | supportedLayers() const |
bool | supportsPresent(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, QWindow *window) |
VkInstance | vkInstance() const |
Statische öffentliche Mitglieder
VkSurfaceKHR | surfaceForWindow(QWindow *window) |
Detaillierte Beschreibung
Vulkan ist eine plattformübergreifende, explizite Grafik- und Berechnungs-API. Diese Klasse bietet Unterstützung für das Laden einer Vulkan-Bibliothek und die Erstellung einer instance
auf plattformübergreifende Weise. Eine Einführung in Vulkan-Instanzen finden Sie in Abschnitt 3.2 der Spezifikation.
Hinweis: Plattformspezifische Unterstützung für Vulkan-Instanzen und Fenster mit Vulkan-fähigen Oberflächen wird von den verschiedenen Plattform-Plugins bereitgestellt. Nicht alle von ihnen unterstützen jedoch Vulkan. Wenn es auf einer solchen Plattform läuft, schlägt create() fehl und gibt immer false
zurück.
Hinweis: Es kann sein, dass die Vulkan-Unterstützung für ein bestimmtes Qt-Build automatisch deaktiviert wird, weil die notwendigen Vulkan-Header zur Build-Zeit nicht verfügbar sind. Wenn dies der Fall ist und die Ausgabe von configure
anzeigt, dass die Vulkan-Unterstützung deaktiviert ist, werden die QVulkan*-Klassen nicht verfügbar sein.
Hinweis: Einige Funktionen haben ihre Signatur zwischen den verschiedenen Vulkan-Header-Revisionen geändert. Wenn Qt gebaut wird und nur Header mit den alten, widersprüchlichen Signaturen in einem System vorhanden sind, wird die Vulkan-Unterstützung deaktiviert. Es wird empfohlen, Header von Vulkan 1.0.39 oder neuer zu verwenden.
Initialisierung
Ähnlich wie bei QOpenGLContext erfolgt die tatsächliche Erstellung einer Vulkan-Instanz nur beim Aufruf von create(). Dies ermöglicht die Verwendung von QVulkanInstance als einfache Member-Variable, während die Kontrolle darüber behalten wird, wann die Initialisierung durchgeführt werden soll.
Die Abfrage der unterstützten Instanz-Ebenen und Erweiterungen ist durch die Aufrufe supportedLayers() und supportedExtensions() möglich. Diese stellen sicher, dass die Vulkan-Bibliothek geladen ist und können daher auch sicher vor create() aufgerufen werden.
Instanzen speichern den Vulkan-Status pro Anwendung, und das Erstellen eines VkInstance
Objekts initialisiert die Vulkan-Bibliothek. In der Praxis wird typischerweise eine einzelne Instanz zu Beginn von main() erstellt. Das Objekt bleibt dann bis zum Beenden der Anwendung bestehen.
Jede Vulkan-basierte QWindow muss mit einer QVulkanInstance verbunden werden, indem QWindow::setVulkanInstance() aufgerufen wird. Ein typisches Anwendungsmuster sieht also wie folgt aus:
int main(int argc, char **argv) { QGuiApplication app(argc, argv); QVulkanInstance inst; if (!inst.create()) return 1; // ... window->setVulkanInstance(&inst); window->show(); return app.exec(); }
Konfiguration
QVulkanInstance aktiviert automatisch den minimalen Satz von Erweiterungen, den es für die neu erstellte Instanz benötigt. In der Praxis bedeutet dies die VK_KHR_*_surface
Familie von Erweiterungen.
Standardmäßig wird die Vulkan-Debug-Ausgabe, z.B. Nachrichten von den Validierungsschichten, an qDebug() geleitet. Dies kann deaktiviert werden, indem das Flag NoDebugOutputRedirect
an setFlags() übergeben wird , bevor create() aufgerufen wird.
Um zusätzliche Schichten und Erweiterungen zu aktivieren, geben Sie die Liste über setLayers() und setExtensions() an , bevor Sie create() aufrufen. Wenn eine bestimmte Ebene oder Erweiterung von der Instanz als nicht verfügbar gemeldet wird, wird die Anfrage ignoriert. Nach einem erfolgreichen Aufruf von create() geben die von Funktionen wie layers() und extensions() zurückgegebenen Werte die tatsächlich aktivierten Schichten und Erweiterungen wieder. Bei Bedarf, zum Beispiel um zu vermeiden, dass Erweiterungen angefordert werden, die in Konflikt stehen und somit die Erstellung der Vulkan-Instanz fehlschlagen würde, kann die Liste der tatsächlich unterstützten Ebenen und Erweiterungen über supportedLayers() und supportedExtensions() vor dem Aufruf von create() überprüft werden.
Um beispielsweise die Standard-Validierungsschichten zu aktivieren, könnte man wie folgt vorgehen:
QVulkanInstance inst; // Enable validation layer, if supported. Messages go to qDebug by default. inst.setLayers({ "VK_LAYER_KHRONOS_validation" }); bool ok = inst.create(); if (!ok) { // ... Vulkan not available } if (!inst.layers().contains("VK_LAYER_KHRONOS_validation")) { // ... validation layer not available }
Oder, alternativ, um Entscheidungen zu treffen, bevor man versucht, eine Vulkan-Instanz zu erstellen:
QVulkanInstance inst; if (inst.supportedLayers().contains("VK_LAYER_KHRONOS_validation")) { // ... } bool ok = inst.create(); // ...
Übernahme einer bestehenden Instanz
Standardmäßig erstellt QVulkanInstance eine neue Vulkan-Instanz. Bei der Arbeit mit externen Engines und Renderern kann dies manchmal nicht wünschenswert sein. Wenn bereits ein VkInstance
-Handle vorhanden ist, rufen Sie setVkInstance() auf, bevor Sie create() aufrufen. Auf diese Weise werden keine zusätzlichen Instanzen erstellt und QVulkanInstance besitzt das Handle nicht.
Hinweis: Es liegt an der Komponente, die die externe Instanz erzeugt, sicherzustellen, dass die notwendigen Erweiterungen aktiviert sind. Diese sind: VK_KHR_surface
Die WSI-spezifische VK_KHR_*_surface
, die für die betreffende Plattform geeignet ist, und VK_EXT_debug_utils
für den Fall, dass die Umleitung der Debug-Ausgabe von QVulkanInstance gewünscht wird.
Zugriff auf Kern-Vulkan-Befehle
Um auf das VkInstance
-Handle zuzugreifen, das QVulkanInstance umhüllt, rufen Sie vkInstance() auf. Um Vulkan-Funktionen aufzulösen, rufen Sie getInstanceProcAddr() auf. Für zentrale Vulkan-Befehle ist eine manuelle Auflösung nicht notwendig, da sie über die Objekte QVulkanFunctions und QVulkanDeviceFunctions bereitgestellt werden, die über functions() und deviceFunctions() zugänglich sind.
Hinweis: QVulkanFunctions und QVulkanDeviceFunctions werden beim Erstellen der Qt-Bibliotheken aus den XML-Spezifikationen der Vulkan-API generiert. Daher wird für sie keine Dokumentation bereitgestellt. Sie enthalten die Vulkan 1.2-Funktionen mit denselben Signaturen wie in der Vulkan-API-Dokumentation beschrieben.
Abrufen einer nativen Vulkan-Oberfläche für ein Fenster
Die beiden häufigsten fenstersystemspezifischen Operationen sind das Abrufen einer Oberfläche (ein VkSurfaceKHR
-Handle) für ein Fenster und die Abfrage, ob eine bestimmte Warteschlangenfamilie die Darstellung einer bestimmten Oberfläche unterstützt. Um WSI-spezifische Bits in den Anwendungen zu vermeiden, werden diese von QVulkanInstance und den darunter liegenden QPA-Schichten abstrahiert.
Um eine Vulkan-Oberfläche für ein Fenster zu erstellen oder eine vorhandene Oberfläche abzurufen, rufen Sie surfaceForWindow() auf. Die meisten Plattformen erstellen die Oberfläche nur über VK_KHR_*_surface
beim ersten Aufruf von surfaceForWindow(), aber es kann plattformspezifische Abweichungen im internen Verhalten geben. Nach der Erstellung geben nachfolgende Aufrufe von surfaceForWindow() einfach das gleiche Handle zurück. Dies passt gut zur Struktur typischer Vulkan-aktivierter QWindow Unterklassen.
Um abzufragen, ob eine bestimmte Warteschlangenfamilie innerhalb eines physischen Geräts verwendet werden kann, um die Darstellung auf einer bestimmten Oberfläche durchzuführen, rufen Sie supportsPresent() auf. Dies kapselt sowohl die generischen vkGetPhysicalDeviceSurfaceSupportKHR
als auch die WSI-spezifischen vkGetPhysicalDevice*PresentationSupportKHR
Prüfungen.
Fehlersuche
Neben der Rückgabe von false
von create() oder 0
von surfaceForWindow() werden kritische Fehler auch über qWarning() in der Debug-Ausgabe ausgegeben. Zusätzliches Logging kann angefordert werden, indem die Debug-Ausgabe für die Logging-Kategorie qt.vulkan
aktiviert wird. Der aktuelle Vulkan-Fehlercode der Instanzerstellung kann durch den Aufruf von errorCode() nach einem fehlgeschlagenen create() abgerufen werden.
In einigen speziellen Fällen kann es notwendig sein, den Namen der Vulkan-Bibliothek zu überschreiben. Dies kann durch Setzen der Umgebungsvariablen QT_VULKAN_LIB
erreicht werden.
Beispiel
Im Folgenden finden Sie die Grundzüge der Erstellung einer Vulkan-fähigen QWindow:
class VulkanWindow : public QWindow {public: VulkanWindow() { setSurfaceType(VulkanSurface); } void exposeEvent(QExposeEvent *) { if (isExposed()) { if (!m_initialized) { m_initialized = true; // Gerät, Swapchain, etc. initialisieren QVulkanInstance *inst = vulkanInstance(); QVulkanFunctions *f = inst->functions(); uint32_t devCount = 0; f->vkEnumeratePhysicalDevices(inst->vkInstance(), &devCount, nullptr); // ... // den ersten Frame erzeugenrender(); } } } bool event(QEvent *e) { if (e->type() == QEvent::UpdateRequest) render(); return QWindow::event(e); } void render() { // ...requestUpdate(); // kontinuierlich rendern}private: bool m_initialized = false; };int main(int argc, char**argv) { QGuiApplication app(argc, argv); QVulkanInstance inst; if (!inst.create()) { qWarning("Vulkan not available"); return 1; } VulkanWindow window; window.showMaximized(); return app.exec(); }
Hinweis: Zusätzlich zu expose muss sich eine gut funktionierende Fensterimplementierung auch um zusätzliche Ereignisse wie resize und QPlatformSurfaceEvent kümmern, um eine korrekte Verwaltung der Swap-Kette zu gewährleisten. Außerdem kann es bei einigen Plattformen erforderlich sein, Ressourcen freizugeben, wenn sie nicht mehr exponiert werden.
Verwendung von C++ Bindungen für Vulkan
Die Kombination von Qt's Vulkan Enablern mit einem C++ Vulkan Wrapper, zum Beispiel Vulkan-Hpp, ist ebenfalls möglich. Die Voraussetzung dafür ist, dass die C++-Schicht in der Lage sein muss, native Handles (VkInstance, VkSurfaceKHR) in ihre Klassen zu übernehmen, ohne den Besitz zu übernehmen (da der Besitz bei QVulkanInstance und QWindow bleibt). Betrachten Sie auch das Folgende:
- Einige Wrapper erfordern, dass die Unterstützung von Exceptions aktiviert ist. Qt verwendet keine Ausnahmen. Um Ausnahmen für die Anwendung zu aktivieren, fügen Sie
CONFIG += exceptions
zur Datei.pro
hinzu. - Einige Wrapper rufen Vulkan-Funktionen direkt auf, vorausgesetzt
vulkan.h
stellt Prototypen zur Verfügung und die Anwendung verlinkt auf eine Vulkan-Bibliothek, die alle notwendigen Symbole exportiert. Qt kann nicht direkt mit einer Vulkan-Bibliothek verknüpft werden. Daher kann es auf einigen Plattformen notwendig sein,LIBS += -lvulkan
oder ähnliches in der.pro
Datei der Anwendung hinzuzufügen. - Die Header für die QVulkan-Klassen können
vulkan.h
enthalten, wobeiVK_NO_PROTOTYPES
aktiviert ist. Dies kann zu Problemen in C++-Wrapper-Headern führen, die auf den Prototypen basieren. Daher kann es im Anwendungscode notwendig sein,vulkan.hpp
oder ähnliches vor einem der QVulkan-Header einzubinden.
Siehe auch QVulkanFunctions und QSurface::SurfaceType.
Dokumentation der Mitgliedstypen
QVulkanInstance::DebugFilter
Typendefinition für Debug-Filter-Callback-Funktionen mit der folgenden Signatur:
bool myDebugFilter(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char *pLayerPrefix, const char *pMessage)
Die Rückgabe von true
unterdrückt das Drucken der Nachricht.
Hinweis: Beginnend mit Qt 6.5 wird VK_EXT_debug_utils
anstelle des veralteten VK_EXT_debug_report
verwendet. Die Callback-Signatur basiert auf VK_EXT_debug_report. Daher kann nicht mehr erwartet werden, dass alle Argumente gültig sind. Vermeiden Sie es, sich auf andere Argumente als pMessage
, messageCode
und object
zu verlassen. Anwendungen, die auf alle in VK_EXT_debug_utils spezifizierten Callback-Daten zugreifen wollen, sollten auf DebugUtilsFilter umsteigen.
Siehe auch installDebugOutputFilter() und removeDebugOutputFilter().
[since 6.5]
enum QVulkanInstance::DebugMessageSeverityFlag
flags QVulkanInstance::DebugMessageSeverityFlags
Konstante | Wert |
---|---|
QVulkanInstance::VerboseSeverity | 0x01 |
QVulkanInstance::InfoSeverity | 0x02 |
QVulkanInstance::WarningSeverity | 0x04 |
QVulkanInstance::ErrorSeverity | 0x08 |
Diese Aufzählung wurde in Qt 6.5 eingeführt.
Der Typ DebugMessageSeverityFlags ist ein Typedef für QFlags<DebugMessageSeverityFlag>. Er speichert eine ODER-Kombination von DebugMessageSeverityFlag-Werten.
[since 6.5]
enum QVulkanInstance::DebugMessageTypeFlag
flags QVulkanInstance::DebugMessageTypeFlags
Konstante | Wert |
---|---|
QVulkanInstance::GeneralMessage | 0x01 |
QVulkanInstance::ValidationMessage | 0x02 |
QVulkanInstance::PerformanceMessage | 0x04 |
Diese Aufzählung wurde in Qt 6.5 eingeführt.
Der Typ DebugMessageTypeFlags ist ein Typedef für QFlags<DebugMessageTypeFlag>. Er speichert eine OR-Kombination von DebugMessageTypeFlag-Werten.
[alias, since 6.5]
QVulkanInstance::DebugUtilsFilter
Typedef für Debug-Filter-Callback-Funktionen, mit der folgenden Signatur:
std::function<bool(DebugMessageSeverityFlags severity, DebugMessageTypeFlags type, const void *message)>;
Das Argument message
ist ein Zeiger auf die Struktur VkDebugUtilsMessengerCallbackDataEXT. Siehe die Dokumentation von VK_EXT_debug_utils
für Details. Die Qt-Header verwenden nicht den realen Typ, um eine Abhängigkeit von Post-1.0-Vulkan-Headern zu vermeiden.
Die Rückgabe von true
unterdrückt das Drucken der Nachricht.
Dieser Typedef wurde in Qt 6.5 eingeführt.
Siehe auch installDebugOutputFilter() und removeDebugOutputFilter().
enum QVulkanInstance::Flag
flags QVulkanInstance::Flags
Diese Aufzählung beschreibt die Flags, die an setFlags() übergeben werden können. Diese steuern das Verhalten von create().
Konstante | Wert | Beschreibung |
---|---|---|
QVulkanInstance::NoDebugOutputRedirect | 0x01 | Deaktiviert die Umleitung der Vulkan-Debug-Ausgabe (VK_EXT_debug_utils ) an qDebug. |
QVulkanInstance::NoPortabilityDrivers (since Qt 6.5) | 0x02 | Deaktiviert die Aufzählung von physischen Geräten, die als Vulkan-Portabilität markiert sind. |
Der Typ Flags ist ein Typedef für QFlags<Flag>. Er speichert eine ODER-Kombination von Flag-Werten.
Dokumentation der Mitgliedsfunktionen
QVulkanInstance::QVulkanInstance()
Konstruiert eine neue Instanz.
Hinweis: Im Konstruktor wird keine Vulkan-Initialisierung durchgeführt.
[noexcept]
QVulkanInstance::~QVulkanInstance()
Zerstörer.
Hinweis: vkInstance() gibt nullptr
zurück, sobald die Instanz zerstört ist.
QVersionNumber QVulkanInstance::apiVersion() const
Gibt die angeforderte Vulkan-API-Version zurück, mit der die Anwendung laufen soll, oder eine Null-Versionsnummer, wenn setApiVersion() nicht vor create() aufgerufen wurde.
Siehe auch setApiVersion().
[since 6.5]
void QVulkanInstance::clearDebugOutputFilters()
Entfernt alle Filterfunktionen, die zuvor durch installDebugOutputFilter() installiert wurden.
Hinweis: Diese Funktion kann vor create() aufgerufen werden.
Diese Funktion wurde in Qt 6.5 eingeführt.
Siehe auch installDebugOutputFilter().
bool QVulkanInstance::create()
Initialisiert die Vulkan-Bibliothek und erstellt eine neue oder übernimmt eine vorhandene Vulkan-Instanz.
Gibt bei Erfolg true zurück, false bei einem Fehler oder wenn Vulkan nicht unterstützt wird.
Bei Erfolg ist der Zeiger auf diese QVulkanInstance über vkInstance() abrufbar.
Die Vulkan-Instanz und -Bibliothek sind verfügbar, solange diese QVulkanInstance existiert oder bis destroy() aufgerufen wird.
Standardmäßig wird die VkInstance mit dem gesetzten Flag VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR erstellt. Das bedeutet, dass die physischen Vulkan-Portabilitätsgeräte ebenfalls aufgezählt werden. Wenn dies nicht erwünscht ist, setzen Sie das Flag NoPortabilityDrivers.
void QVulkanInstance::destroy()
Zerstört die zugrundeliegende Plattforminstanz und damit auch die VkInstance (wenn sie ihr gehört). Das Objekt QVulkanInstance kann durch erneuten Aufruf von create() weiterverwendet werden.
QVulkanDeviceFunctions *QVulkanInstance::deviceFunctions(VkDevice device)
Gibt das Objekt QVulkanDeviceFunctions zurück, das den Kern-Vulkan-Befehlssatz auf Geräteebene zur Verfügung stellt und garantiert plattformübergreifend funktionsfähig ist.
Hinweis: Die Vulkan-Funktionen im zurückgegebenen Objekt dürfen nur mit device oder einem untergeordneten Objekt (VkQueue, VkCommandBuffer) von device als erstem Parameter aufgerufen werden. Dies liegt daran, dass diese Funktionen über vkGetDeviceProcAddr aufgelöst werden, um den potenziellen Overhead des internen Dispatchings zu vermeiden.
Hinweis: Das zurückgegebene Objekt gehört der QVulkanInstance und wird von ihr verwaltet. Es darf nicht zerstört oder verändert werden.
Hinweis: Das Objekt wird zwischengespeichert, so dass ein erneuter Aufruf dieser Funktion mit demselben device eine billige Operation ist. Wenn das Gerät jedoch zerstört wird, liegt es an der Anwendung, QVulkanInstance durch den Aufruf von resetDeviceFunctions() zu benachrichtigen.
Die Funktionen der Kern-API von Vulkan 1.0 werden immer verfügbar sein. Bei höheren Vulkan-Versionen, wie 1.1 und 1.2, versucht das QVulkanDeviceFunctions -Objekt, die Kern-API-Funktionen auch für diese aufzulösen, aber wenn das physische Vulkan-Gerät zur Laufzeit keine Unterstützung für diese bietet, führt der Aufruf einer solchen nicht unterstützten Funktion zu einem nicht spezifizierten Verhalten. Um die Unterstützung für Vulkan-Versionen höher als 1.0 ordnungsgemäß zu aktivieren, muss möglicherweise eine geeignete Instanz-API-Version durch den Aufruf von setApiVersion() vor create() festgelegt werden. Darüber hinaus wird von Anwendungen erwartet, dass sie die apiVersion des physischen Geräts in VkPhysicalDeviceProperties überprüfen.
Siehe auch functions() und resetDeviceFunctions().
VkResult QVulkanInstance::errorCode() const
Gibt den Vulkan-Fehlercode nach einem fehlgeschlagenen create() zurück, ansonsten VK_SUCCESS
.
Der Wert ist normalerweise der Rückgabewert von vkCreateInstance() (wenn eine neue Vulkan-Instanz erstellt wird, anstatt eine bestehende zu übernehmen), kann aber auch VK_NOT_READY
sein, wenn das Plattform-Plugin Vulkan nicht unterstützt.
QByteArrayList QVulkanInstance::extensions() const
Gibt die aktivierten Instanzerweiterungen zurück, wenn create() aufgerufen wurde und erfolgreich war. Andernfalls die angeforderten Erweiterungen.
Siehe auch setExtensions().
QVulkanInstance::Flags QVulkanInstance::flags() const
Gibt die angeforderten Flags zurück.
Siehe auch setFlags().
QVulkanFunctions *QVulkanInstance::functions() const
Gibt das entsprechende QVulkanFunctions Objekt zurück, das den zentralen Vulkan-Befehlssatz mit Ausnahme der Funktionen auf Geräteebene bereitstellt und garantiert plattformübergreifend funktioniert.
Hinweis: Das zurückgegebene Objekt ist Eigentum von QVulkanInstance und wird von diesem verwaltet. Es darf nicht zerstört oder verändert werden.
Die Funktionen der Kern-API von Vulkan 1.0 sind immer verfügbar. Bei höheren Vulkan-Versionen, wie z. B. 1.1 und 1.2, versucht das Objekt QVulkanFunctions, die Kern-API-Funktionen auch für diese aufzulösen, aber wenn die Vulkan-Instanzimplementierung zur Laufzeit keine Unterstützung für diese bietet, führt der Aufruf einer solchen nicht unterstützten Funktion zu einem nicht spezifizierten Verhalten. Um die Unterstützung für Vulkan-Versionen höher als 1.0 zu aktivieren, muss außerdem eine geeignete Instanz-API-Version durch den Aufruf von setApiVersion() vor create() gesetzt werden. Um die Version der Vulkan-Implementierung auf Instanzebene abzufragen, rufen Sie supportedApiVersion() auf.
Siehe auch deviceFunctions() und supportedApiVersion().
PFN_vkVoidFunction QVulkanInstance::getInstanceProcAddr(const char *name)
Löst die Vulkan-Funktion mit der angegebenen name auf.
Für die wichtigsten Vulkan-Befehle sollten Sie stattdessen die Funktions-Wrapper verwenden, die über functions() und deviceFunctions() abgerufen werden können.
[since 6.5]
void QVulkanInstance::installDebugOutputFilter(QVulkanInstance::DebugUtilsFilter filter)
Installiert eine Funktion filter, die für jede Vulkan-Debug-Meldung aufgerufen wird. Wenn der Callback true
zurückgibt, wird die Nachricht gestoppt (herausgefiltert) und erscheint nicht in der Debug-Ausgabe.
Hinweis: Die Filterung ist nur wirksam, wenn NoDebugOutputRedirect nicht set ist. Die Installation von Filtern hat sonst keine Wirkung.
Hinweis: Diese Funktion kann vor create() aufgerufen werden.
Diese Funktion wurde in Qt 6.5 eingeführt.
Siehe auch clearDebugOutputFilters().
void QVulkanInstance::installDebugOutputFilter(QVulkanInstance::DebugFilter filter)
Dies ist eine überladene Funktion.
Installiert eine filter Funktion, die für jede Vulkan-Debug-Meldung aufgerufen wird. Wenn der Callback true
zurückgibt, wird die Nachricht gestoppt (herausgefiltert) und erscheint nicht in der Debug-Ausgabe.
Hinweis: Die Filterung ist nur wirksam, wenn NoDebugOutputRedirect nicht set ist. Die Installation von Filtern hat sonst keine Wirkung.
Hinweis: Diese Funktion kann vor create() aufgerufen werden.
Siehe auch removeDebugOutputFilter().
bool QVulkanInstance::isValid() const
Gibt true zurück, wenn create() erfolgreich war und die Instanz gültig ist.
QByteArrayList QVulkanInstance::layers() const
Gibt die aktivierten Instanzebenen zurück, wenn create() aufgerufen wurde und erfolgreich war. Andernfalls die angeforderten Ebenen.
Siehe auch setLayers().
void QVulkanInstance::presentAboutToBeQueued(QWindow *window)
Diese Funktion sollte vom Renderer der Anwendung aufgerufen werden, bevor eine aktuelle Operation in die Warteschlange für window gestellt wird.
Während dies auf einigen Plattformen kein Problem darstellt, können andere eine vom Windowing-System abhängige Synchronisation durchführen. Zum Beispiel wird auf Wayland zusätzlich eine wl_surface.frame-Anfrage gesendet, um zu verhindern, dass der Treiber für minimierte Fenster blockiert.
void QVulkanInstance::presentQueued(QWindow *window)
Diese Funktion sollte vom Renderer der Anwendung aufgerufen werden, nachdem eine aktuelle Operation in die Warteschlange für window gestellt wurde.
Während dies auf einigen Plattformen kein Problem darstellt, kann auf anderen eine vom Fenstersystem abhängige Synchronisation durchgeführt werden. Unter X11 zum Beispiel wird _NET_WM_SYNC_REQUEST_COUNTER
aktualisiert.
void QVulkanInstance::removeDebugOutputFilter(QVulkanInstance::DebugFilter filter)
Dies ist eine überladene Funktion.
Entfernt eine filter Funktion, die zuvor durch installDebugOutputFilter() installiert wurde.
Hinweis: Diese Funktion kann vor create() aufgerufen werden.
Siehe auch installDebugOutputFilter().
void QVulkanInstance::resetDeviceFunctions(VkDevice device)
Invalidiert und zerstört das Objekt QVulkanDeviceFunctions für das angegebene device.
Diese Funktion muss aufgerufen werden, wenn ein VkDevice, für das deviceFunctions() aufgerufen wurde, zerstört wird, während die Anwendung weiterlaufen soll, um möglicherweise später ein neues logisches Vulkan-Gerät zu erstellen.
Es besteht keine Notwendigkeit, diese Funktion vor der Zerstörung von QVulkanInstance aufzurufen, da die Aufräumarbeiten dann automatisch durchgeführt werden.
Siehe auch deviceFunctions().
void QVulkanInstance::setApiVersion(const QVersionNumber &vulkanVersion)
Gibt die höchste Vulkan-API-Version an, die die Anwendung verwenden soll.
Standardmäßig ist vulkanVersion gleich 0, was Vulkan 1.0 entspricht.
Hinweis: Diese Funktion kann nur vor create() aufgerufen werden und hat keinen Effekt, wenn sie danach aufgerufen wird.
Hinweis: Beachten Sie, dass Vulkan 1.1 das Verhalten in Bezug auf das Feld Vulkan API Version ändert. In Vulkan 1.0 führte die Angabe eines nicht unterstützten vulkanVersion dazu, dass create() mit VK_ERROR_INCOMPATIBLE_DRIVER
fehlschlug, wie es in der Spezifikation vorgeschrieben war. Ab Vulkan 1.1 verbietet die Spezifikation dies, der Treiber muss jede Version akzeptieren, ohne dass die Instanzerstellung fehlschlägt.
Anwendungsentwicklern wird empfohlen, sich mit den apiVersion
Hinweisen in der Vulkan-Spezifikation vertraut zu machen.
Siehe auch apiVersion() und supportedApiVersion().
void QVulkanInstance::setExtensions(const QByteArrayList &extensions)
Gibt die Liste der zu aktivierenden zusätzlichen Instanzen extensions an. Es ist sicher, auch nicht unterstützte Erweiterungen anzugeben, da diese ignoriert werden, wenn sie zur Laufzeit nicht unterstützt werden.
Hinweis: Die oberflächenbezogenen Erweiterungen, die von Qt benötigt werden (z.B. VK_KHR_win32_surface
), werden immer automatisch hinzugefügt, es ist nicht notwendig sie in diese Liste aufzunehmen.
Hinweis: VK_KHR_portability_enumeration
wird automatisch hinzugefügt, es sei denn, das NoPortabilityDrivers Flag ist gesetzt. Dieser Wert wurde in Qt 6.5 eingeführt.
Hinweis: Diese Funktion kann nur vor create() aufgerufen werden und hat keinen Effekt, wenn sie danach aufgerufen wird.
Siehe auch extensions().
void QVulkanInstance::setFlags(QVulkanInstance::Flags flags)
Konfiguriert das Verhalten von create() auf der Grundlage der angegebenen flags.
Hinweis: Diese Funktion kann nur vor create() aufgerufen werden und hat keine Wirkung, wenn sie danach aufgerufen wird.
Siehe auch flags().
void QVulkanInstance::setLayers(const QByteArrayList &layers)
Gibt die Liste der zu aktivierenden Instanzen layers an. Es ist sicher, auch nicht unterstützte Ebenen anzugeben, da diese ignoriert werden, wenn sie zur Laufzeit nicht unterstützt werden.
Hinweis: Diese Funktion kann nur vor create() aufgerufen werden und hat keinen Effekt, wenn sie danach aufgerufen wird.
Siehe auch layers().
void QVulkanInstance::setVkInstance(VkInstance existingVkInstance)
Bringt QVulkanInstance dazu, ein bestehendes VkInstance-Handle zu übernehmen, anstatt ein neues zu erstellen.
Hinweis: existingVkInstance muss mindestens VK_KHR_surface
und die entsprechenden WSI-spezifischen VK_KHR_*_surface
Erweiterungen aktiviert haben. Um sicherzustellen, dass die Umleitung der Debug-Ausgabe funktioniert, wird auch VK_EXT_debug_utils
benötigt.
Hinweis: Diese Funktion kann nur vor create() aufgerufen werden und hat keine Wirkung, wenn sie danach aufgerufen wird.
Siehe auch vkInstance().
QVersionNumber QVulkanInstance::supportedApiVersion() const
Gibt die Version der von der Vulkan-Implementierung unterstützten Funktionalität auf Instanzebene zurück.
In der Praxis ist dies entweder der Wert, der von vkEnumerateInstanceVersion zurückgegeben wird, wenn diese Funktion verfügbar ist (mit Vulkan 1.1 und neuer), oder 1.0.
Anwendungen, die ihre Vulkan-Funktionen und API-Nutzung davon abhängig machen wollen, welche Vulkan-Version zur Laufzeit verfügbar ist, können diese Funktion verwenden, um zu bestimmen, welche Version an setApiVersion() übergeben werden soll, bevor create() aufgerufen wird.
Hinweis: Diese Funktion kann vor create() aufgerufen werden.
Siehe auch setApiVersion().
QVulkanInfoVector<QVulkanExtension> QVulkanInstance::supportedExtensions() const
Gibt die Liste der unterstützten Erweiterungen auf Instanzebene zurück.
Hinweis: Diese Funktion kann vor create() aufgerufen werden.
QVulkanInfoVector<QVulkanLayer> QVulkanInstance::supportedLayers() const
Gibt die Liste der unterstützten Instanz-Ebenen zurück.
Hinweis: Diese Funktion kann vor create() aufgerufen werden.
bool QVulkanInstance::supportsPresent(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, QWindow *window)
Gibt true zurück, wenn die Warteschlangenfamilie mit queueFamilyIndex innerhalb der physicalDevice die Präsentation auf window unterstützt.
Rufen Sie diese Funktion auf, wenn Sie die Warteschlangen eines bestimmten Vulkan-Geräts untersuchen, um zu entscheiden, welche Warteschlange für die Präsentation verwendet werden kann.
[static]
VkSurfaceKHR QVulkanInstance::surfaceForWindow(QWindow *window)
Erzeugt oder holt das bereits vorhandene VkSurfaceKHR
-Handle für die angegebene window.
Gibt das Vulkan-Oberflächen-Handle zurück oder 0, wenn der Vorgang fehlgeschlagen ist.
VkInstance QVulkanInstance::vkInstance() const
Gibt das VkInstance-Handle zurück, das QVulkanInstance umhüllt, oder nullptr
, wenn create() noch nicht erfolgreich aufgerufen wurde und keine vorhandene Instanz über setVkInstance() bereitgestellt wurde.
Siehe auch setVkInstance().
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.