QVulkanWindow Class

Die Klasse QVulkanWindow ist eine einfache Unterklasse von QWindow, um Vulkan-Rendering durchzuführen. Mehr...

Kopfzeile: #include <QVulkanWindow>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
Erbt: 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

Detaillierte Beschreibung

QVulkanWindow ist ein Vulkan-fähiges QWindow, das ein Vulkan-Gerät, eine Grafik-Warteschlange, einen Befehlspool und -puffer, ein Tiefenschablonenbild und eine doppelt gepufferte FIFO-Swapchain verwaltet, während es sich um korrektes Verhalten bei Ereignissen wie Größenänderung, spezielle Situationen wie das Fehlen einer Geräte-Warteschlange, die sowohl Grafik als auch Präsentation unterstützt, Szenarien mit verlorenem Gerät und zusätzliche Funktionen wie das Zurücklesen des gerenderten Inhalts kümmert. Konzeptionell ist es das Gegenstück von QOpenGLWindow in der Vulkan-Welt.

Hinweis: QVulkanWindow macht die Implementierung einer vollständig benutzerdefinierten QWindow Unterklasse nicht immer überflüssig, da sie in fortgeschrittenen Anwendungsfällen nicht unbedingt ausreichend ist.

QVulkanWindow kann in QWidget-basierte Benutzeroberflächen über QWidget::createWindowContainer() eingebettet werden. Dieser Ansatz hat jedoch eine Reihe von Einschränkungen. Studieren Sie daher zuerst die documentation.

Eine typische Anwendung, die QVulkanWindow verwendet, kann 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; // Aktivieren der Standard-Validierungsebenen, wenn verfügbarinst.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 Hauptmuster bei der Verwendung von QVulkanWindow:

  • Die QVulkanInstance wird über QWindow::setVulkanInstance() zugeordnet. Es ist dann über QWindow::vulkanInstance() von überall und in jedem Thread abrufbar.
  • Ähnlich wie bei QVulkanInstance können Geräteerweiterungen über supportedDeviceExtensions() vor der eigentlichen Initialisierung abgefragt werden. Die Abfrage einer zu aktivierenden Erweiterung erfolgt über setDeviceExtensions(). Solche Aufrufe müssen erfolgen, bevor das Fenster sichtbar wird, d.h. bevor show() oder ähnliche Funktionen aufgerufen werden. Nicht unterstützte Erweiterungsanfragen werden gnädigerweise ignoriert.
  • Der Renderer ist in einer QVulkanWindowRenderer Unterklasse implementiert, deren Instanz in der createRenderer() Fabrikfunktion erstellt wird.
  • Die wichtigsten Vulkan-Befehle werden über das Objekt QVulkanFunctions bereitgestellt, das durch den Aufruf von QVulkanInstance::functions() abgerufen werden kann. Funktionen auf Geräteebene sind nach der Erstellung eines VkDevice durch Aufruf von QVulkanInstance::deviceFunctions() verfügbar.
  • Die Erstellung der Zeichenaufrufe für den nächsten Frame erfolgt in QVulkanWindowRenderer::startNextFrame(). Von der Implementierung wird erwartet, dass sie Befehle in den von currentCommandBuffer() zurückgegebenen Befehlspuffer einfügt. 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 Erzeugung von Befehlen, möglicherweise auf mehreren Threads. Einfache Implementierungen rufen einfach frameReady() am Ende ihrer QVulkanWindowRenderer::startNextFrame() auf.
  • Die grundlegenden Vulkan-Ressourcen (physisches Gerät, Grafik-Warteschlange, ein Befehlspool, der Hauptbefehlspuffer des Fensters, Bildformate usw.) werden in QVulkanWindow über leichtgewichtige Getter-Funktionen bereitgestellt. Einige dieser Funktionen dienen nur der Bequemlichkeit, und es steht den Anwendungen jederzeit frei, zusätzliche Ressourcen direkt über die Vulkan-API abzufragen, zu erstellen und zu verwalten.
  • Der Renderer befindet sich im Gui/Haupt-Thread, wie das Fenster selbst. Dieser Thread wird dann auf die Darstellungsrate gedrosselt, ähnlich wie es bei OpenGL mit einem Swap-Intervall von 1 der Fall wäre. Der Renderer-Implementierung steht es jedoch frei, mehrere Threads auf beliebige Weise zu nutzen. Die Accessoren wie vulkanInstance(), currentCommandBuffer() usw. können von jedem Thread aus aufgerufen werden. Die Übergabe des Hauptbefehlspuffers, die Einreihung in die Warteschlange und der Aufbau des nächsten Bildes beginnen erst, wenn frameReady() auf dem gui/main-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 kontinuierlich zu rendern, rufen Sie requestUpdate() nach frameReady() auf.

Zur Fehlersuche aktivieren Sie die Logging-Kategorie qt.vulkan. Kritische Fehler werden über qWarning() automatisch ausgegeben.

Unterschiede im Koordinatensystem zwischen OpenGL und Vulkan

Es gibt zwei bemerkenswerte Unterschiede, auf die Sie achten sollten: Erstens zeigt bei Vulkan die Y-Achse im Clip Space nach unten, während OpenGL eine nach oben zeigende Y-Achse verwendet. Zweitens nimmt die Standard-OpenGL-Projektionsmatrix für die nahe und ferne Ebene die Werte -1 und 1 an, während Vulkan 0 und 1 bevorzugt.

Um Anwendungen bei der Migration von OpenGL-basiertem Code zu helfen, ohne die Y-Koordinaten in den Vertex-Daten umzudrehen, 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, bietet QVulkanWindow eine Korrekturmatrix, 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 das Auflösen in die Nicht-Multisample-Puffer der Swapchain werden alle automatisch verwaltet.

Um die Anzahl der unterstützten Samples abzufragen, rufen Sie supportedSampleCounts() auf. Wenn der zurückgegebene Satz 4, 8, ... enthält, fordert die Übergabe eines dieser Werte an setSampleCount() das Multisample-Rendering an.

Hinweis: Im Gegensatz zu QSurfaceFormat::setSamples() wird die Liste der unterstützten Abtastwerte den Anwendungen im Voraus bekannt gegeben, und es gibt keinen automatischen Rückgriff auf niedrigere Abtastwerte in setSampleCount(). Wenn der angeforderte Wert nicht unterstützt wird, wird eine Warnung angezeigt und es wird kein Multisampling verwendet.

Bilder zurücklesen

Wenn supportsGrab() den Wert true zurückgibt, kann QVulkanWindow Bilder aus dem Farbpuffer in ein QImage zurücklesen. grab() ist eine langsame und ineffiziente Operation, weshalb eine häufige Verwendung vermieden werden sollte. Sie ist dennoch wertvoll, da sie es Anwendungen ermöglicht, Screenshots zu machen, oder Tools und Tests, um die Ausgabe des GPU-Renderings zu verarbeiten und zu verifizieren.

sRGB-Unterstützung

Während viele Anwendungen mit dem Standardverhalten von QVulkanWindow zufrieden sein werden, wenn es um Swapchain-Bildformate geht, erlaubt setPreferredColorFormats() das Anfordern eines vordefinierten Formats. Dies ist vor allem bei der Arbeit im sRGB-Farbraum nützlich. Die Übergabe eines Formats wie VK_FORMAT_B8G8R8A8_SRGB führt dazu, dass ein sRGB-Format gewählt wird, sofern verfügbar.

Validierungsebenen

Während der Anwendungsentwicklung kann es äußerst nützlich sein, die Vulkan-Validierungsebenen zu aktivieren. Wie im obigen Beispielcode gezeigt, ermöglicht der Aufruf von QVulkanInstance::setLayers() auf QVulkanInstance vor QVulkanInstance::create() die Validierung, vorausgesetzt, der Vulkan-Treiberstapel im System enthält die erforderlichen Schichten.

Hinweis: Beachten Sie die plattformspezifischen Unterschiede. Auf Desktop-Plattformen reicht es in der Regel aus, das Vulkan-SDK zu installieren. Android erfordert jedoch beispielsweise die Bereitstellung zusätzlicher gemeinsam genutzter Bibliotheken zusammen mit der Anwendung und schreibt außerdem eine andere Liste von Namen für Validierungsschichten vor. Weitere Informationen finden Sie auf den Android Vulkan-Entwicklungsseiten.

Hinweis: QVulkanWindow stellt keine Geräteebenen zur Verfügung, 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() zu einem frühen Zeitpunkt beim Einrichten des QVulkanWindow auf. Um abzufragen, welche Geräteerweiterungen verfügbar sind, rufen Sie supportedDeviceExtensions() auf.

Die Angabe eines nicht unterstützten Layers oder einer nicht unterstützten Erweiterung wird elegant gehandhabt: die Erstellung der Instanz oder des Geräts schlägt nicht fehl, aber die Anfrage des Layers oder der Erweiterung wird ignoriert.

Wenn es um Gerätefunktionen geht, 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 die volle Kontrolle über die VkPhysicalDeviceFeatures, die für die Geräteerstellung verwendet werden, auch möglich, indem eine Callback-Funktion mit setEnabledFeaturesModifier() registriert wird. Wenn sie gesetzt ist, wird die Callback-Funktion aufgerufen und kann die VkPhysicalDeviceFeatures oder VkPhysicalDeviceFeatures2 ändern.

Siehe auch QVulkanInstance und QWindow.

Dokumentation der Mitgliedstypen

[since 6.7] QVulkanWindow::EnabledFeatures2Modifier

Eine Funktion, die während der Grafikinitialisierung aufgerufen wird, um die VkPhysicalDeviceFeatures2 zu ändern, die in der VkDeviceCreateInfo geändert wird.

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

Dies ist jedoch nicht immer ausreichend, wenn mit Vulkan 1.1, 1.2 oder 1.3 Funktionen und Erweiterungen gearbeitet wird. Daher dieser Callback-Mechanismus. Wenn nur Vulkan 1.0 zur Laufzeit relevant ist, verwenden Sie stattdessen setEnabledFeaturesModifier().

Die VkPhysicalDeviceFeatures2-Referenz wird an die Callback-Funktion übergeben, wobei sType gesetzt ist, der Rest aber auf Null gesetzt ist. Es liegt an der Funktion, die Mitglieder auf true zu ändern oder pNext Ketten nach eigenem Ermessen einzurichten.

Hinweis: Beim Einrichten von pNext -Ketten ist darauf zu achten, dass die referenzierten Objekte eine ausreichend lange Lebensdauer haben, z.B. indem sie als Member-Variablen in der QVulkanWindow -Unterklasse gespeichert werden.

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 VkPhysicalDeviceFeatures zu ändern, die bei der Erstellung eines Vulkan-Geräteobjekts übergeben wird.

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

Die übergebene VkPhysicalDeviceFeatures-Referenz wird zum Zeitpunkt des Funktionsaufrufs auf Null zurückgesetzt. Es liegt an der Funktion, die Mitglieder nach eigenem Ermessen zu ändern.

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

Siehe auch setEnabledFeaturesModifier().

enum QVulkanWindow::Flag
flags QVulkanWindow::Flags

Diese Aufzählung beschreibt die Flags, die an setFlags() übergeben werden können.

KonstanteWertBeschreibung
QVulkanWindow::PersistentResources0x01Stellt sicher, dass keine Grafikressourcen freigegeben werden, wenn das Fenster nicht mehr belichtet wird. Das Standardverhalten ist, alles freizugeben und später zu reinitialisieren, wenn es 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 bereitgestellten Eigenschaften der Warteschlangenfamilie können zur Auswahl der Indizes für die zusätzlichen Warteschlangen verwendet werden. Der Renderer kann anschließend die tatsächliche Warteschlange in initResources() anfordern.

Hinweis: Wenn zusätzliche Grafik-Warteschlangen angefordert werden, fordert Qt selbst immer eine Grafik-Warteschlange an. Sie müssen in queueCreateInfo nach dem entsprechenden Eintrag suchen und diesen manipulieren, um die zusätzliche Warteschlange zu erhalten.

Siehe auch setQueueCreateInfoModifier().

Dokumentation der Mitgliedsfunktionen

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

Konstruiert ein neues QVulkanWindow mit der angegebenen parent.

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

[virtual noexcept] QVulkanWindow::~QVulkanWindow()

Zerstörer.

QList<VkPhysicalDeviceProperties> QVulkanWindow::availablePhysicalDevices()

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

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

QMatrix4x4 QVulkanWindow::clipCorrectionMatrix()

Gibt eine QMatrix4x4 zurück, die zur Korrektur von Koordinatensystemunterschieden zwischen OpenGL und Vulkan verwendet werden kann.

Durch Vormultiplikation der Projektionsmatrix mit dieser Matrix können Anwendungen weiterhin davon ausgehen, dass Y nach oben zeigt, und können minDepth und maxDepth im Ansichtsfenster auf 0 bzw. 1 setzen, ohne weitere Korrekturen an den Vertex-Z-Positionen vornehmen zu müssen. Geometrien aus OpenGL-Anwendungen können dann so verwendet werden, wie sie sind, unter der Annahme, dass der Rasterungszustand mit den OpenGL-Culling- und Frontflächeneinstellungen übereinstimmt.

VkFormat QVulkanWindow::colorFormat() const

Gibt das von der Swapchain verwendete Farbpufferformat zurück.

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initResources() bis 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 ist für die gesamte Lebensdauer von 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, so dass außer dem Löschen der Puffer kein Rendering durchgeführt wird.

Das Fenster übernimmt das Eigentum an dem zurückgegebenen Renderer-Objekt.

VkCommandBuffer QVulkanWindow::currentCommandBuffer() const

Gibt den aktiven Befehlspuffer für das aktuelle Swap-Chain-Image zurück. Es wird erwartet, dass Implementierungen von QVulkanWindowRenderer::startNextFrame() Befehle zu diesem Befehlspuffer 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.

Um sich nicht auf dynamische Array-Größen zu verlassen, können Anwendungen MAX_CONCURRENT_FRAME_COUNT verwenden, wenn sie Arrays deklarieren. Diese ist garantiert immer gleich oder größer als der von concurrentFrameCount() zurückgegebene Wert. Solche Arrays können dann durch den von dieser Funktion zurückgegebenen Wert 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-Renderpasses zurück.

Der Framebuffer hat zwei Anhänge (color, depth-stencil), wenn kein Multisampling verwendet wird, und drei (color resolve, depth-stencil, multisample color), wenn sampleCountFlagBits() größer als VK_SAMPLE_COUNT_1_BIT ist. Renderer müssen dies berücksichtigen, z. B. bei der Bereitstellung von clear-Werten.

Hinweis: Anwendungen sind nicht verpflichtet, diesen Framebuffer zu verwenden, wenn sie ihren eigenen Renderpass bereitstellen, anstatt den von defaultRenderPass() zurückgegebenen zu verwenden.

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

Siehe auch defaultRenderPass().

int QVulkanWindow::currentSwapChainImageIndex() const

Gibt den aktuellen Swap-Chain-Bildindex 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 Rendering-Pass mit einem Sub-Pass zurück.

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

Hinweis: Das Lesen/Schreiben von Schablonen ist in diesem Rendering-Pass nicht aktiviert.

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initResources() bis QVulkanWindowRenderer::releaseResources() gültig.

Siehe auch currentFramebuffer().

VkFormat QVulkanWindow::depthStencilFormat() const

Gibt das von den Tiefenschablonenpuffern verwendete Format zurück.

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initResources() bis QVulkanWindowRenderer::releaseResources() gültig.

VkImage QVulkanWindow::depthStencilImage() const

Gibt das Tiefenschablonenbild zurück.

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initSwapChainResources() bis QVulkanWindowRenderer::releaseSwapChainResources() gültig.

VkImageView QVulkanWindow::depthStencilImageView() const

Gibt die Ansicht des Tiefenschablonenbildes zurück.

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initSwapChainResources() bis QVulkanWindowRenderer::releaseSwapChainResources() gültig.

VkDevice QVulkanWindow::device() const

Gibt das aktive logische Gerät zurück.

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initResources() bis QVulkanWindowRenderer::releaseResources() gültig.

uint32_t QVulkanWindow::deviceLocalMemoryIndex() const

Gibt einen Index des lokalen Speichertyps des Geräts zurück, der für den allgemeinen Gebrauch geeignet ist.

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initResources() bis QVulkanWindowRenderer::releaseResources() gültig.

Hinweis: Es ist nicht garantiert, dass dieser Speichertyp immer geeignet ist. Die korrekte, implementierungsübergreifende Lösung - insbesondere für gerätelokale Bilder - besteht darin, nach Prüfung der von vkGetImageMemoryRequirements zurückgegebenen Maske manuell einen Speichertyp auszuwählen.

QVulkanWindow::Flags QVulkanWindow::flags() const

Gibt die angeforderten Flags zurück.

Siehe auch setFlags().

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

Dieses Signal wird ausgesendet, wenn die image bereit ist.

void QVulkanWindow::frameReady()

Diese Funktion muss genau einmal als Reaktion auf jeden Aufruf der Implementierung QVulkanWindowRenderer::startNextFrame() aufgerufen werden. Zum Zeitpunkt dieses Aufrufs müssen dem Hauptbefehlspuffer, der über currentCommandBuffer() zugänglich ist, 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/main-Thread aus aufgerufen werden, in dem die Funktionen von QVulkanWindowRenderer aufgerufen werden und in dem sich die Instanz QVulkanWindow befindet.

Siehe auch QVulkanWindowRenderer::startNextFrame().

QImage QVulkanWindow::grab()

Erstellt und rendert das nächste Bild, ohne es zu präsentieren, und führt dann ein blockierendes Zurücklesen des Bildinhalts durch.

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

Das zurückgegebene QImage hat immer das Format QImage::Format_RGBA8888. Wenn colorFormat() VK_FORMAT_B8G8R8A8_UNORM ist, werden die roten und blauen Kanäle automatisch vertauscht, da dieses Format üblicherweise als Standard für Swapchain-Farbpuffer verwendet wird. Bei allen anderen Farbpufferformaten wird von dieser Funktion keine Konvertierung durchgeführt.

Hinweis: Diese Funktion sollte nicht aufgerufen werden, wenn ein Frame in Bearbeitung ist (d.h. frameReady() wurde noch nicht von der Anwendung zurückgerufen).

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

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

VkCommandPool QVulkanWindow::graphicsCommandPool() const

Gibt den aktiven Grafik-Befehlspool zurück.

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initResources() bis QVulkanWindowRenderer::releaseResources() gültig.

VkQueue QVulkanWindow::graphicsQueue() const

Gibt die aktive Grafikwarteschlange zurück.

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initResources() bis QVulkanWindowRenderer::releaseResources() gültig.

uint32_t QVulkanWindow::graphicsQueueFamilyIndex() const

Gibt den Familienindex der aktiven Grafikwarteschlange zurück.

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initResources() bis QVulkanWindowRenderer::releaseResources() gültig. Implementierungen von QVulkanWindowRenderer::updateQueueCreateInfo() können diese Funktion ebenfalls aufrufen.

uint32_t QVulkanWindow::hostVisibleMemoryIndex() const

Gibt einen für den Host sichtbaren Speichertyp-Index zurück, der für den allgemeinen Gebrauch geeignet ist.

Der zurückgegebene Speichertyp ist sowohl für den Host sichtbar als auch kohärent. Darüber hinaus wird er, wenn möglich, im Cache gespeichert.

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initResources() bis zu QVulkanWindowRenderer::releaseResources() gültig.

bool QVulkanWindow::isValid() const

Gibt true zurück, wenn dieses Fenster erfolgreich alle Vulkan-Ressourcen, einschließlich der Swapchain, 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 Multisampling nicht verwendet wird.

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

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initSwapChainResources() bis QVulkanWindowRenderer::releaseSwapChainResources() gültig.

VkImageView QVulkanWindow::msaaColorImageView(int idx) const

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

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

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initSwapChainResources() bis QVulkanWindowRenderer::releaseSwapChainResources() gültig.

VkPhysicalDevice QVulkanWindow::physicalDevice() const

Gibt das aktive physische Gerät zurück.

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::preInitResources() bis 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 ab dem Aufruf von QVulkanWindowRenderer::preInitResources() bis QVulkanWindowRenderer::releaseResources() gültig.

VkSampleCountFlagBits QVulkanWindow::sampleCountFlagBits() const

Gibt die aktuelle Anzahl der Proben als Wert VkSampleCountFlagBits zurück.

Wenn Sie das Standard-Rendering-Ziel anvisieren, 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 fest.

Nicht unterstützte Erweiterungen werden ignoriert.

Die Swapchain-Erweiterung wird immer automatisch hinzugefügt, es ist nicht nötig, sie in diese Liste aufzunehmen.

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 Modifikationsfunktion modifier für die aktivierten Gerätefunktionen fest.

Hinweis: Um Vulkan 1.1-, 1.2- oder 1.3-Funktionen zu steuern, verwenden Sie stattdessen die Überladung mit EnabledFeatures2Modifier.

Hinweis: modifier wird an die Callback-Funktion übergeben, wobei alle Mitglieder auf false gesetzt sind. Es liegt an der Funktion, die Mitglieder 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äteeigenschaften 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 auf der Grundlage der angegebenen flags.

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 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(), und hat keine Wirkung, wenn sie danach aufgerufen wird.

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

Legt das bevorzugte formats der Swapchain fest.

Standardmäßig ist kein von der Anwendung bevorzugtes Format eingestellt. In diesem Fall wird das bevorzugte Format der Oberfläche verwendet oder, falls dies nicht der Fall ist, VK_FORMAT_B8G8R8A8_UNORM.

Die Liste in formats ist geordnet. Wenn das erste Format nicht unterstützt wird, wird das zweite berücksichtigt, usw. Wenn keine Formate in der Liste unterstützt werden, ist das Verhalten das gleiche wie im Standardfall.

Um das aktuelle Format nach der Initialisierung abzufragen, rufen Sie colorFormat() auf.

Hinweis: Diese Funktion muss vor dem Sichtbarmachen des Fensters oder spätestens in QVulkanWindowRenderer::preInitResources() aufgerufen werden und hat keine Wirkung, wenn sie danach aufgerufen wird.

Hinweis: Eine Reimplementierung von QVulkanWindowRenderer::preInitResources() erlaubt es, die Liste der unterstützten Formate dynamisch zu überprüfen, falls dies gewünscht wird. Dort ist die Oberfläche über QVulkanInstace::surfaceForWindow() abrufbar, 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 Warteschlangeninfo fest modifier.

Siehe auch QueueCreateInfoModifier.

void QVulkanWindow::setSampleCount(int sampleCount)

Fordert Multisample-Antialiasing mit dem angegebenen sampleCount an. Die gültigen Werte sind 1, 2, 4, 8, ... bis zum maximalen Wert, der vom physikalischen Gerät unterstützt wird.

Wenn die Anzahl der Samples größer als 1 ist, erstellt QVulkanWindow einen Multisample-Farbpuffer, anstatt einfach die Bilder der Swapchain zu verwenden. Das Rendering im Multisample-Puffer wird am Ende eines jeden Frames in die Nicht-Multisample-Puffer aufgelöst.

Um die Liste der unterstützten Abtastwerte zu prüfen, rufen Sie supportedSampleCounts() auf.

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

Hinweis: Diese Funktion muss vor dem Sichtbarmachen des Fensters oder spätestens in QVulkanWindowRenderer::preInitResources() aufgerufen werden 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 Abtastwerte bei Verwendung des von setPhysicalDeviceIndex() ausgewählten physischen Geräts in Form einer sortierten Liste zurück.

Standardmäßig verwendet QVulkanWindow einen Abtastwert von 1. Durch Aufruf von setSampleCount() mit einem anderen Wert (2, 4, 8, ...) aus der von dieser Funktion zurückgegebenen Menge kann Multisample-Anti-Aliasing 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. grab() ist funktionsfähig.

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initSwapChainResources() bis QVulkanWindowRenderer::releaseSwapChainResources() gültig.

VkImage QVulkanWindow::swapChainImage(int idx) const

Gibt das angegebene Bild der Tauschkette zurück.

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

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initSwapChainResources() bis QVulkanWindowRenderer::releaseSwapChainResources() gültig.

int QVulkanWindow::swapChainImageCount() const

Gibt die Anzahl der Bilder in der Auslagerungskette zurück.

Hinweis: Der Zugriff darauf ist notwendig, wenn ein benutzerdefinierter Renderpass und ein Framebuffer bereitgestellt werden. Der Framebuffer ist spezifisch für das aktuelle Swapchain-Bild und daher muss die Anwendung mehrere Framebuffer bereitstellen.

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initSwapChainResources() bis zu QVulkanWindowRenderer::releaseSwapChainResources() gültig.

QSize QVulkanWindow::swapChainImageSize() const

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

Diese stimmt normalerweise mit der Größe des Fensters überein, kann aber auch abweichen, wenn vkGetPhysicalDeviceSurfaceCapabilitiesKHR eine feste Größe meldet.

Darüber hinaus wurde auf einigen Plattformen beobachtet, dass die von Vulkan gemeldete Oberflächengröße bei aktivierter hoher DPI-Skalierung abweicht, was bedeutet, dass der von QWindow gemeldete Wert size() multipliziert mit devicePixelRatio() um 1 Pixel kleiner oder größer ist als der von hier zurückgegebene Wert, vermutlich aufgrund von Rundungsunterschieden. Der Rendering-Code sollte sich dessen bewusst sein, und jede damit zusammenhängende Rendering-Logik muss auf dem von 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 immer nur auf die von der Vulkan-API gemeldete Oberflächengröße stützen. Andernfalls kann es zu Validierungsfehlern kommen, z. B. beim Setzen des Ansichtsfensters, weil die von der Anwendung bereitgestellten Werte aus Sicht von Vulkan nicht mehr zulässig sind.

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initSwapChainResources() bis zu QVulkanWindowRenderer::releaseSwapChainResources() gültig.

VkImageView QVulkanWindow::swapChainImageView(int idx) const

Gibt die angegebene Bildansicht der Tauschkette zurück.

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

Hinweis: Der Aufruf dieser Funktion ist nur ab dem Aufruf von QVulkanWindowRenderer::initSwapChainResources() bis QVulkanWindowRenderer::releaseSwapChainResources() gültig.

Dokumentation der Mitgliedsvariablen

const int QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT

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

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