Auf dieser Seite

QVulkanWindow Class

Die Klasse „QVulkanWindow“ ist eine Hilfsunterklasse von „ QWindow “ zur Durchführung von Vulkan-Rendering. Mehr...

Header: #include <QVulkanWindow>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
Erbt von: QWindow

Öffentliche Typen

(since 6.7) EnabledFeatures2Modifier
EnabledFeaturesModifier
enum Flag { PersistentResources }
flags Flags
QueueCreateInfoModifier

Öffentliche Funktionen

QVulkanWindow(QWindow *parent = nullptr)
virtual ~QVulkanWindow()
QList<VkPhysicalDeviceProperties> availablePhysicalDevices()
QMatrix4x4 clipCorrectionMatrix()
VkFormat colorFormat() const
int concurrentFrameCount() const
virtual QVulkanWindowRenderer *createRenderer()
VkCommandBuffer currentCommandBuffer() const
int currentFrame() const
VkFramebuffer currentFramebuffer() const
int currentSwapChainImageIndex() const
VkRenderPass defaultRenderPass() const
VkFormat depthStencilFormat() const
VkImage depthStencilImage() const
VkImageView depthStencilImageView() const
VkDevice device() const
uint32_t deviceLocalMemoryIndex() const
QVulkanWindow::Flags flags() const
void frameReady()
QImage grab()
VkCommandPool graphicsCommandPool() const
VkQueue graphicsQueue() const
uint32_t graphicsQueueFamilyIndex() const
uint32_t hostVisibleMemoryIndex() const
bool isValid() const
VkImage msaaColorImage(int idx) const
VkImageView msaaColorImageView(int idx) const
VkPhysicalDevice physicalDevice() const
const VkPhysicalDeviceProperties *physicalDeviceProperties() const
VkSampleCountFlagBits sampleCountFlagBits() const
void setDeviceExtensions(const QByteArrayList &extensions)
(since 6.7) void setEnabledFeaturesModifier(const QVulkanWindow::EnabledFeaturesModifier &modifier)
(since 6.7) void setEnabledFeaturesModifier(QVulkanWindow::EnabledFeatures2Modifier modifier)
void setFlags(QVulkanWindow::Flags flags)
void setPhysicalDeviceIndex(int idx)
void setPreferredColorFormats(const QList<VkFormat> &formats)
void setQueueCreateInfoModifier(const QVulkanWindow::QueueCreateInfoModifier &modifier)
void setSampleCount(int sampleCount)
QVulkanInfoVector<QVulkanExtension> supportedDeviceExtensions()
QList<int> supportedSampleCounts()
bool supportsGrab() const
VkImage swapChainImage(int idx) const
int swapChainImageCount() const
QSize swapChainImageSize() const
VkImageView swapChainImageView(int idx) const

Signale

void frameGrabbed(const QImage &image)

Statische öffentliche Mitglieder

Ausführliche Beschreibung

QVulkanWindow ist ein Vulkan-fähiges „ QWindow “, das ein Vulkan-Gerät, eine Grafikwarteschlange, einen Befehlspool und -puffer, ein Depth-Stencil-Bild sowie eine doppelt gepufferte FIFO-Swapchain verwaltet und dabei für korrektes Verhalten bei Ereignissen wie Größenänderungen, in besonderen Situationen wie dem Fehlen einer Gerätewarteschlange, die sowohl Grafik als auch Darstellung unterstützt, Szenarien mit Geräteverlust sowie zusätzliche Funktionen wie das Zurücklesen des gerenderten Inhalts. Konzeptionell ist es das Pendant zu „ QOpenGLWindow “ in der Vulkan-Welt.

Hinweis: QVulkanWindow macht die Implementierung einer vollständig benutzerdefinierten Unterklasse von „ QWindow “ nicht immer überflüssig, da es in fortgeschrittenen Anwendungsfällen nicht unbedingt ausreicht.

QVulkanWindow kann über QWidget::createWindowContainer() in auf „ QWidget “ basierende Benutzeroberflächen eingebettet werden. Dieser Ansatz weist jedoch eine Reihe von Einschränkungen auf. Lesen Sie daher unbedingt zuerst die Dokumentation unter documentation.

Eine typische Anwendung, die QVulkanWindow nutzt, könnte wie folgt aussehen:

class VulkanRenderer : public QVulkanWindowRenderer
{
public:
    VulkanRenderer(QVulkanWindow*w): m_window(w), m_devFuncs(nullptr) { }

    void initResources() override
    {
        m_devFuncs = m_window->vulkanInstance()->deviceFunctions(m_window->device());
       // ..
    }
    void initSwapChainResources() override { /* ... */ }
    void releaseSwapChainResources() override { /* ... */ }
    void releaseResources() override { /* ... */ }

   void startNextFrame() override
    {
        VkCommandBuffer cmdBuf = m_window->currentCommandBuffer();
        // ...
        m_devFuncs->vkCmdBeginRenderPass(commandBuffer, renderPassBegin, contents);
        // ...
        m_window->frameReady();
    }

private:
    QVulkanWindow*m_window;
    QVulkanDeviceFunctions*m_devFuncs;
};

class VulkanWindow : public QVulkanWindow
{
public:
    QVulkanWindowRenderer*createRenderer() override {
        return new VulkanRenderer(this);
    }
};

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QVulkanInstance inst;
    // Standard-Validierungs-Layer aktivieren, sofern verfügbar
    inst.setLayers({ "VK_LAYER_KHRONOS_validation" });
    if (!inst.create())
        qFatal("Failed to create Vulkan instance: %d", inst.errorCode());

    VulkanWindow w;
    w.setVulkanInstance(&inst);
    w.showMaximized();

    return app.exec();
}

Wie im Beispiel zu sehen ist, sind die wichtigsten Muster bei der Verwendung von QVulkanWindow:

  • Die ` QVulkanInstance ` wird über ` QWindow::setVulkanInstance()` zugeordnet. Sie kann dann über ` QWindow::vulkanInstance()` von überall und in jedem Thread abgerufen werden.
  • Ähnlich wie bei ` QVulkanInstance` können Geräteerweiterungen vor der eigentlichen Initialisierung über ` supportedDeviceExtensions()` abgefragt werden. Die Aktivierung einer Erweiterung erfolgt über ` setDeviceExtensions()`. Solche Aufrufe müssen erfolgen, bevor das Fenster sichtbar wird, d. h. vor dem Aufruf von ` show()` oder ähnlichen Funktionen. Nicht unterstützte Erweiterungsanfragen werden ordnungsgemäß ignoriert.
  • Der Renderer ist in einer Unterklasse von ` QVulkanWindowRenderer ` implementiert, von der in der Factory-Funktion ` createRenderer()` eine Instanz erstellt wird.
  • Die zentralen Vulkan-Befehle werden über das ` QVulkanFunctions `-Objekt bereitgestellt, das durch den Aufruf von ` QVulkanInstance::functions()` abgerufen werden kann. Funktionen auf Geräteebene stehen nach der Erstellung eines `VkDevice` durch den Aufruf von ` QVulkanInstance::deviceFunctions()` zur Verfügung.
  • Die Erstellung der Zeichenaufrufe für das nächste Bild erfolgt in ` QVulkanWindowRenderer::startNextFrame()`. Die Implementierung soll Befehle zum Befehlspuffer hinzufügen, der von ` currentCommandBuffer()` zurückgegeben wird. Die Rückkehr aus der Funktion bedeutet nicht, dass die Befehle zur Übermittlung bereit sind. Vielmehr ist ein expliziter Aufruf von ` frameReady()` erforderlich. Dies ermöglicht die asynchrone Generierung von Befehlen, möglicherweise in mehreren Threads. Einfache Implementierungen rufen am Ende ihrer ` QVulkanWindowRenderer::startNextFrame()` einfach ` frameReady()` auf.
  • Die grundlegenden Vulkan-Ressourcen (physisches Gerät, Grafikwarteschlange, ein Befehlspool, der Hauptbefehlspuffer des Fensters, Bildformate usw.) werden über einfache Getter-Funktionen im `QVulkanWindow` bereitgestellt. Einige davon dienen lediglich der Benutzerfreundlichkeit, und es steht Anwendungen jederzeit frei, zusätzliche Ressourcen direkt über die Vulkan-API abzufragen, zu erstellen und zu verwalten.
  • Der Renderer läuft im GUI-/Haupt-Thread, genau wie das Fenster selbst. Dieser Thread wird dann auf die Darstellungsrate gedrosselt, ähnlich wie es sich bei OpenGL mit einem Swap-Intervall von 1 verhalten würde. Der Renderer-Implementierung steht es jedoch frei, mehrere Threads nach eigenem Ermessen einzusetzen. Die Zugriffsfunktionen wie ` vulkanInstance()`, ` currentCommandBuffer()` usw. können von jedem Thread aus aufgerufen werden. Die Übermittlung des Hauptbefehlspuffers, das Einreihen von `present` und die Erstellung des nächsten Frames beginnen erst, wenn ` frameReady()` im GUI-/Haupt-Thread aufgerufen wird.
  • Wenn das Fenster sichtbar gemacht wird, wird der Inhalt automatisch aktualisiert. Weitere Aktualisierungen können durch den Aufruf von ` QWindow::requestUpdate()` angefordert werden. Um eine kontinuierliche Darstellung zu gewährleisten, rufen Sie nach ` frameReady()` die Funktion ` requestUpdate()` auf.

Zur Fehlerbehebung aktivieren Sie die Protokollierungskategorie „ qt.vulkan “. Kritische Fehler werden automatisch über „ qWarning()“ ausgegeben.

Unterschiede im Koordinatensystem zwischen OpenGL und Vulkan

Es gibt zwei wichtige Unterschiede, die zu beachten sind: Erstens zeigt bei Vulkan die Y-Achse im Clip-Raum nach unten, während OpenGL eine nach oben zeigende Y-Achse verwendet. Zweitens geht die Standard-Projektionsmatrix von OpenGL von Werten von -1 und 1 für die Nah- und Fernebene aus, während Vulkan die Werte 0 und 1 bevorzugt.

Um Anwendungen die Migration von OpenGL-basiertem Code zu erleichtern, ohne dass die Y-Koordinaten in den Vertex-Daten umgedreht werden müssen, und um die Verwendung von „ QMatrix4x4 “-Funktionen wie „ QMatrix4x4::perspective()“ zu ermöglichen, während „minDepth“ und „maxDepth“ des Vulkan-Viewports auf 0 und 1 gesetzt bleiben, stellt „QVulkanWindow“ eine Korrekturmatrix bereit, die durch den Aufruf von „ clipCorrectionMatrix()“ abgerufen werden kann.

Multisampling

Obwohl standardmäßig deaktiviert, wird Multisample-Antialiasing von QVulkanWindow vollständig unterstützt. Zusätzliche Farbpuffer und die Auflösung in die Nicht-Multisample-Puffer der Swapchain werden automatisch verwaltet.

Um die unterstützten Sample-Anzahlen abzufragen, rufen Sie ` supportedSampleCounts()` auf. Wenn die zurückgegebene Menge die Werte 4, 8, … enthält, wird durch die Übergabe eines dieser Werte an ` setSampleCount()` das Multisample-Rendering angefordert.

Hinweis: Im Gegensatz zu ` QSurfaceFormat::setSamples()` wird die Liste der unterstützten Sample-Zahlen den Anwendungen im Voraus mitgeteilt, und bei ` setSampleCount()` erfolgt kein automatischer Fallback auf niedrigere Sample-Zahlen. Wird der angeforderte Wert nicht unterstützt, wird eine Warnung angezeigt und es wird kein Multisampling verwendet.

Bilder zurücklesen

Wenn supportsGrab() den Wert „true“ zurückgibt, kann QVulkanWindow das Zurücklesen aus dem Farbpuffer in ein QImage durchführen. grab() ist ein langsamer und ineffizienter Vorgang, daher sollte eine häufige Verwendung vermieden werden. Dennoch ist diese Funktion wertvoll, da sie es Anwendungen ermöglicht, Screenshots zu erstellen, oder Tools und Tests die Ausgabe des GPU-Renderings zu verarbeiten und zu überprüfen.

sRGB-Unterstützung

Während viele Anwendungen mit dem Standardverhalten von QVulkanWindow in Bezug auf Swapchain-Bildformate gut zurechtkommen, ermöglicht ` setPreferredColorFormats()` die Anforderung eines vordefinierten Formats. Dies ist insbesondere bei der Arbeit im sRGB-Farbraum nützlich. Die Übergabe eines Formats wie ` VK_FORMAT_B8G8R8A8_SRGB ` führt zur Auswahl eines sRGB-Formats, sofern verfügbar.

Validierungs-Layer

Während der Anwendungsentwicklung kann es äußerst wertvoll sein, die Vulkan-Validierungsschichten zu aktivieren. Wie im obigen Beispielcode gezeigt, aktiviert der Aufruf von ` QVulkanInstance::setLayers()` auf ` QVulkanInstance ` vor ` QVulkanInstance::create()` die Validierung, vorausgesetzt, der Vulkan-Treiberstack im System enthält die erforderlichen Schichten.

Hinweis: Beachten Sie plattformspezifische Unterschiede. Auf Desktop-Plattformen reicht in der Regel die Installation des Vulkan-SDK aus. Android erfordert jedoch beispielsweise die Bereitstellung zusätzlicher gemeinsam genutzter Bibliotheken zusammen mit der Anwendung und schreibt zudem eine andere Liste von Namen für Validierungsschichten vor. Weitere Informationen finden Sie auf den Android-Vulkan-Entwicklungsseiten.

Hinweis: QVulkanWindow stellt keine Geräte-Layer bereit, da diese Funktionalität seit Version 1.0.13 der Vulkan-API veraltet ist.

Ebenen, Gerätefunktionen und Erweiterungen

Um Instanzebenen zu aktivieren, rufen Sie ` QVulkanInstance::setLayers()` auf, bevor Sie die ` QVulkanInstance` erstellen. Um abzufragen, welche Instanzebenen verfügbar sind, rufen Sie ` QVulkanInstance::supportedLayers()` auf.

Um Geräteerweiterungen zu aktivieren, rufen Sie „ setDeviceExtensions()“ frühzeitig beim Einrichten des „QVulkanWindow“ auf. Um abzufragen, welche Geräteerweiterungen verfügbar sind, rufen Sie „ supportedDeviceExtensions()“ auf.

Die Angabe einer nicht unterstützten Ebene oder Erweiterung wird elegant behandelt: Die Erstellung der Instanz oder des Geräts schlägt dadurch nicht fehl, sondern die Anfrage nach der Ebene oder Erweiterung wird einfach ignoriert.

Was Gerätefunktionen betrifft, aktiviert `QVulkanWindow` alle Vulkan-1.0-Funktionen, die von `vkGetPhysicalDeviceFeatures()` als unterstützt gemeldet werden. Als Ausnahme von dieser Regel wird ` robustBufferAccess ` niemals aktiviert. Verwenden Sie den unten beschriebenen Callback-Mechanismus, wenn Sie diese Funktion aktivieren möchten.

Dies ist nicht immer wünschenswert und kann bei Vulkan 1.1 und höher unzureichend sein. Daher ist auch eine vollständige Kontrolle über die für die Geräteerstellung verwendeten `VkPhysicalDeviceFeatures` möglich, indem eine Callback-Funktion bei ` setEnabledFeaturesModifier()` registriert wird. Wenn diese gesetzt ist, wird die Callback-Funktion aufgerufen, wodurch sie die `VkPhysicalDeviceFeatures` oder `VkPhysicalDeviceFeatures2` ändern kann.

Sicherheitshinweise

Es wird davon ausgegangen, dass alle von `QVulkanWindow` verarbeiteten Daten vertrauenswürdige Inhalte sind. Dazu gehören die an ` setDeviceExtensions()` übergebenen Namen der Geräteerweiterungen, die von den über ` setEnabledFeaturesModifier()` und ` setQueueCreateInfoModifier()` registrierten Callbacks geschriebenen Parameter zur Geräteerstellung sowie alle Rendering-Inhalte und Vulkan-Befehlsparameter, die von der ` QVulkanWindowRenderer `-Implementierung generiert werden. Die Vulkan-Implementierung selbst ist eine vertrauenswürdige, prozessinterne Plattformabhängigkeit; weitere Details finden Sie unter QVulkanInstance.

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 nicht unter der Kontrolle der Entwickler stehen.

Siehe auch QVulkanInstance und QWindow.

Dokumentation zu Mitgliedstypen

[since 6.7] QVulkanWindow::EnabledFeatures2Modifier

Eine Funktion, die während der Grafikinitialisierung aufgerufen wird, um die „VkPhysicalDeviceFeatures2“-Einträge anzupassen, die in die „VkDeviceCreateInfo“ übernommen werden.

Standardmäßig aktiviert „ QVulkanWindow “ alle Kernfunktionen von Vulkan 1.0, die das physische Gerät als unterstützt meldet, mit bestimmten Ausnahmen. Insbesondere ist „ robustBufferAccess “ immer deaktiviert, um unerwartete Leistungseinbußen zu vermeiden.

Dies reicht jedoch bei der Arbeit mit Funktionen und Erweiterungen von Vulkan 1.1, 1.2 oder 1.3 nicht immer aus. Daher gibt es diesen Callback-Mechanismus. Wenn zur Laufzeit nur Vulkan 1.0 relevant ist, verwenden Sie stattdessen ` setEnabledFeaturesModifier()`.

Die an die Callback-Funktion übergebene Referenz `VkPhysicalDeviceFeatures2` ist mit ` sType ` gesetzt, der Rest jedoch auf Null gesetzt. Es obliegt der Funktion, die Elemente auf „true“ zu setzen oder ` pNext `-Ketten nach eigenem Ermessen einzurichten.

Hinweis: Achten Siebeim Einrichten von „ pNext “-Ketten darauf, dass die referenzierten Objekte eine ausreichend lange Lebensdauer haben, indem Sie sie beispielsweise als Member-Variablen in der „ QVulkanWindow “-Unterklasse speichern.

Dieses `typedef` wurde in Qt 6.7 eingeführt.

Siehe auch ` setEnabledFeaturesModifier()`.

QVulkanWindow::EnabledFeaturesModifier

Eine Funktion, die während der Grafikinitialisierung aufgerufen wird, um die bei der Erstellung eines Vulkan-Geräteobjekts übergebenen „VkPhysicalDeviceFeatures“ zu ändern.

Standardmäßig aktiviert „ QVulkanWindow “ alle Kernfunktionen von Vulkan 1.0, die das physikalische Gerät als unterstützt meldet, mit bestimmten Ausnahmen. Insbesondere ist „ robustBufferAccess “ immer deaktiviert, um unerwartete Leistungseinbußen zu vermeiden.

Die übergebene `VkPhysicalDeviceFeatures`-Referenz wird zum Zeitpunkt des Funktionsaufrufs vollständig auf Null gesetzt. Es obliegt der Funktion, die Elemente nach eigenem Ermessen zu ändern.

Hinweis: Um Funktionen von Vulkan 1.1, 1.2 oder 1.3zu steuern, verwenden Sie stattdessen „ EnabledFeatures2Modifier “.

Siehe auch ` setEnabledFeaturesModifier()`.

enum QVulkanWindow::Flag
flags QVulkanWindow::Flags

Diese Enumeration beschreibt die Flags, die an die Funktion ` setFlags()` übergeben werden können.

KonstanteWertBeschreibung
QVulkanWindow::PersistentResources0x01Stellt sicher, dass keine Grafikressourcen freigegeben werden, wenn das Fenster ausgeblendet wird. Standardmäßig wird alles freigegeben und später neu initialisiert, sobald das Fenster wieder sichtbar wird.

Der Typ „Flags“ ist ein `typedef` für ` QFlags<Flag>`. Er speichert eine ODER-Kombination von `Flag`-Werten.

QVulkanWindow::QueueCreateInfoModifier

Eine Funktion, die während der Grafikinitialisierung aufgerufen wird, um zusätzliche Warteschlangen hinzuzufügen, die erstellt werden sollen.

Wird gesetzt, wenn der Renderer neben der Standard-Grafikwarteschlange zusätzliche Warteschlangen benötigt (z. B. eine Übertragungswarteschlange). Die angegebenen Eigenschaften der Warteschlangenfamilie können verwendet werden, um die Indizes für die zusätzlichen Warteschlangen auszuwählen. Der Renderer kann anschließend die eigentliche Warteschlange in `initResources()` anfordern.

Hinweis: Beim Anfordern zusätzlicher Grafikwarteschlangen fordert Qt selbst immer eine Grafikwarteschlange an. Sie müssen in `queueCreateInfo` nach dem entsprechenden Eintrag suchen und diesen bearbeiten, um die zusätzliche Warteschlange zu erhalten.

Siehe auch ` setQueueCreateInfoModifier()`.

Dokumentation zu den Mitgliedsfunktionen

[explicit] QVulkanWindow::QVulkanWindow(QWindow *parent = nullptr)

Erstellt ein neues `QVulkanWindow` mit dem angegebenen ` parent`.

Der Oberflächentyp wird auf „ QSurface::VulkanSurface “ gesetzt.

[virtual noexcept] QVulkanWindow::~QVulkanWindow()

Destruktor.

QList<VkPhysicalDeviceProperties> QVulkanWindow::availablePhysicalDevices()

Gibt die Liste der Eigenschaften der im System unterstützten physischen Geräte zurück.

Hinweis: Diese Funktion kann aufgerufen werden, bevor das Fenster sichtbar gemacht wird.

QMatrix4x4 QVulkanWindow::clipCorrectionMatrix()

Gibt eine „ QMatrix4x4 “ zurück, mit der Koordinatensystemunterschiede zwischen OpenGL und Vulkan ausgeglichen werden können.

Durch Vormultiplikation der Projektionsmatrix mit dieser Matrix können Anwendungen weiterhin davon ausgehen, dass Y nach oben zeigt, und minDepth sowie maxDepth im Ansichtsfenster auf 0 bzw. 1 setzen, ohne weitere Korrekturen an den Z-Positionen der Scheitelpunkte vornehmen zu müssen. Geometrie aus OpenGL-Anwendungen kann dann unverändert verwendet werden, vorausgesetzt, der Rasterisierungszustand stimmt mit den OpenGL-Einstellungen für Culling und Front Face überein.

VkFormat QVulkanWindow::colorFormat() const

Gibt das von der Swapchain verwendete Farbpufferformat zurück.

Hinweis: Der Aufruf dieser Funktion ist nur vom Aufruf von ` QVulkanWindowRenderer::initResources()` bis zum Aufruf von ` QVulkanWindowRenderer::releaseResources()` gültig.

Siehe auch ` setPreferredColorFormats()`.

int QVulkanWindow::concurrentFrameCount() const

Gibt die Anzahl der Frames zurück, die potenziell gleichzeitig aktiv sein können.

Hinweis: Der Wert bleibt während der gesamten Lebensdauer des ` QVulkanWindow` konstant.

    class Renderer {
        void startNextFrame();
        // ...

        VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT];
        QVulkanWindow *m_window = nullptr;
    };

    void Renderer::startNextFrame()
    {
        const int count = m_window->concurrentFrameCount();
        // for (int i = 0; i < count; ++i)
            // m_uniformBufInfo[i] = ...
        // ...
    }

Siehe auch ` currentFrame()`.

[virtual] QVulkanWindowRenderer *QVulkanWindow::createRenderer()

Gibt eine neue Instanz von ` QVulkanWindowRenderer` zurück.

Diese virtuelle Funktion wird einmal während der Lebensdauer des Fensters aufgerufen, und zwar zu einem Zeitpunkt, nachdem es zum ersten Mal sichtbar gemacht wurde.

Die Standardimplementierung gibt `null` zurück, sodass außer dem Leeren der Puffer keine Darstellung erfolgt.

Das Fenster übernimmt die Verantwortung für das zurückgegebene Renderer-Objekt.

VkCommandBuffer QVulkanWindow::currentCommandBuffer() const

Gibt den aktiven Befehlspuffer für den aktuellen Swap-Chain-Frame zurück. Von Implementierungen von ` QVulkanWindowRenderer::startNextFrame()` wird erwartet, dass sie diesem Befehlspuffer Befehle hinzufügen.

Hinweis: Diese Funktion darf nur innerhalb von `startNextFrame()` und – im Falle einer asynchronen Befehlserzeugung – bis zum Aufruf von ` frameReady()` aufgerufen werden.

int QVulkanWindow::currentFrame() const

Gibt den aktuellen Frame-Index im Bereich [0, concurrentFrameCount() - 1] zurück.

Renderer-Implementierungen müssen sicherstellen, dass einheitliche Daten und andere dynamische Ressourcen in mehreren Kopien vorhanden sind, um zu verhindern, dass Frame N die Daten verändert, die von den noch aktiven Frames N - 1, N - 2, … N - concurrentFrameCount() + 1 verwendet werden.

Um nicht auf dynamische Array-Größen angewiesen zu sein, können Anwendungen bei der Deklaration von Arrays ` MAX_CONCURRENT_FRAME_COUNT ` verwenden. Es ist garantiert, dass dieser Wert immer gleich oder größer als der von ` concurrentFrameCount()` zurückgegebene Wert ist. Solche Arrays können dann anhand des von dieser Funktion zurückgegebenen Werts indiziert werden.

    class Renderer {
        void startNextFrame();
        // ...

        VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT];
        QVulkanWindow *m_window = nullptr;
    };

    void Renderer::startNextFrame()
    {
        VkDescriptorBufferInfo &uniformBufInfo(m_uniformBufInfo[m_window->currentFrame()]);
        // ...
    }

Hinweis: Diese Funktion darf nur innerhalb von `startNextFrame()` und – im Falle einer asynchronen Befehlserzeugung – bis zum Aufruf von ` frameReady()` aufgerufen werden.

Siehe auch ` concurrentFrameCount()`.

VkFramebuffer QVulkanWindow::currentFramebuffer() const

Gibt einen VkFramebuffer für das aktuelle Swapchain-Bild unter Verwendung des Standard-Render-Passes zurück.

Der Framebuffer verfügt über zwei Attachments (Farbe, Tiefe-Stencil), wenn kein Multisampling verwendet wird, und über drei (Farbe-Auflösung, Tiefe-Stencil, Multisample-Farbe), wenn ` sampleCountFlagBits()` größer als ` VK_SAMPLE_COUNT_1_BIT` ist. Renderer müssen dies berücksichtigen, beispielsweise bei der Bereitstellung von Clear-Werten.

Hinweis: Anwendungen sind nicht verpflichtet, diesen Framebuffer zu verwenden, falls sie anstelle des von ` defaultRenderPass()` zurückgegebenen Render-Passes einen eigenen bereitstellen.

Hinweis: Diese Funktion darf nur innerhalb von `startNextFrame()` und – im Falle einer asynchronen Befehlsgenerierung – bis zum Aufruf von ` frameReady()` aufgerufen werden.

Siehe auch ` defaultRenderPass()`.

int QVulkanWindow::currentSwapChainImageIndex() const

Gibt den aktuellen Index des Swap-Chain-Images im Bereich [0, swapChainImageCount() - 1] zurück.

Hinweis: Diese Funktion darf nur innerhalb von `startNextFrame()` und, im Falle einer asynchronen Befehlserzeugung, bis zum Aufruf von ` frameReady()` aufgerufen werden.

VkRenderPass QVulkanWindow::defaultRenderPass() const

Gibt einen typischen Render-Pass mit einem Sub-Pass zurück.

Hinweis: Anwendungen sind nicht verpflichtet, diesen Render-Pass zu verwenden. Sie sind jedoch dafür verantwortlich, sicherzustellen, dass die aktuellen Swap-Chain- und Depth-Stencil-Bilder entweder über den benutzerdefinierten Render-Pass der Anwendung oder auf andere Weise von VK_IMAGE_LAYOUT_UNDEFINED zu VK_IMAGE_LAYOUT_PRESENT_SRC_KHR und VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL übertragen werden.

Hinweis: Das Lesen und Schreibenvon Stencil-Daten ist in diesem Render-Pass nicht aktiviert.

Hinweis: Der Aufruf dieser Funktion ist nur vom Aufruf von ` QVulkanWindowRenderer::initResources()` bis einschließlich ` QVulkanWindowRenderer::releaseResources()` gültig.

Siehe auch ` currentFramebuffer()`.

VkFormat QVulkanWindow::depthStencilFormat() const

Gibt das vom/von den Depth-Stencil-Puffern verwendete Format zurück.

Hinweis: Der Aufruf dieser Funktion ist nur zwischen dem Aufruf von ` QVulkanWindowRenderer::initResources()` und ` QVulkanWindowRenderer::releaseResources()` zulässig.

VkImage QVulkanWindow::depthStencilImage() const

Gibt das Depth-Stencil-Bild zurück.

Hinweis: Der Aufruf dieser Funktion ist nur vom Aufruf von ` QVulkanWindowRenderer::initSwapChainResources()` bis einschließlich ` QVulkanWindowRenderer::releaseSwapChainResources()` zulässig.

VkImageView QVulkanWindow::depthStencilImageView() const

Gibt die Ansicht des Depth-Stencil-Bildes zurück.

Hinweis: Der Aufruf dieser Funktion ist nur gültig vom Aufruf von ` QVulkanWindowRenderer::initSwapChainResources()` bis einschließlich ` QVulkanWindowRenderer::releaseSwapChainResources()`.

VkDevice QVulkanWindow::device() const

Gibt das aktive logische Gerät zurück.

Hinweis: Der Aufruf dieser Funktion ist nur zwischen dem Aufruf von ` QVulkanWindowRenderer::initResources()` und ` QVulkanWindowRenderer::releaseResources()` gültig.

uint32_t QVulkanWindow::deviceLocalMemoryIndex() const

Gibt einen für den allgemeinen Gebrauch geeigneten Index für einen gerätespezifischen Speichertyp zurück.

Hinweis: Der Aufruf dieser Funktion ist nur vom Aufruf von ` QVulkanWindowRenderer::initResources()` bis einschließlich ` QVulkanWindowRenderer::releaseResources()` gültig.

Hinweis: Es kann nicht garantiert werden, dass dieser Speichertyp immer geeignet ist. Die korrekte, implementierungsübergreifende Lösung – insbesondere für gerätelokale Images – besteht darin, einen Speichertyp manuell auszuwählen, nachdem die von ` vkGetImageMemoryRequirements` zurückgegebene Maske überprüft wurde.

QVulkanWindow::Flags QVulkanWindow::flags() const

Gibt die angeforderten Flags zurück.

Siehe auch setFlags().

[signal] void QVulkanWindow::frameGrabbed(const QImage &image)

Dieses Signal wird ausgegeben, wenn der „ image “ betriebsbereit ist.

void QVulkanWindow::frameReady()

Diese Funktion muss als Reaktion auf jeden Aufruf der Implementierung von ` QVulkanWindowRenderer::startNextFrame()` genau einmal aufgerufen werden. Zum Zeitpunkt dieses Aufrufs müssen dem über ` currentCommandBuffer()` bereitgestellten Hauptbefehlspuffer alle erforderlichen Rendering-Befehle hinzugefügt worden sein, da diese Funktion die Übermittlung der Befehle und die Einreihung des aktuellen Befehls in die Warteschlange auslöst.

Hinweis: Diese Funktion darf nur vom GUI-/Haupt-Thread aus aufgerufen werden, da dort die Funktionen von ` QVulkanWindowRenderer` aufgerufen werden und sich die Instanz von ` QVulkanWindow ` befindet.

Siehe auch QVulkanWindowRenderer::startNextFrame().

QImage QVulkanWindow::grab()

Erstellt und rendert das nächste Bild, ohne es anzuzeigen, und führt anschließend ein blockierendes Auslesen des Bildinhalts durch.

Gibt das Bild zurück, wenn die Implementierung von ` startNextFrame()` des Renderers direkt ` frameReady()` aufruft. Andernfalls wird ein unvollständiges Bild zurückgegeben, das zwar die richtige Größe, aber noch keinen Inhalt hat. Der Inhalt wird im letzteren Fall über das Signal ` frameGrabbed()` übermittelt.

Das zurückgegebene ` QImage ` hat immer das Format ` QImage::Format_RGBA8888`. Ist das ` colorFormat()`-Signal auf ` VK_FORMAT_B8G8R8A8_UNORM` gesetzt, werden der rote und der blaue Kanal automatisch vertauscht, da dieses Format üblicherweise als Standard für Swapchain-Farbpuffer verwendet wird. Bei jedem anderen Farbpufferformat führt diese Funktion keine Konvertierung durch.

Hinweis: Diese Funktion sollte nicht aufgerufen werden, während ein Frame gerade verarbeitet wird (d. h., wenn der Rückruf von ` frameReady()` durch die Anwendung noch nicht erfolgt ist).

Hinweis: Diese Funktion ist aufgrund des zusätzlichen, blockierenden Rücklesevorgangs potenziell rechenintensiv.

Hinweis: Diese Funktion setzt derzeit voraus, dass die Swapchain die Verwendung als Transferquelle (VK_IMAGE_USAGE_TRANSFER_SRC_BIT) unterstützt; andernfalls schlägt sie fehl.

VkCommandPool QVulkanWindow::graphicsCommandPool() const

Gibt den aktiven Grafikbefehlspool zurück.

Hinweis: Der Aufruf dieser Funktion ist nur vom Aufruf von ` QVulkanWindowRenderer::initResources()` bis einschließlich ` QVulkanWindowRenderer::releaseResources()` gültig.

VkQueue QVulkanWindow::graphicsQueue() const

Gibt die aktive Grafikwarteschlange zurück.

Hinweis: Der Aufruf dieser Funktion ist nur gültig vom Aufruf von ` QVulkanWindowRenderer::initResources()` bis einschließlich ` QVulkanWindowRenderer::releaseResources()`.

uint32_t QVulkanWindow::graphicsQueueFamilyIndex() const

Gibt den Familienindex der aktiven Grafikwarteschlange zurück.

Hinweis: Der Aufruf dieser Funktion ist nur vom Aufruf von ` QVulkanWindowRenderer::initResources()` bis einschließlich ` QVulkanWindowRenderer::releaseResources()` gültig. Implementierungen von `QVulkanWindowRenderer::updateQueueCreateInfo()` können diese Funktion ebenfalls aufrufen.

uint32_t QVulkanWindow::hostVisibleMemoryIndex() const

Gibt einen für den allgemeinen Gebrauch geeigneten, vom Host sichtbaren Speicher-Typindex zurück.

Der zurückgegebene Speichertyp ist sowohl für den Host sichtbar als auch kohärent. Außerdem wird er, sofern möglich, zwischengespeichert.

Hinweis: Der Aufruf dieser Funktion ist nur vom Aufruf von ` QVulkanWindowRenderer::initResources()` bis einschließlich ` QVulkanWindowRenderer::releaseResources()` gültig.

bool QVulkanWindow::isValid() const

Gibt „true“ zurück, wenn dieses Fenster alle Vulkan-Ressourcen, einschließlich der Swapchain, erfolgreich initialisiert hat.

Hinweis: Die Initialisierung erfolgt beim ersten „expose“-Ereignis, nachdem das Fenster sichtbar gemacht wurde.

VkImage QVulkanWindow::msaaColorImage(int idx) const

Gibt das angegebene Multisample-Farbbild zurück oder „ VK_NULL_HANDLE “, wenn kein Multisampling verwendet wird.

idx muss im Bereich [0, swapChainImageCount() - 1] liegen.

Hinweis: Der Aufruf dieser Funktion ist nur vom Aufruf von ` QVulkanWindowRenderer::initSwapChainResources()` bis einschließlich ` QVulkanWindowRenderer::releaseSwapChainResources()` gültig.

VkImageView QVulkanWindow::msaaColorImageView(int idx) const

Gibt die angegebene Multisample-Farbbildansicht zurück oder „ VK_NULL_HANDLE “, wenn kein Multisampling verwendet wird.

idx muss im Bereich [0, swapChainImageCount() - 1] liegen.

Hinweis: Der Aufruf dieser Funktion ist nur zwischen dem Aufruf von ` QVulkanWindowRenderer::initSwapChainResources()` und ` QVulkanWindowRenderer::releaseSwapChainResources()` zulässig.

VkPhysicalDevice QVulkanWindow::physicalDevice() const

Gibt das aktive physische Gerät zurück.

Hinweis: Der Aufruf dieser Funktion ist nur vom Aufruf von ` QVulkanWindowRenderer::preInitResources()` bis einschließlich ` QVulkanWindowRenderer::releaseResources()` gültig.

const VkPhysicalDeviceProperties *QVulkanWindow::physicalDeviceProperties() const

Gibt einen Zeiger auf die Eigenschaften des aktiven physischen Geräts zurück.

Hinweis: Der Aufruf dieser Funktion ist nur zwischen dem Aufruf von ` QVulkanWindowRenderer::preInitResources()` und ` QVulkanWindowRenderer::releaseResources()` zulässig.

VkSampleCountFlagBits QVulkanWindow::sampleCountFlagBits() const

Gibt die aktuelle Anzahl der Samples als Wert vom Typ „ VkSampleCountFlagBits “ zurück.

Bei Verwendung des Standard-Renderziels muss das Feld „ rasterizationSamples “ von „ VkPipelineMultisampleStateCreateInfo “ auf diesen Wert gesetzt werden.

Siehe auch „ setSampleCount()“ und „ supportedSampleCounts()“.

void QVulkanWindow::setDeviceExtensions(const QByteArrayList &extensions)

Legt die Liste der zu aktivierenden Geräte extensions en fest.

Nicht unterstützte Erweiterungen werden ignoriert.

Die Swapchain-Erweiterung wird immer automatisch hinzugefügt; sie muss nicht in diese Liste aufgenommen werden.

Hinweis: Diese Funktion muss aufgerufen werden, bevor das Fenster sichtbar gemacht wird, oder spätestens in ` QVulkanWindowRenderer::preInitResources()`, und hat keine Wirkung, wenn sie danach aufgerufen wird.

[since 6.7] void QVulkanWindow::setEnabledFeaturesModifier(const QVulkanWindow::EnabledFeaturesModifier &modifier)

Legt die Funktion zur Änderung der aktivierten Gerätefunktionen fest: modifier.

Hinweis: Um Funktionen von Vulkan 1.1, 1.2 oder 1.3zu steuern, verwenden Sie stattdessen die Überladung, die ein ` EnabledFeatures2Modifier ` als Parameter erwartet.

Hinweis: „ modifier “ wird an die Callback-Funktion übergeben, wobei alle Elemente auf „false“ gesetzt sind. Es obliegt der Funktion, die Elemente nach eigenem Ermessen zu ändern.

Diese Funktion wurde in Qt 6.7 eingeführt.

Siehe auch „ EnabledFeaturesModifier “.

[since 6.7] void QVulkanWindow::setEnabledFeaturesModifier(QVulkanWindow::EnabledFeatures2Modifier modifier)

Legt die Funktion zur Änderung der aktivierten Gerätefunktionen fest: modifier.

Dies ist eine überladene Funktion.

Diese Funktion wurde in Qt 6.7 eingeführt.

Siehe auch EnabledFeatures2Modifier.

void QVulkanWindow::setFlags(QVulkanWindow::Flags flags)

Konfiguriert das Verhalten basierend auf dem übergebenen ` flags`.

Hinweis: Diese Funktion muss aufgerufen werden, bevor das Fenster sichtbar gemacht wird, oder spätestens in ` QVulkanWindowRenderer::preInitResources()`; wird sie danach aufgerufen, hat sie keine Wirkung.

Siehe auch flags().

void QVulkanWindow::setPhysicalDeviceIndex(int idx)

Fordert die Verwendung des physischen Geräts mit dem Index „ idx “ an. Der Index entspricht der Liste, die von „ availablePhysicalDevices()“ zurückgegeben wird.

Standardmäßig wird das erste physische Gerät verwendet.

Hinweis: Diese Funktion muss aufgerufen werden, bevor das Fenster sichtbar gemacht wird, oder spätestens in QVulkanWindowRenderer::preInitResources(); wird sie danach aufgerufen, hat sie keine Wirkung.

void QVulkanWindow::setPreferredColorFormats(const QList<VkFormat> &formats)

Legt das bevorzugte Format „ formats “ der Swapchain fest.

Standardmäßig ist kein anwendungsspezifisches Format festgelegt. In diesem Fall wird das bevorzugte Format der Oberfläche verwendet oder, falls dieses nicht vorhanden ist, „ VK_FORMAT_B8G8R8A8_UNORM “.

Die Liste in ` formats ` ist sortiert. Wird das erste Format nicht unterstützt, wird das zweite berücksichtigt und so weiter. Wenn kein Format aus der Liste unterstützt wird, verhält sich die Funktion wie im Standardfall.

Um das tatsächliche Format nach der Initialisierung abzufragen, rufen Sie ` colorFormat()` auf.

Hinweis: Diese Funktion muss aufgerufen werden, bevor das Fenster sichtbar gemacht wird, oder spätestens in ` QVulkanWindowRenderer::preInitResources()`, und hat keine Wirkung, wenn sie danach aufgerufen wird.

Hinweis: Durch die Neuimplementierung von ` QVulkanWindowRenderer::preInitResources()` lässt sich die Liste der unterstützten Formate bei Bedarf dynamisch abfragen. Dort kann die Oberfläche über `QVulkanInstance::surfaceForWindow()` abgerufen werden, während diese Funktion weiterhin sicher aufgerufen werden kann, um die späteren Phasen der Initialisierung zu beeinflussen.

Siehe auch ` colorFormat()`.

void QVulkanWindow::setQueueCreateInfoModifier(const QVulkanWindow::QueueCreateInfoModifier &modifier)

Legt die Funktion zur Änderung der Informationen zur Erstellung von Warteschlangen fest: modifier.

Siehe auch QueueCreateInfoModifier.

void QVulkanWindow::setSampleCount(int sampleCount)

Fordert Multisample-Antialiasing mit dem angegebenen Wert „ sampleCount “ an. Gültige Werte sind 1, 2, 4, 8, … bis hin zum vom physischen Gerät unterstützten Maximalwert.

Wenn die Abtastanzahl größer als 1 ist, erstellt ` QVulkanWindow ` einen Multisample-Farbpuffer, anstatt lediglich die Bilder der Swapchain anzusteuern. Die Darstellung im Multisample-Puffer wird am Ende jedes Frames in die Nicht-Multisample-Puffer aufgelöst.

Um die Liste der unterstützten Sample-Anzahlen einzusehen, rufen Sie ` supportedSampleCounts()` auf.

Rufen Sie beim Einrichten der Rendering-Pipeline sampleCountFlagBits() auf, um die aktive Sample-Anzahl als „ VkSampleCountFlagBits “-Wert abzufragen.

Hinweis: Diese Funktion muss aufgerufen werden, bevor das Fenster sichtbar gemacht wird, oder spätestens in ` QVulkanWindowRenderer::preInitResources()`, und hat keine Wirkung, wenn sie danach aufgerufen wird.

Siehe auch ` supportedSampleCounts()` und ` sampleCountFlagBits()`.

QVulkanInfoVector<QVulkanExtension> QVulkanWindow::supportedDeviceExtensions()

Gibt die Liste der Erweiterungen zurück, die von logischen Geräten unterstützt werden, die aus dem mit setPhysicalDeviceIndex() ausgewählten physischen Gerät erstellt wurden.

Hinweis: Diese Funktion kann aufgerufen werden, bevor das Fenster sichtbar gemacht wird.

QList<int> QVulkanWindow::supportedSampleCounts()

Gibt die Menge der unterstützten Sample-Zahlen bei Verwendung des durch ` setPhysicalDeviceIndex()` ausgewählten physischen Geräts als sortierte Liste zurück.

Standardmäßig verwendet „ QVulkanWindow “ eine Abtastanzahl von 1. Durch Aufruf von „ setSampleCount()“ mit einem anderen Wert (2, 4, 8, …) aus der von dieser Funktion zurückgegebenen Menge kann eine Mehrfachabtastung zur Kantenglättung angefordert werden.

Hinweis: Diese Funktion kann aufgerufen werden, bevor das Fenster sichtbar gemacht wird.

Siehe auch ` setSampleCount()`.

bool QVulkanWindow::supportsGrab() const

Gibt „true“ zurück, wenn die Swapchain die Verwendung als Transferquelle unterstützt, d. h., wenn grab() funktionsfähig ist.

Hinweis: Der Aufruf dieser Funktion ist nur vom Aufruf von ` QVulkanWindowRenderer::initSwapChainResources()` bis einschließlich ` QVulkanWindowRenderer::releaseSwapChainResources()` zulässig.

VkImage QVulkanWindow::swapChainImage(int idx) const

Gibt das angegebene Swap-Chain-Image zurück.

idx muss im Bereich [0, swapChainImageCount() - 1] liegen.

Hinweis: Der Aufruf dieser Funktion ist nur vom Aufruf von ` QVulkanWindowRenderer::initSwapChainResources()` bis einschließlich ` QVulkanWindowRenderer::releaseSwapChainResources()` gültig.

int QVulkanWindow::swapChainImageCount() const

Gibt die Anzahl der Bilder in der Swap-Chain zurück.

Hinweis: Der Zugriff darauf ist erforderlich, wenn ein benutzerdefinierter Render-Pass und ein Framebuffer bereitgestellt werden. Der Framebuffer ist spezifisch für das aktuelle Swap-Chain-Bild, daher muss die Anwendung mehrere Framebuffer bereitstellen.

Hinweis: Der Aufruf dieser Funktion ist nur zwischen dem Aufruf von ` QVulkanWindowRenderer::initSwapChainResources()` und ` QVulkanWindowRenderer::releaseSwapChainResources()` zulässig.

QSize QVulkanWindow::swapChainImageSize() const

Gibt die Bildgröße der Swapchain zurück.

Diese entspricht in der Regel der Größe des Fensters, kann jedoch auch abweichen, falls vkGetPhysicalDeviceSurfaceCapabilitiesKHR eine feste Größe meldet.

Zudem wurde auf einigen Plattformen beobachtet, dass die von Vulkan gemeldete Oberflächengröße bei aktiver hoher DPI-Skalierung abweicht, d. h., das Ergebnis von ` QWindow. size()` multipliziert mit ` devicePixelRatio()` war im Vergleich zum hier zurückgegebenen Wert um 1 Pixel kleiner oder größer, vermutlich aufgrund von Rundungsunterschieden. Der Rendering-Code sollte dies berücksichtigen, und jede damit verbundene Rendering-Logik muss auf dem hier zurückgegebenen Wert basieren, niemals auf der von QWindow gemeldeten Größe. Unabhängig davon, welche Pixelgröße theoretisch korrekt ist, darf sich das Vulkan-Rendering ausschließlich auf die von der Vulkan-API gemeldete Oberflächengröße stützen. Andernfalls können Validierungsfehler auftreten, z. B. beim Festlegen des Viewports, da die von der Anwendung bereitgestellten Werte aus Sicht von Vulkan außerhalb des zulässigen Bereichs liegen können.

Hinweis: Der Aufruf dieser Funktion ist nur vom Aufruf von ` QVulkanWindowRenderer::initSwapChainResources()` bis einschließlich ` QVulkanWindowRenderer::releaseSwapChainResources()` gültig.

VkImageView QVulkanWindow::swapChainImageView(int idx) const

Gibt die angegebene Swap-Chain-Image-Ansicht zurück.

idx muss im Bereich [0, swapChainImageCount() - 1] liegen.

Hinweis: Der Aufruf dieser Funktion ist nur vom Aufruf von ` QVulkanWindowRenderer::initSwapChainResources()` bis einschließlich ` QVulkanWindowRenderer::releaseSwapChainResources()` gültig.

Dokumentation zu den Member-Variablen

const int QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT

Diese Variable enthält einen konstanten Wert, der immer gleich oder größer als der Maximalwert von „ concurrentFrameCount()“ ist.

© 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.