QVulkanInstance Class
Die Klasse „QVulkanInstance“ repräsentiert eine native Vulkan-Instanz und ermöglicht das Rendern mit Vulkan auf einem „ QSurface “. Mehr dazu...
| Header: | #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 „3D-Rendering“.
Ö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) |
Ausführliche Beschreibung
Vulkan ist eine plattformübergreifende, explizite Grafik- und Rechen-API. Diese Klasse bietet plattformübergreifende Unterstützung für das Laden einer Vulkan-Bibliothek und das Erstellen einer „ instance “. Eine Einführung in Vulkan-Instanzen finden Sie in Abschnitt 3.2 der Spezifikation.
Hinweis: Dieplattformspezifische Unterstützung für Vulkan-Instanzen und Fenster mit Vulkan-fähigen Oberflächen wird durch die verschiedenen Plattform-Plugins bereitgestellt. Allerdings unterstützen nicht alle davon Vulkan. Bei Ausführung auf einer solchen Plattform schlägt der Aufruf von ` create()` fehl und gibt stets ` false` zurück.
Hinweis: Die Vulkan-Unterstützung kann für einen bestimmten Qt-Build automatisch deaktiviert werden, wenn zum Zeitpunkt der Kompilierung die erforderlichen Vulkan-Header nicht verfügbar sind. Ist dies der Fall und zeigt die Ausgabe von ` configure `, dass die Vulkan-Unterstützung deaktiviert ist, stehen die `QVulkan*`-Klassen nicht zur Verfügung.
Hinweis: Bei einigen Funktionen hat sich die Signatur zwischen den verschiedenen Versionen der Vulkan-Header geändert. Wenn Qt kompiliert wird und auf dem System nur Header mit den alten, inkompatiblen Signaturen vorhanden sind, wird die Vulkan-Unterstützung deaktiviert. Es wird empfohlen, Header ab Vulkan 1.0.39 oder neuer zu verwenden.
Initialisierung
Ähnlich wie bei „ QOpenGLContext “ erfolgt die eigentliche Erstellung einer Vulkan-Instanz erst beim Aufruf von „ create()“. Dies ermöglicht die Verwendung von „QVulkanInstance“ als einfache Member-Variable, während gleichzeitig die Kontrolle darüber erhalten bleibt, wann die Initialisierung durchgeführt wird.
Das Abfragen der unterstützten Layer und Erweiterungen auf Instanzebene ist durch den Aufruf von ` 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 anwendungsspezifischen Vulkan-Status, und das Erstellen eines ` VkInstance `-Objekts initialisiert die Vulkan-Bibliothek. In der Praxis wird in der Regel frühzeitig in `main()` eine einzige Instanz erstellt. Das Objekt bleibt dann bis zum Beenden der Anwendung bestehen.
Jedes Vulkan-basierte ` QWindow ` muss durch den Aufruf von ` QWindow::setVulkanInstance()` mit einer `QVulkanInstance` verknüpft werden. Ein typisches Anwendungsmuster sieht daher 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 Mindestumfang an Erweiterungen, den es für die neu erstellte Instanz benötigt. In der Praxis bedeutet dies die Erweiterungsfamilie „ VK_KHR_*_surface “.
Standardmäßig wird die Vulkan-Debug-Ausgabe, beispielsweise Meldungen aus den Validierungsschichten, an ` qDebug()` weitergeleitet. Dies kann deaktiviert werden, indem vor dem Aufruf von ` create()` das Flag ` NoDebugOutputRedirect ` an ` setFlags()` übergeben wird.
Um zusätzliche Ebenen und Erweiterungen zu aktivieren, übergeben Sie die Liste über ` setLayers()` und ` setExtensions()`, bevor Sie ` create()` aufrufen. Wenn eine bestimmte Ebene oder Erweiterung von der Instanz nicht als verfügbar gemeldet wird, wird die Anfrage ignoriert. Nach einem erfolgreichen Aufruf von ` create()` spiegeln die von Funktionen wie ` layers()` und ` extensions()` zurückgegebenen Werte die tatsächlich aktivierten Layer und Erweiterungen wider. Bei Bedarf – beispielsweise um die Anforderung von Erweiterungen zu vermeiden, die zu Konflikten führen und somit die Erstellung der Vulkan-Instanz zum Scheitern bringen würden – kann die Liste der tatsächlich unterstützten Layer und Erweiterungen vor dem Aufruf von ` create()` über ` supportedLayers()` und ` supportedExtensions()` überprüft werden.
Um beispielsweise die Standard-Validierungs-Layer 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 bereits vor dem Versuch, eine Vulkan-Instanz zu erstellen, Entscheidungen zu treffen:
QVulkanInstance inst;
if (inst.supportedLayers().contains("VK_LAYER_KHRONOS_validation")) {
// ...
}
bool ok = inst.create();
// ...Eine vorhandene Instanz übernehmen
Standardmäßig erstellt `QVulkanInstance` eine neue Vulkan-Instanz. Bei der Arbeit mit externen Engines und Renderern ist dies jedoch manchmal nicht erwünscht. Wenn bereits ein ` VkInstance `-Handle verfügbar ist, rufen Sie ` setVkInstance()` auf, bevor Sie ` create()` aufrufen. Auf diese Weise werden keine zusätzlichen Instanzen erstellt, und `QVulkanInstance` übernimmt kein Eigentum an dem Handle.
Hinweis: Es obliegt der Komponente, die die externe Instanz erstellt, sicherzustellen, dass die erforderlichen Erweiterungen darauf aktiviert sind. Dazu gehören: „ VK_KHR_surface “, die für die jeweilige Plattform geeignete WSI-spezifische Erweiterung „ VK_KHR_*_surface “ sowie „ VK_EXT_debug_utils “, falls eine Umleitung der Debug-Ausgabe von „QVulkanInstance“ gewünscht wird.
Zugriff auf Core-Vulkan-Befehle
Um auf das von der `QVulkanInstance` umschlossene ` VkInstance `-Handle zuzugreifen, rufen Sie ` vkInstance()` auf. Um Vulkan-Funktionen aufzulösen, rufen Sie ` getInstanceProcAddr()` auf. Für Kernbefehle von Vulkan ist eine manuelle Auflösung nicht erforderlich, da diese über die Objekte ` QVulkanFunctions ` und ` QVulkanDeviceFunctions ` bereitgestellt werden, auf die über ` functions()` und ` deviceFunctions()` zugegriffen werden kann.
Hinweis: „ QVulkanFunctions “ und „ QVulkanDeviceFunctions “ werden beim Erstellen der Qt-Bibliotheken aus den Vulkan-API-XML-Spezifikationen generiert. Daher wird für sie keine Dokumentation bereitgestellt. Sie enthalten die Vulkan-1.2-Funktionen mit denselben Signaturen, wie sie in der Vulkan-API-Dokumentation beschrieben sind.
Abrufen einer nativen Vulkan-Oberfläche für ein Fenster
Die beiden gängigen, für das jeweilige Fenstersystem spezifischen Operationen sind das Abrufen einer Oberfläche (eines „ VkSurfaceKHR “-Handles) für ein Fenster und die Abfrage, ob eine bestimmte Queue-Familie die Darstellung auf einer bestimmten Oberfläche unterstützt. Um WSI-spezifische Elemente in den Anwendungen zu vermeiden, werden diese durch „QVulkanInstance“ und die zugrunde liegenden QPA-Schichten abstrahiert.
Um eine Vulkan-Oberfläche für ein Fenster zu erstellen oder eine vorhandene abzurufen, rufen Sie ` surfaceForWindow()` auf. Die meisten Plattformen erstellen die Surface erst beim ersten Aufruf von ` surfaceForWindow()` über ` VK_KHR_*_surface `, doch es kann plattformspezifische Abweichungen im internen Verhalten geben. Nach der Erstellung geben nachfolgende Aufrufe von ` surfaceForWindow()` lediglich denselben Handle zurück. Dies passt gut zur Struktur typischer, Vulkan-fähiger Unterklassen von ` QWindow `.
Um abzufragen, ob eine bestimmte Warteschlangenfamilie innerhalb eines physischen Geräts zur Darstellung auf einer bestimmten Oberfläche verwendet werden kann, rufen Sie ` supportsPresent()` auf. Dies kapselt sowohl die generische Prüfung ` vkGetPhysicalDeviceSurfaceSupportKHR ` als auch die WSI-spezifische Prüfung ` vkGetPhysicalDevice*PresentationSupportKHR `.
Fehlerbehebung
Neben der Rückgabe von ` false ` durch ` create()` oder ` 0 ` durch ` surfaceForWindow()` werden kritische Fehler auch über ` qWarning()` in die Debug-Ausgabe geschrieben. Zusätzliche Protokollierung kann durch Aktivieren der Debug-Ausgabe für die Protokollierungskategorie ` qt.vulkan` angefordert werden. Der tatsächliche Vulkan-Fehlercode aus der Instanzerstellung kann durch Aufruf von ` errorCode()` nach einem fehlgeschlagenen ` create()` abgerufen werden.
In einigen Sonderfällen kann es erforderlich sein, den Namen der Vulkan-Bibliothek zu überschreiben. Dies kann durch Setzen der Umgebungsvariablen ` QT_VULKAN_LIB ` erreicht werden.
Beispiel
Im Folgenden wird der grundlegende Ablauf zum Erstellen eines Vulkan-fähigen ` QWindow` beschrieben:
class VulkanWindow : public QWindow
{
public:
VulkanWindow() {
setSurfaceType(VulkanSurface);
}
void exposeEvent(QExposeEvent*) {
if (isExposed()) {
if (!m_initialized) {
m_initialized = true;
// Gerät, Swapchain usw. initialisieren.
QVulkanInstance*inst = vulkanInstance();
QVulkanFunctions*f = inst->functions();
uint32_t devCount = 0;
f->vkEnumeratePhysicalDevices(inst->vkInstance(), &devCount, nullptr);
// ...
// Erstellen des ersten Frames
render();
}
}
}
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: Neben der Freigabe („expose“) muss eine ordnungsgemäß funktionierende Fensterimplementierung auch zusätzliche Ereignisse wie „resize“ und „ QPlatformSurfaceEvent “ berücksichtigen, um eine ordnungsgemäße Verwaltung der Swap-Chain zu gewährleisten. Darüber hinaus kann es auf einigen Plattformen erforderlich sein, Ressourcen freizugeben, wenn das Fenster nicht mehr freigegeben ist.
Verwendung von C++-Bindings für Vulkan
Die Kombination der Vulkan-Enabler von Qt mit einem C++-Vulkan-Wrapper, beispielsweise Vulkan-Hpp, ist ebenfalls möglich. Voraussetzung hierfür ist, dass die C++-Schicht in der Lage sein muss, native Handles (VkInstance, VkSurfaceKHR) in ihren Klassen zu übernehmen, ohne die Eigentumsrechte zu übernehmen (da diese bei QVulkanInstance und QWindow verbleiben). Beachten Sie außerdem Folgendes:
- Bei einigen Wrappern muss die Unterstützung für Ausnahmen aktiviert sein. 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, wobei davon ausgegangen wird, dass „
vulkan.h“ Prototypen bereitstellt und die Anwendung mit einer Vulkan-Bibliothek verknüpft ist, die alle erforderlichen Symbole exportiert. Qt verknüpft möglicherweise nicht direkt mit einer Vulkan-Bibliothek. Daher kann es auf einigen Plattformen erforderlich sein, „LIBS += -lvulkan“ oder Ähnliches in die Datei „.pro“ der Anwendung einzufügen. - Die Header-Dateien für die QVulkan-Klassen können „
vulkan.h“ enthalten, wobei „VK_NO_PROTOTYPES“ aktiviert ist. Dies kann zu Problemen in C++-Wrapper-Header-Dateien führen, die auf den Prototypen basieren. Daher kann es im Anwendungscode erforderlich sein, „vulkan.hpp“ oder Ähnliches vor den QVulkan-Header-Dateien einzubinden.
Sicherheitshinweise
Die Vulkan-Implementierung, d. h. der Vulkan-Loader, die Treiber und alle aktivierten Schichten, ist eine vertrauenswürdige, prozessinterne Plattformabhängigkeit. Qt lädt sie und ruft sie direkt auf, ohne Sandboxing oder Überprüfung, genauso wie es die OpenGL-Implementierung behandelt.
Alle Daten, die von `QVulkanInstance` und den darauf aufbauenden Klassen wie ` QVulkanWindow ` und ` QRhi ` mit ihrem Vulkan-Backend verwendet werden, gelten als vertrauenswürdige Inhalte. Dazu gehören die an ` setLayers()` und ` setExtensions()` übergebenen Layer- und Erweiterungsnamen, ein natives ` VkInstance `-Handle, das über ` setVkInstance()` übernommen wurde, sowie alle von der Anwendung generierten Rendering-Inhalte und Vulkan-Befehlsparameter.
Warnung: Anwendungsentwicklern wird empfohlen, die möglichen Auswirkungen sorgfältig abzuwägen, bevor sie die Einbindung von benutzergenerierten Inhalten zulassen, die nicht Teil der Anwendung sind und sich nicht unter der Kontrolle der Entwickler befinden.
Siehe auch QVulkanFunctions und QSurface::SurfaceType.
Dokumentation zu Mitgliedstypen
QVulkanInstance::DebugFilter
Typedef für Callback-Funktionen zur Debug-Filterung mit folgender 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 die Ausgabe der Meldung.
Hinweis: Ab 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 ist nicht mehr davon auszugehen, 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 möchten, 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 Enumeration wurde in Qt 6.5 eingeführt.
Der Typ `DebugMessageSeverityFlags` ist ein `typedef` für ` QFlags<DebugMessageSeverityFlag>`. Er speichert eine OR-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 Enumeration wurde in Qt 6.5 eingeführt.
Der Typ „DebugMessageTypeFlags“ ist ein typedef für „QFlags<DebugMessageTypeFlag>“. Er speichert eine ODER-Kombination von „DebugMessageTypeFlag“-Werten.
[alias, since 6.5] QVulkanInstance::DebugUtilsFilter
Typedef für Callback-Funktionen zur Debug-Filterung mit folgender Signatur:
std::function<bool(DebugMessageSeverityFlags severity, DebugMessageTypeFlags type, const void *message)>;Das Argument „ message “ ist ein Zeiger auf die Struktur „VkDebugUtilsMessengerCallbackDataEXT“. Weitere Informationen finden Sie in der Dokumentation unter VK_EXT_debug_utils. Die Qt-Header verwenden nicht den tatsächlichen Typ, um eine Abhängigkeit von Vulkan-Headern nach Version 1.0 zu vermeiden.
Die Rückgabe von ` true ` unterdrückt die Ausgabe der Meldung.
Dieser `typedef` wurde in Qt 6.5 eingeführt.
Siehe auch ` installDebugOutputFilter()` und ` removeDebugOutputFilter()`.
enum QVulkanInstance::Flag
flags QVulkanInstance::Flags
Diese Enumeration beschreibt die Flags, die an die Funktion „ setFlags()“ übergeben werden können. Diese steuern das Verhalten der Funktion „ 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 Auflistung physischer Geräte, die als „Vulkan Portability“ gekennzeichnet sind. |
Der Typ „Flags“ ist ein typedef für QFlags<Flag>. Er speichert eine OR-Kombination von Flag-Werten.
Dokumentation der Mitgliedsfunktionen
QVulkanInstance::QVulkanInstance()
Erstellt eine neue Instanz.
Hinweis: Im Konstruktor wirdkeine Vulkan-Initialisierung durchgeführt.
[noexcept] QVulkanInstance::~QVulkanInstance()
Destruktor.
Hinweis: „ vkInstance()“ gibt „ nullptr “ zurück, sobald die Instanz zerstört wurde.
QVersionNumber QVulkanInstance::apiVersion() const
Gibt die angeforderte Vulkan-API-Version zurück, mit der die Anwendung voraussichtlich ausgeführt wird, oder eine Versionsnummer von Null, wenn setApiVersion() nicht vor create() aufgerufen wurde.
Siehe auch „ setApiVersion()“.
[since 6.5] void QVulkanInstance::clearDebugOutputFilters()
Entfernt alle zuvor mit installDebugOutputFilter() installierten Filterfunktionen.
Hinweis: Diese Funktion kann vor dem Aufruf von ` 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 Vulkan-Instanz oder übernimmt eine bereits vorhandene.
Gibt bei Erfolg „true“ zurück, bei einem Fehler oder wenn Vulkan nicht unterstützt wird „false“.
Bei Erfolg kann der Zeiger auf diese „ QVulkanInstance “ über „ vkInstance()“ abgerufen werden.
Die Vulkan-Instanz und die Bibliothek stehen zur Verfügung, solange diese ` QVulkanInstance ` existiert oder bis ` destroy()` aufgerufen wird.
Standardmäßig wird die `VkInstance` mit gesetztem Flag ` VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR ` erstellt. Das bedeutet, dass auch physische Geräte der Vulkan-Portabilität aufgelistet werden. Wenn dies nicht gewünscht ist, setzen Sie das Flag ` NoPortabilityDrivers `.
void QVulkanInstance::destroy()
Löscht die zugrunde liegende Plattforminstanz und damit auch die `VkInstance` (sofern diese im Besitz des Aufrufers ist). Das ` QVulkanInstance `-Objekt kann durch erneuten Aufruf von ` create()` weiterhin wiederverwendet werden.
QVulkanDeviceFunctions *QVulkanInstance::deviceFunctions(VkDevice device)
Gibt das Objekt ` QVulkanDeviceFunctions ` zurück, das den Kernbefehlssatz von Vulkan auf Geräteebene bereitstellt und dessen plattformübergreifende Funktionsfähigkeit gewährleistet 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. Der Grund dafür ist, dass diese Funktionen über „vkGetDeviceProcAddr“ aufgelöst werden, um den potenziellen Overhead durch internes Dispatching zu vermeiden.
Hinweis: Das zurückgegebene Objekt gehört dem „ QVulkanInstance “ und wird von diesem verwaltet. Es darf weder zerstört noch verändert werden.
Hinweis: Das Objekt wird zwischengespeichert, sodass der erneute Aufruf dieser Funktion mit demselben ` device ` einen geringen Aufwand darstellt. Wenn das Gerät jedoch zerstört wird, ist es Aufgabe der Anwendung, das ` QVulkanInstance ` durch Aufruf von ` resetDeviceFunctions()` zu benachrichtigen.
Die Funktionen aus der Kern-API von Vulkan 1.0 sind stets verfügbar. Bei höheren Vulkan-Versionen, wie beispielsweise 1.1 und 1.2, versucht das ` QVulkanDeviceFunctions `-Objekt, auch die Kern-API-Funktionen für diese Versionen aufzulösen. Wenn das physische Vulkan-Gerät zur Laufzeit diese jedoch nicht unterstützt, führt der Aufruf einer solchen nicht unterstützten Funktion zu nicht spezifiziertem Verhalten. Um die Unterstützung für Vulkan-Versionen höher als 1.0 ordnungsgemäß zu aktivieren, muss möglicherweise vor dem Aufruf von ` create()` durch den Aufruf von ` setApiVersion()` eine entsprechende Instanz-API-Version festgelegt werden. Darüber hinaus wird erwartet, dass Anwendungen die Eigenschaft ` 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 Aufruf von ` create()` zurück, andernfalls ` VK_SUCCESS `.
Der Wert ist in der Regel der Rückgabewert von `vkCreateInstance()` (wenn eine neue Vulkan-Instanz erstellt wird, anstatt eine bestehende zu übernehmen), kann aber auch ` VK_NOT_READY ` sein, falls das Plattform-Plugin Vulkan nicht unterstützt.
QByteArrayList QVulkanInstance::extensions() const
Gibt die aktivierten Instanzerweiterungen zurück, sofern 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 Kern des Vulkan-Befehlssatzes bereitstellt – mit Ausnahme von Funktionen auf Geräteebene – und dessen plattformübergreifende Funktionsfähigkeit garantiert ist.
Hinweis: Das zurückgegebene Objekt ist Eigentum von „ QVulkanInstance “ und wird von diesem verwaltet. Es darf weder zerstört noch verändert werden.
Die Funktionen der Kern-API von Vulkan 1.0 sind stets verfügbar. Bei höheren Vulkan-Versionen, wie beispielsweise 1.1 und 1.2, versucht das „ QVulkanFunctions “-Objekt, auch die Kern-API-Funktionen für diese Versionen aufzulösen. Wenn die Vulkan-Instanzimplementierung zur Laufzeit diese jedoch nicht unterstützt, 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 vor dem Aufruf von ` create()` die entsprechende Instanz-API-Version durch den Aufruf von ` setApiVersion()` festgelegt 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 dem angegebenen „ name “ auf.
Für zentrale Vulkan-Befehle sollten stattdessen vorzugsweise die Funktions-Wrapper verwendet werden, die über functions() und deviceFunctions() abgerufen werden können.
[since 6.5] void QVulkanInstance::installDebugOutputFilter(QVulkanInstance::DebugUtilsFilter filter)
Installiert eine ` filter `-Funktion, die bei jeder Vulkan-Debug-Meldung aufgerufen wird. Wenn der Callback ` true` zurückgibt, wird die Meldung unterdrückt (herausgefiltert) und erscheint nicht in der Debug-Ausgabe.
Hinweis: Die Filterung ist nur wirksam, wenn „ NoDebugOutputRedirect “ nicht auf „ set “ gesetzt ist. Andernfalls hat das Einrichten von Filtern keine Auswirkung.
Hinweis: Diese Funktion kann vor dem Aufruf von ` create()` aufgerufen werden.
Diese Funktion wurde in Qt 6.5 eingeführt.
Siehe auch ` clearDebugOutputFilters()`.
void QVulkanInstance::installDebugOutputFilter(QVulkanInstance::DebugFilter filter)
Installiert eine ` filter `-Funktion, die bei jeder Vulkan-Debug-Meldung aufgerufen wird. Wenn der Callback ` true` zurückgibt, wird die Meldung unterdrückt (herausgefiltert) und erscheint nicht in der Debug-Ausgabe.
Hinweis: Die Filterung ist nur wirksam, wenn „ NoDebugOutputRedirect “ nicht auf „ set “ gesetzt ist. Andernfalls hat das Einrichten von Filtern keine Wirkung.
Hinweis: Diese Funktion kann vor „ create()“ aufgerufen werden.
Dies ist eine überladene Funktion.
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, sofern die Funktion „ create()“ aufgerufen wurde und erfolgreich war. Andernfalls werden die angeforderten Ebenen zurückgegeben.
Siehe auch ` setLayers()`.
void QVulkanInstance::presentAboutToBeQueued(QWindow *window)
Diese Funktion sollte vom Renderer der Anwendung aufgerufen werden, bevor ein Darstellungsvorgang für „ window “ in die Warteschlange gestellt wird.
Während dies auf einigen Plattformen keine Auswirkung hat, führen andere möglicherweise eine vom Fenstersystem abhängige Synchronisation durch. Auf Wayland wird beispielsweise eine `wl_surface.frame`-Anforderung gesendet, um zu verhindern, dass der Treiber bei minimierten Fenstern blockiert wird.
void QVulkanInstance::presentQueued(QWindow *window)
Diese Funktion sollte vom Renderer der Anwendung aufgerufen werden, nachdem ein Darstellungsvorgang für window in die Warteschlange gestellt wurde.
Während dies auf einigen Plattformen keine Auswirkung hat, führen andere möglicherweise eine vom Fenstersystem abhängige Synchronisation durch. Unter X11 wird dadurch beispielsweise „ _NET_WM_SYNC_REQUEST_COUNTER “ aktualisiert.
void QVulkanInstance::removeDebugOutputFilter(QVulkanInstance::DebugFilter filter)
Entfernt eine zuvor mit installDebugOutputFilter() installierte filter -Funktion.
Hinweis: Diese Funktion kann vor ` create()` aufgerufen werden.
Siehe auch installDebugOutputFilter().
void QVulkanInstance::resetDeviceFunctions(VkDevice device)
Macht das „ QVulkanDeviceFunctions “-Objekt für das angegebene „ device “ ungültig und löscht es.
Diese Funktion muss aufgerufen werden, wenn ein `VkDevice`, für das ` deviceFunctions()` aufgerufen wurde, zerstört wird, während die Anwendung weiterlaufen soll und möglicherweise später ein neues logisches Vulkan-Gerät erstellt.
Es ist nicht erforderlich, diese Funktion vor dem Löschen des ` QVulkanInstance ` aufzurufen, da die Bereinigung dann automatisch erfolgt.
Siehe auch ` deviceFunctions()`.
void QVulkanInstance::setApiVersion(const QVersionNumber &vulkanVersion)
Gibt die höchste Vulkan-API-Version an, für deren Verwendung die Anwendung ausgelegt ist.
Standardmäßig ist ` vulkanVersion ` auf 0 gesetzt, was Vulkan 1.0 entspricht.
Hinweis: Diese Funktion kann nur vor dem Aufruf von ` create()` aufgerufen werden und hat keine Auswirkung, wenn sie danach aufgerufen wird.
Hinweis: Beachten Sie , dass sich das Verhalten in Bezug auf das Feld „Vulkan API version“ ab Vulkan 1.1 ändert. In Vulkan 1.0 führte die Angabe eines nicht unterstützten „ vulkanVersion “ gemäß der Spezifikation zu einem Fehlschlag von „ create()“ mit dem Fehler „ VK_ERROR_INCOMPATIBLE_DRIVER “. Ab Vulkan 1.1 verbietet die Spezifikation dies; der Treiber muss jede Version akzeptieren, ohne die Instanzerstellung abzubrechen.
Anwendungsentwicklern wird empfohlen, sich mit den Hinweisen zu „ apiVersion “ in der Vulkan-Spezifikation vertraut zu machen.
Siehe auch apiVersion() und supportedApiVersion().
void QVulkanInstance::setExtensions(const QByteArrayList &extensions)
Gibt die Liste der zusätzlichen Instanz- extensions en an, die aktiviert werden sollen. Es ist unbedenklich, auch nicht unterstützte Erweiterungen anzugeben, da diese bei Nichtunterstützung zur Laufzeit ignoriert werden.
Hinweis: Die von Qt benötigten oberflächenbezogenen Erweiterungen (z. B. ` VK_KHR_win32_surface`) werden immer automatisch hinzugefügt und müssen nicht in diese Liste aufgenommen werden.
Hinweis: „ VK_KHR_portability_enumeration “ wird automatisch hinzugefügt, sofern nicht das Flag „ NoPortabilityDrivers “ gesetzt ist. Dieser Wert wurde in Qt 6.5 eingeführt.
Hinweis: Diese Funktion kann nur vor dem Aufruf von ` create()` aufgerufen werden und hat keine Wirkung, wenn sie danach aufgerufen wird.
Siehe auch ` extensions()`.
void QVulkanInstance::setFlags(QVulkanInstance::Flags flags)
Konfiguriert das Verhalten von ` create()` basierend auf dem 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 Instanz- layers en an. Es ist unbedenklich, auch nicht unterstützte Ebenen anzugeben, da diese bei Nichtunterstützung zur Laufzeit ignoriert werden.
Hinweis: Diese Funktion kann nur vor dem Aufruf von ` create()` aufgerufen werden und hat keine Wirkung, wenn sie danach aufgerufen wird.
Siehe auch ` layers()`.
void QVulkanInstance::setVkInstance(VkInstance existingVkInstance)
Bewirkt, dass „ QVulkanInstance “ ein vorhandenes VkInstance-Handle übernimmt, anstatt ein neues zu erstellen.
Hinweis: Für „ existingVkInstance “ müssen mindestens „ VK_KHR_surface “ sowie die entsprechenden WSI-spezifischen Erweiterungen „ VK_KHR_*_surface “ aktiviert sein. Um sicherzustellen, dass die Umleitung der Debug-Ausgabe funktioniert, wird außerdem „ VK_EXT_debug_utils “ benötigt.
Qt verfügt über keine Möglichkeit, Layer und Erweiterungen bei einer bereits erstellten `VkInstance` zu aktivieren. Daher liegt es in der Verantwortung des Aufrufers, sicherzustellen, dass „ existingVkInstance “ für die Verwendung mit Qt geeignet ist. Wenn ein auf „ QRhi “ basierendes Rendering zum Einsatz kommt, rufen Sie „ QRhiVulkanInitParams::preferredInstanceExtensions()“ auf, um eine zusätzliche Liste von Instanzerweiterungen abzufragen, die vom Ersteller von „ existingVkInstance “ zusätzlich zu den oben genannten Erweiterungen aktiviert werden sollten, sofern diese zur Laufzeit verfügbar sind und vom System unterstützt werden.
Hinweis: Diese Funktion kann nur vor dem Aufruf von 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 Funktionen auf Instanzebene zurück.
In der Praxis ist dies entweder der von `vkEnumerateInstanceVersion` zurückgegebene Wert, sofern diese Funktion verfügbar ist (ab Vulkan 1.1), oder 1.0.
Anwendungen, die ihre Nutzung von Vulkan-Funktionen und -APIs je nach der zur Laufzeit verfügbaren Vulkan-Version anpassen möchten, können diese Funktion verwenden, um zu ermitteln, welche Version an ` setApiVersion()` übergeben werden soll, bevor ` create()` aufgerufen wird.
Hinweis: Diese Funktion kann vor dem Aufruf von ` 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 dem Aufruf von ` create()` aufgerufen werden.
QVulkanInfoVector<QVulkanLayer> QVulkanInstance::supportedLayers() const
Gibt die Liste der unterstützten Ebenen auf Instanzebene zurück.
Hinweis: Diese Funktion kann vor dem Aufruf von ` create()` aufgerufen werden.
bool QVulkanInstance::supportsPresent(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, QWindow *window)
Gibt „true“ zurück, wenn die Warteschlangenfamilie mit dem Parameter „ queueFamilyIndex “ innerhalb des „ physicalDevice “ die Darstellung an „ 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 Darstellung verwendet werden kann.
[static] VkSurfaceKHR QVulkanInstance::surfaceForWindow(QWindow *window)
Erstellt oder ruft das bereits vorhandene „ VkSurfaceKHR “-Handle für die angegebene „ window “ ab.
Gibt das Vulkan-Surface-Handle zurück oder 0, falls der Vorgang fehlgeschlagen ist.
VkInstance QVulkanInstance::vkInstance() const
Gibt das VkInstance-Handle zurück, das diese ` QVulkanInstance ` umschließt, oder ` nullptr `, falls ` create()` noch nicht erfolgreich aufgerufen wurde und keine vorhandene Instanz über ` setVkInstance()` bereitgestellt wurde.
Siehe auch setVkInstance().
© 2026 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.