QVulkanWindow Class
La classe QVulkanWindow est une sous-classe de commodité de QWindow pour effectuer le rendu Vulkan. Plus...
| En-tête : | #include <QVulkanWindow> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Gui)target_link_libraries(mytarget PRIVATE Qt6::Gui) |
| qmake : | QT += gui |
| Hérite : | QWindow |
Types publics
(since 6.7) | EnabledFeatures2Modifier |
| EnabledFeaturesModifier | |
| enum | Flag { PersistentResources } |
| flags | Flags |
| QueueCreateInfoModifier |
Fonctions publiques
| 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 |
Signaux
| void | frameGrabbed(const QImage &image) |
Membres publics statiques
| const int | MAX_CONCURRENT_FRAME_COUNT |
Description détaillée
QVulkanWindow est un site QWindow compatible avec Vulkan qui gère un périphérique Vulkan, une file d'attente graphique, un pool de commandes et un tampon, une image de profondeur-stencil et une chaîne d'échange FIFO à double tampon, tout en prenant soin d'un comportement correct lorsqu'il s'agit d'événements tels que le redimensionnement, de situations spéciales telles que l'absence d'une file d'attente de périphérique prenant en charge à la fois les graphiques et la présentation, de scénarios de perte de périphérique, et de fonctionnalités supplémentaires telles que la relecture du contenu rendu. D'un point de vue conceptuel, il s'agit de l'équivalent de QOpenGLWindow dans le monde Vulkan.
Remarque : QVulkanWindow n'élimine pas toujours la nécessité d'implémenter une sous-classe QWindow entièrement personnalisée, car elle ne sera pas nécessairement suffisante dans les cas d'utilisation avancés.
QVulkanWindow peut être intégrée dans des interfaces utilisateur basées sur QWidget via QWidget::createWindowContainer(). Cette approche présente toutefois un certain nombre de limitations. Veillez à étudier d'abord le site documentation.
Une application typique utilisant QVulkanWindow peut ressembler à ce qui suit :
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 ; // active les couches de validation standard, lorsqu'elles sont disponiblesinst.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() ; }
Comme on peut le voir dans l'exemple, les principaux modèles d'utilisation de QVulkanWindow sont les suivants :
- La fenêtre QVulkanInstance est associée via QWindow::setVulkanInstance(). Il est ensuite récupérable via QWindow::vulkanInstance() depuis n'importe où, sur n'importe quel thread.
- De la même manière que pour QVulkanInstance, les extensions de périphériques peuvent être demandées via supportedDeviceExtensions() avant l'initialisation proprement dite. La demande d'activation d'une extension se fait via setDeviceExtensions(). Ces appels doivent être effectués avant que la fenêtre ne devienne visible, c'est-à-dire avant d'appeler show() ou des fonctions similaires. Les demandes d'extension non prises en charge sont ignorées.
- Le moteur de rendu est implémenté dans une sous-classe QVulkanWindowRenderer, dont une instance est créée dans la fonction d'usine createRenderer().
- Les principales commandes Vulkan sont exposées via l'objet QVulkanFunctions, que l'on peut récupérer en appelant QVulkanInstance::functions(). Les fonctions au niveau du périphérique sont disponibles après avoir créé un VkDevice en appelant QVulkanInstance::deviceFunctions().
- La construction des appels de dessin pour la trame suivante se fait dans QVulkanWindowRenderer::startNextFrame(). L'implémentation est censée ajouter des commandes au tampon de commande renvoyé par currentCommandBuffer(). Le retour de la fonction n'indique pas que les commandes sont prêtes à être envoyées. Au contraire, un appel explicite à frameReady() est nécessaire. Cela permet de générer des commandes de manière asynchrone, éventuellement sur plusieurs fils d'exécution. Les implémentations simples appelleront simplement frameReady() à la fin de leur QVulkanWindowRenderer::startNextFrame().
- Les ressources Vulkan de base (périphérique physique, file d'attente graphique, pool de commandes, tampon de commande principal de la fenêtre, formats d'image, etc.) sont exposées sur QVulkanWindow via des fonctions d'obtention légères. ) sont exposées sur QVulkanWindow via des fonctions d'obtention légères. Certaines d'entre elles ne sont là que par commodité, et les applications sont toujours libres d'interroger, de créer et de gérer des ressources supplémentaires directement via l'API Vulkan.
- Le moteur de rendu se trouve dans le thread principal de l'interface utilisateur, tout comme la fenêtre elle-même. Ce thread est ensuite ralenti en fonction du taux de présentation, de la même manière qu'OpenGL avec un intervalle de permutation de 1. Cependant, l'implémentation du moteur de rendu est libre d'utiliser plusieurs threads comme bon lui semble. Les accesseurs tels que vulkanInstance(), currentCommandBuffer(), etc. peuvent être appelés à partir de n'importe quel thread. La soumission du tampon de commande principal, la mise en file d'attente des images présentes et la construction de l'image suivante ne commencent pas tant que frameReady() n'est pas invoqué sur le thread principal de l'interface utilisateur.
- Lorsque la fenêtre est rendue visible, son contenu est mis à jour automatiquement. D'autres mises à jour peuvent être demandées en appelant QWindow::requestUpdate(). Pour un rendu continu, appelez requestUpdate() après frameReady().
Pour le dépannage, activez la catégorie de journalisation qt.vulkan. Les erreurs critiques sont automatiquement imprimées via qWarning().
Différences de système de coordonnées entre OpenGL et Vulkan
Il y a deux différences notables à connaître : Premièrement, avec Vulkan, l'axe Y pointe vers le bas de l'écran dans l'espace clip, alors qu'OpenGL utilise un axe Y pointant vers le haut. Deuxièmement, la matrice de projection standard d'OpenGL suppose des valeurs de plan proche et lointain de -1 et 1, alors que Vulkan préfère 0 et 1.
Afin d'aider les applications à migrer à partir du code OpenGL sans avoir à inverser les coordonnées Y dans les données de vertex, et pour permettre l'utilisation de fonctions QMatrix4x4 comme QMatrix4x4::perspective() tout en gardant les valeurs minDepth et maxDepth de Vulkan fixées à 0 et 1, QVulkanWindow fournit une matrice de correction qui peut être récupérée en appelant clipCorrectionMatrix().
Multi-échantillonnage
Bien que désactivé par défaut, l'anticrénelage multi-échantillon est entièrement pris en charge par QVulkanWindow. Les tampons de couleur supplémentaires et la résolution dans les tampons non multi-échantillonnés de la chaîne d'échange sont tous gérés automatiquement.
Pour connaître le nombre d'échantillons pris en charge, appelez supportedSampleCounts(). Lorsque l'ensemble retourné contient 4, 8, ..., passer l'une de ces valeurs à setSampleCount() demande un rendu multi-échantillon.
Remarque : contrairement à QSurfaceFormat::setSamples(), la liste des nombres d'échantillons pris en charge est communiquée à l'avance aux applications et il n'y a pas de retour automatique à des nombres d'échantillons inférieurs dans setSampleCount(). Si la valeur demandée n'est pas prise en charge, un avertissement est affiché et aucun multi-échantillonnage n'est utilisé.
Relecture des images
Lorsque supportsGrab() renvoie vrai, QVulkanWindow peut effectuer des relectures à partir du tampon de couleurs dans un fichier QImage. grab() est une opération lente et inefficace, il convient donc d'éviter de l'utiliser fréquemment. Elle est néanmoins utile car elle permet aux applications de prendre des captures d'écran, ou aux outils et aux tests de traiter et de vérifier la sortie du rendu GPU.
Prise en charge de sRGB
Alors que de nombreuses applications se contenteront du comportement par défaut de QVulkanWindow en ce qui concerne les formats d'image de la chaîne d'échange, setPreferredColorFormats() permet de demander un format prédéfini. Ceci est particulièrement utile lorsque l'on travaille dans l'espace colorimétrique sRGB. Passer un format comme VK_FORMAT_B8G8R8A8_SRGB permet de choisir un format sRGB, lorsqu'il est disponible.
Couches de validation
Lors du développement d'une application, il peut être extrêmement utile d'activer les couches de validation Vulkan. Comme le montre l'exemple de code ci-dessus, appeler QVulkanInstance::setLayers() sur QVulkanInstance avant QVulkanInstance::create() permet la validation, en supposant que la pile de pilotes Vulkan du système contienne les couches nécessaires.
Remarque : il convient de tenir compte des différences entre les plateformes. Sur les plateformes de bureau, l'installation du SDK Vulkan est généralement suffisante. Cependant, Android, par exemple, nécessite le déploiement de bibliothèques partagées supplémentaires avec l'application, et impose également une liste différente de noms de couches de validation. Pour plus d'informations, consultez les pages consacrées au développement d'Android Vulkan.
Remarque : QVulkanWindow n'expose pas les couches de périphériques car cette fonctionnalité est obsolète depuis la version 1.0.13 de l'API Vulkan.
Couches, caractéristiques des périphériques et extensions
Pour activer les couches d'instance, appelez QVulkanInstance::setLayers() avant de créer la fenêtre QVulkanInstance. Pour demander quelles couches d'instance sont disponibles, appelez QVulkanInstance::supportedLayers().
Pour activer les extensions de périphérique, appelez setDeviceExtensions() au début de la configuration de la QVulkanWindow. Pour connaître les extensions de périphériques disponibles, appelez supportedDeviceExtensions().
La spécification d'une couche ou d'une extension non prise en charge est traitée avec élégance : la création d'une instance ou d'un périphérique n'échouera pas, mais la demande de couche ou d'extension sera plutôt ignorée.
En ce qui concerne les caractéristiques des périphériques, QVulkanWindow active toutes les caractéristiques Vulkan 1.0 qui sont signalées comme prises en charge par vkGetPhysicalDeviceFeatures(). À titre d'exception à cette règle, robustBufferAccess n'est jamais activé. Utilisez le mécanisme de rappel décrit ci-dessous si vous souhaitez activer cette fonctionnalité.
Cela n'est pas toujours souhaitable et peut être insuffisant avec Vulkan 1.1 et les versions ultérieures. Par conséquent, un contrôle total sur les VkPhysicalDeviceFeatures utilisées pour la création de périphériques est également possible en enregistrant une fonction de rappel avec setEnabledFeaturesModifier(). Lorsqu'elle est activée, la fonction de rappel est invoquée, ce qui lui permet de modifier les VkPhysicalDeviceFeatures ou les VkPhysicalDeviceFeatures2.
Voir également QVulkanInstance et QWindow.
Documentation sur les types de membres
[since 6.7] QVulkanWindow::EnabledFeatures2Modifier
Une fonction qui est appelée pendant l'initialisation graphique pour modifier le VkPhysicalDeviceFeatures2 qui est modifié dans le VkDeviceCreateInfo.
Par défaut, QVulkanWindow active toutes les fonctionnalités de base de Vulkan 1.0 que le périphérique physique signale comme étant prises en charge, à quelques exceptions près. En pratique, robustBufferAccess est toujours désactivé afin d'éviter des baisses de performance inattendues.
Cependant, cela n'est pas toujours suffisant lorsque l'on travaille avec des fonctionnalités et des extensions Vulkan 1.1, 1.2 ou 1.3. D'où ce mécanisme de rappel. Si seul Vulkan 1.0 est pertinent au moment de l'exécution, utilisez plutôt setEnabledFeaturesModifier().
La référence VkPhysicalDeviceFeatures2 est transmise à la fonction de rappel avec sType, mais le reste est mis à zéro. Il appartient à la fonction de passer les membres à true, ou de configurer les chaînes pNext comme elle l'entend.
Remarque : lors de la mise en place de chaînes pNext, assurez-vous que les objets référencés ont une durée de vie suffisamment longue, par exemple en les stockant en tant que variables membres dans la sous-classe QVulkanWindow.
Ce typedef a été introduit dans Qt 6.7.
Voir aussi setEnabledFeaturesModifier().
QVulkanWindow::EnabledFeaturesModifier
Fonction appelée lors de l'initialisation des graphiques pour modifier les VkPhysicalDeviceFeatures transmises lors de la création d'un objet périphérique Vulkan.
Par défaut, QVulkanWindow active toutes les fonctionnalités de base de Vulkan 1.0 que le périphérique physique signale comme étant prises en charge, à quelques exceptions près. En pratique, robustBufferAccess est toujours désactivé afin d'éviter des baisses de performances inattendues.
La référence VkPhysicalDeviceFeatures transmise est entièrement remise à zéro au moment où la fonction est invoquée. Il appartient à la fonction de modifier les membres comme elle l'entend.
Remarque : pour contrôler les caractéristiques Vulkan 1.1, 1.2 ou 1.3, utilisez plutôt EnabledFeatures2Modifier.
Voir aussi setEnabledFeaturesModifier().
enum QVulkanWindow::Flag
flags QVulkanWindow::Flags
Cette énumération décrit les drapeaux qui peuvent être passés à setFlags().
| Constante | Valeur | Description |
|---|---|---|
QVulkanWindow::PersistentResources | 0x01 | Assure qu'aucune ressource graphique n'est libérée lorsque la fenêtre n'est pas exposée. Le comportement par défaut est de tout libérer et de réinitialiser plus tard lorsque la fenêtre redevient visible. |
Le type Flags est un typedef pour QFlags<Flag>. Il stocke une combinaison OU de valeurs de drapeaux.
QVulkanWindow::QueueCreateInfoModifier
Fonction appelée lors de l'initialisation des graphiques pour ajouter des files d'attente supplémentaires qui doivent être créées.
Définie si le moteur de rendu a besoin de files d'attente supplémentaires en plus de la file d'attente graphique par défaut (par exemple, une file d'attente de transfert). Les propriétés de la famille de files d'attente fournies peuvent être utilisées pour sélectionner les index des files d'attente supplémentaires. Le moteur de rendu peut ensuite demander la file d'attente réelle dans initResources().
Remarque : Lors de la demande de files d'attente graphiques supplémentaires, Qt lui-même demande toujours une file d'attente graphique. Vous devrez rechercher l'entrée appropriée dans queueCreateInfo et la manipuler pour obtenir la file d'attente supplémentaire.
Voir également setQueueCreateInfoModifier().
Documentation des fonctions membres
[explicit] QVulkanWindow::QVulkanWindow(QWindow *parent = nullptr)
Construit une nouvelle QVulkanWindow avec la valeur donnée parent.
Le type de surface est fixé à QSurface::VulkanSurface.
[virtual noexcept] QVulkanWindow::~QVulkanWindow()
Destructeur.
QList<VkPhysicalDeviceProperties> QVulkanWindow::availablePhysicalDevices()
Renvoie la liste des propriétés des dispositifs physiques pris en charge dans le système.
Remarque : cette fonction peut être appelée avant de rendre la fenêtre visible.
QMatrix4x4 QVulkanWindow::clipCorrectionMatrix()
Renvoie un QMatrix4x4 qui peut être utilisé pour corriger les différences de système de coordonnées entre OpenGL et Vulkan.
En prémultipliant la matrice de projection avec cette matrice, les applications peuvent continuer à supposer que Y pointe vers le haut, et peuvent définir minDepth et maxDepth dans le viewport à 0 et 1, respectivement, sans avoir à effectuer d'autres corrections sur les positions Z des sommets. La géométrie des applications OpenGL peut alors être utilisée telle quelle, en supposant que l'état de la rastérisation corresponde aux paramètres d'abattage et de face avant d'OpenGL.
VkFormat QVulkanWindow::colorFormat() const
Renvoie le format du tampon de couleur utilisé par la chaîne d'échange.
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initResources() et jusqu'à QVulkanWindowRenderer::releaseResources().
Voir aussi setPreferredColorFormats().
int QVulkanWindow::concurrentFrameCount() const
Renvoie le nombre de trames qui peuvent être potentiellement actives en même temps.
Remarque : la valeur est constante pendant toute la durée de vie du site QVulkanWindow.
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] = ... // ... }
Voir également currentFrame().
[virtual] QVulkanWindowRenderer *QVulkanWindow::createRenderer()
Renvoie une nouvelle instance de QVulkanWindowRenderer.
Cette fonction virtuelle est appelée une fois pendant la durée de vie de la fenêtre, à un moment donné après l'avoir rendue visible pour la première fois.
L'implémentation par défaut renvoie null et aucun rendu n'est donc effectué, à l'exception de l'effacement des tampons.
La fenêtre devient propriétaire de l'objet de rendu renvoyé.
VkCommandBuffer QVulkanWindow::currentCommandBuffer() const
Renvoie le tampon de commande actif pour le cadre de la chaîne d'échange en cours. Les implémentations de QVulkanWindowRenderer::startNextFrame() sont censées ajouter des commandes à ce tampon de commandes.
Remarque : cette fonction ne doit être appelée qu'à partir de startNextFrame() et, en cas de génération de commandes asynchrones, jusqu'à l'appel à frameReady().
int QVulkanWindow::currentFrame() const
Renvoie l'indice de la trame courante dans l'intervalle [0, concurrentFrameCount() - 1].
Les implémentations du moteur de rendu devront s'assurer que les données uniformes et les autres ressources dynamiques existent en plusieurs copies, afin d'éviter que la trame N ne modifie les données utilisées par les trames N - 1, N - 2, ... encore actives. N - concurrentFrameCount() + 1.
Pour éviter de dépendre de la taille dynamique des tableaux, les applications peuvent utiliser MAX_CONCURRENT_FRAME_COUNT lors de la déclaration des tableaux. Il est garanti que cette valeur sera toujours égale ou supérieure à la valeur renvoyée par concurrentFrameCount(). Ces tableaux peuvent alors être indexés par la valeur renvoyée par cette fonction.
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()]); // ... }
Remarque : cette fonction ne doit être appelée qu'à partir de startNextFrame() et, en cas de génération de commandes asynchrones, jusqu'à l'appel à frameReady().
Voir également concurrentFrameCount().
VkFramebuffer QVulkanWindow::currentFramebuffer() const
Renvoie un VkFramebuffer pour l'image swapchain courante en utilisant la passe de rendu par défaut.
Le framebuffer a deux attachements (couleur, profondeur-crayon) lorsque le multi-échantillonnage n'est pas utilisé, et trois (couleur résolue, profondeur-crayon, couleur multi-échantillon) lorsque sampleCountFlagBits() est supérieur à VK_SAMPLE_COUNT_1_BIT. Les moteurs de rendu doivent en tenir compte, par exemple lorsqu'ils fournissent des valeurs claires.
Remarque : les applications ne sont pas tenues d'utiliser ce framebuffer si elles fournissent leur propre passe de rendu au lieu d'utiliser celle renvoyée par defaultRenderPass().
Remarque : cette fonction ne doit être appelée qu'à partir de startNextFrame() et, en cas de génération de commandes asynchrones, jusqu'à l'appel à frameReady().
Voir aussi defaultRenderPass().
int QVulkanWindow::currentSwapChainImageIndex() const
Renvoie l'indice de l'image de la chaîne d'échange actuelle dans l'intervalle [0, swapChainImageCount() - 1].
Remarque : cette fonction ne doit être appelée qu'à partir de startNextFrame() et, en cas de génération de commandes asynchrones, jusqu'à l'appel à frameReady().
VkRenderPass QVulkanWindow::defaultRenderPass() const
Renvoie une passe de rendu typique avec une passe secondaire.
Remarque : les applications ne sont pas tenues d'utiliser cette passe de rendu. Cependant, elles doivent s'assurer que la chaîne d'échange actuelle et les images de profondeur sont transférées de VK_IMAGE_LAYOUT_UNDEFINED à VK_IMAGE_LAYOUT_PRESENT_SRC_KHR et VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, soit via la passe de rendu personnalisée de l'application, soit par d'autres moyens.
Remarque : la lecture/écriture du pochoir n'est pas activée dans cette passe de rendu.
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initResources() jusqu'à QVulkanWindowRenderer::releaseResources().
Voir également currentFramebuffer().
VkFormat QVulkanWindow::depthStencilFormat() const
Renvoie le format utilisé par le(s) tampon(s) de profondeur.
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initResources() jusqu'à QVulkanWindowRenderer::releaseResources().
VkImage QVulkanWindow::depthStencilImage() const
Renvoie l'image du crayon de profondeur.
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initSwapChainResources() jusqu'à QVulkanWindowRenderer::releaseSwapChainResources().
VkImageView QVulkanWindow::depthStencilImageView() const
Renvoie la vue de l'image du crayon de profondeur.
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initSwapChainResources() jusqu'à QVulkanWindowRenderer::releaseSwapChainResources().
VkDevice QVulkanWindow::device() const
Renvoie l'appareil logique actif.
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initResources() jusqu'à QVulkanWindowRenderer::releaseResources().
uint32_t QVulkanWindow::deviceLocalMemoryIndex() const
Renvoie un index de type de mémoire locale de périphérique adapté à une utilisation générale.
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initResources() jusqu'à QVulkanWindowRenderer::releaseResources().
Remarque : il n'est pas garanti que ce type de mémoire soit toujours approprié. La solution correcte, entre implémentations - en particulier pour les images locales de périphériques - consiste à choisir manuellement un type de mémoire après avoir vérifié le masque renvoyé par vkGetImageMemoryRequirements.
QVulkanWindow::Flags QVulkanWindow::flags() const
Renvoie les drapeaux demandés.
Voir aussi setFlags().
[signal] void QVulkanWindow::frameGrabbed(const QImage &image)
Ce signal est émis lorsque le site image est prêt.
void QVulkanWindow::frameReady()
Cette fonction doit être appelée exactement une fois en réponse à chaque invocation de l'implémentation QVulkanWindowRenderer::startNextFrame(). Au moment de cet appel, le tampon de commande principal, exposé via currentCommandBuffer(), doit contenir toutes les commandes de rendu nécessaires, car cette fonction déclenchera la soumission des commandes et la mise en file d'attente de la commande actuelle.
Remarque : cette fonction ne doit être appelée qu'à partir du fil d'exécution gui/main, qui est l'endroit où les fonctions de QVulkanWindowRenderer sont invoquées et où vit l'instance QVulkanWindow.
Voir également QVulkanWindowRenderer::startNextFrame().
QImage QVulkanWindow::grab()
Construit et rend l'image suivante sans la présenter, puis effectue une lecture bloquante du contenu de l'image.
Renvoie l'image si l'implémentation de startNextFrame() du moteur de rendu rappelle directement frameReady(). Sinon, elle renvoie une image incomplète, qui a la bonne taille mais pas encore le contenu. Dans ce dernier cas, le contenu sera transmis via le signal frameGrabbed().
L'image QImage renvoyée a toujours le format QImage::Format_RGBA8888. Si colorFormat() est VK_FORMAT_B8G8R8A8_UNORM, les canaux rouge et bleu sont automatiquement échangés, car ce format est couramment utilisé comme choix par défaut pour les tampons de couleur de la chaîne d'échange. Avec tout autre format de tampon de couleur, aucune conversion n'est effectuée par cette fonction.
Remarque : cette fonction ne doit pas être appelée lorsqu'une image est en cours (c'est-à-dire que frameReady() n'a pas encore été rappelé par l'application).
Remarque : cette fonction est potentiellement coûteuse en raison de la relecture supplémentaire et bloquante.
Note : Cette fonction nécessite actuellement que la chaîne de swap supporte l'utilisation en tant que source de transfert (VK_IMAGE_USAGE_TRANSFER_SRC_BIT), et échouera dans le cas contraire.
VkCommandPool QVulkanWindow::graphicsCommandPool() const
Renvoie le pool de commandes graphiques actif.
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initResources() jusqu'à QVulkanWindowRenderer::releaseResources().
VkQueue QVulkanWindow::graphicsQueue() const
Renvoie la file d'attente graphique active.
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initResources() jusqu'à QVulkanWindowRenderer::releaseResources().
uint32_t QVulkanWindow::graphicsQueueFamilyIndex() const
Renvoie l'indice de famille de la file d'attente graphique active.
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initResources() jusqu'à QVulkanWindowRenderer::releaseResources(). Les implémentations de QVulkanWindowRenderer::updateQueueCreateInfo() peuvent également appeler cette fonction.
uint32_t QVulkanWindow::hostVisibleMemoryIndex() const
Renvoie un index de type de mémoire visible par l'hôte, adapté à une utilisation générale.
Le type de mémoire renvoyé sera à la fois visible par l'hôte et cohérent. En outre, il sera également mis en cache, si possible.
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initResources() jusqu'à QVulkanWindowRenderer::releaseResources().
bool QVulkanWindow::isValid() const
Retourne true si cette fenêtre a initialisé avec succès toutes les ressources Vulkan, y compris la swapchain.
Remarque : l'initialisation a lieu lors du premier événement expose après que la fenêtre a été rendue visible.
VkImage QVulkanWindow::msaaColorImage(int idx) const
Renvoie l'image couleur multi-échantillonnée spécifiée, ou VK_NULL_HANDLE si le multi-échantillonnage n'est pas utilisé.
idx doit être comprise entre [0, swapChainImageCount() - 1].
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initSwapChainResources() jusqu'à QVulkanWindowRenderer::releaseSwapChainResources().
VkImageView QVulkanWindow::msaaColorImageView(int idx) const
Renvoie la vue de l'image couleur multi-échantillonnée spécifiée, ou VK_NULL_HANDLE si le multi-échantillonnage n'est pas utilisé.
idx doit être compris entre [0, swapChainImageCount() - 1].
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initSwapChainResources() jusqu'à QVulkanWindowRenderer::releaseSwapChainResources().
VkPhysicalDevice QVulkanWindow::physicalDevice() const
Renvoie l'appareil physique actif.
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::preInitResources() jusqu'à QVulkanWindowRenderer::releaseResources().
const VkPhysicalDeviceProperties *QVulkanWindow::physicalDeviceProperties() const
Renvoie un pointeur sur les propriétés du dispositif physique actif.
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::preInitResources() jusqu'à QVulkanWindowRenderer::releaseResources().
VkSampleCountFlagBits QVulkanWindow::sampleCountFlagBits() const
Renvoie le nombre actuel d'échantillons sous la forme d'une valeur VkSampleCountFlagBits.
Lors du ciblage de la cible de rendu par défaut, le champ rasterizationSamples de VkPipelineMultisampleStateCreateInfo doit être défini à cette valeur.
Voir aussi setSampleCount() et supportedSampleCounts().
void QVulkanWindow::setDeviceExtensions(const QByteArrayList &extensions)
Définit la liste des appareils extensions à activer.
Les extensions non prises en charge sont ignorées.
L'extension swapchain sera toujours ajoutée automatiquement, il n'est pas nécessaire de l'inclure dans cette liste.
Remarque : cette fonction doit être appelée avant que la fenêtre ne soit rendue visible ou au plus tard dans QVulkanWindowRenderer::preInitResources(), et n'a aucun effet si elle est appelée après.
[since 6.7] void QVulkanWindow::setEnabledFeaturesModifier(const QVulkanWindow::EnabledFeaturesModifier &modifier)
Définit la fonction de modification des fonctionnalités activées du périphérique modifier.
Remarque : pour contrôler les fonctionnalités Vulkan 1.1, 1.2 ou 1.3, utilisez plutôt la surcharge prenant un EnabledFeatures2Modifier.
Remarque : modifier est transmis à la fonction de rappel avec tous les membres réglés sur false. Il appartient à la fonction de modifier les membres comme elle l'entend.
Cette fonction a été introduite dans Qt 6.7.
Voir aussi EnabledFeaturesModifier.
[since 6.7] void QVulkanWindow::setEnabledFeaturesModifier(QVulkanWindow::EnabledFeatures2Modifier modifier)
Définit la fonction de modification des caractéristiques de l'appareil activée modifier.
Il s'agit d'une fonction surchargée.
Cette fonction a été introduite dans Qt 6.7.
Voir aussi EnabledFeatures2Modifier.
void QVulkanWindow::setFlags(QVulkanWindow::Flags flags)
Configure le comportement en fonction de l'adresse flags.
Remarque : cette fonction doit être appelée avant que la fenêtre ne soit rendue visible ou au plus tard dans QVulkanWindowRenderer::preInitResources(), et n'a aucun effet si elle est appelée après.
Voir également flags().
void QVulkanWindow::setPhysicalDeviceIndex(int idx)
Demande l'utilisation de l'appareil physique avec l'index idx. L'index correspond à la liste renvoyée par availablePhysicalDevices().
Par défaut, le premier dispositif physique est utilisé.
Remarque : cette fonction doit être appelée avant que la fenêtre ne soit rendue visible ou au plus tard dans QVulkanWindowRenderer::preInitResources(), et n'a aucun effet si elle est appelée après.
void QVulkanWindow::setPreferredColorFormats(const QList<VkFormat> &formats)
Définit le format préféré formats de la chaîne d'échange.
Par défaut, aucun format préféré par l'application n'est défini. Dans ce cas, le format préféré de la surface sera utilisé ou, à défaut, VK_FORMAT_B8G8R8A8_UNORM.
La liste de formats est ordonnée. Si le premier format n'est pas pris en charge, le deuxième sera pris en considération, et ainsi de suite. Si aucun format de la liste n'est pris en charge, le comportement est le même que dans le cas par défaut.
Pour demander le format actuel après l'initialisation, appelez colorFormat().
Remarque : cette fonction doit être appelée avant que la fenêtre ne soit rendue visible ou au plus tard dans QVulkanWindowRenderer::preInitResources(), et n'a aucun effet si elle est appelée après.
Remarque : la réimplémentation de QVulkanWindowRenderer::preInitResources() permet d'examiner dynamiquement la liste des formats pris en charge, si on le souhaite. La surface est alors récupérable via QVulkanInstace::surfaceForWindow(), tandis que cette fonction peut toujours être appelée en toute sécurité pour affecter les étapes ultérieures de l'initialisation.
Voir aussi colorFormat().
void QVulkanWindow::setQueueCreateInfoModifier(const QVulkanWindow::QueueCreateInfoModifier &modifier)
Définit la fonction de modification des informations de création de la file d'attente modifier.
Voir aussi QueueCreateInfoModifier.
void QVulkanWindow::setSampleCount(int sampleCount)
Demande un anticrénelage multi-échantillon avec la valeur donnée sampleCount. Les valeurs valides sont 1, 2, 4, 8, ... jusqu'à la valeur maximale supportée par le périphérique physique.
Lorsque le nombre d'échantillons est supérieur à 1, QVulkanWindow crée un tampon de couleurs multi-échantillons au lieu de cibler simplement les images de la chaîne d'échange. Le rendu dans le tampon multi-échantillon sera résolu dans les tampons non multi-échantillons à la fin de chaque image.
Pour examiner la liste des nombres d'échantillons pris en charge, appelez supportedSampleCounts().
Lors de la configuration du pipeline de rendu, appelez sampleCountFlagBits() pour demander le nombre d'échantillons actif sous la forme d'une valeur VkSampleCountFlagBits.
Remarque : cette fonction doit être appelée avant que la fenêtre ne soit rendue visible ou au plus tard dans QVulkanWindowRenderer::preInitResources(), et n'a aucun effet si elle est appelée après.
Voir également supportedSampleCounts() et sampleCountFlagBits().
QVulkanInfoVector<QVulkanExtension> QVulkanWindow::supportedDeviceExtensions()
Renvoie la liste des extensions prises en charge par les périphériques logiques créés à partir du périphérique physique sélectionné par setPhysicalDeviceIndex().
Remarque : cette fonction peut être appelée avant de rendre la fenêtre visible.
QList<int> QVulkanWindow::supportedSampleCounts()
Renvoie l'ensemble des nombres d'échantillons pris en charge lors de l'utilisation du périphérique physique sélectionné par setPhysicalDeviceIndex(), sous la forme d'une liste triée.
Par défaut, QVulkanWindow utilise un nombre d'échantillons de 1. En appelant setSampleCount() avec une valeur différente (2, 4, 8, ...) de celle renvoyée par cette fonction, il est possible de demander un anticrénelage multi-échantillons.
Remarque : cette fonction peut être appelée avant de rendre la fenêtre visible.
Voir aussi setSampleCount().
bool QVulkanWindow::supportsGrab() const
Retourne vrai si la chaîne de swap supporte l'utilisation comme source de transfert, ce qui signifie que grab() est fonctionnel.
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initSwapChainResources() et jusqu'à QVulkanWindowRenderer::releaseSwapChainResources().
VkImage QVulkanWindow::swapChainImage(int idx) const
Renvoie l'image de la chaîne d'échange spécifiée.
idx doit être comprise entre [0, swapChainImageCount() - 1].
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initSwapChainResources() et jusqu'à QVulkanWindowRenderer::releaseSwapChainResources().
int QVulkanWindow::swapChainImageCount() const
Renvoie le nombre d'images dans la chaîne d'échange.
Remarque : il est nécessaire d'accéder à ce paramètre lorsque l'on fournit une passe de rendu et un framebuffer personnalisés. Le framebuffer est spécifique à l'image courante de la chaîne d'échange et l'application doit donc fournir plusieurs framebuffers.
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initSwapChainResources() jusqu'à QVulkanWindowRenderer::releaseSwapChainResources().
QSize QVulkanWindow::swapChainImageSize() const
Renvoie la taille de l'image de la chaîne d'échange.
Celle-ci correspond généralement à la taille de la fenêtre, mais peut également être différente si vkGetPhysicalDeviceSurfaceCapabilitiesKHR indique une taille fixe.
sizeDe plus, il a été observé sur certaines plateformes que la taille de la surface rapportée par Vulkan est différente avec une mise à l'échelle DPI élevée active, ce qui signifie que la valeur rapportée par QWindow() multipliée par devicePixelRatio() était inférieure ou supérieure de 1 pixel par rapport à la valeur retournée ici, probablement en raison de différences d'arrondi. Le code de rendu doit en être conscient et toute logique de rendu doit être basée sur la valeur renvoyée ici, jamais sur la taille rapportée par QWindow. Quelle que soit la taille de pixel correcte en théorie, le rendu Vulkan ne doit jamais se baser sur la taille de surface rapportée par l'API Vulkan. Dans le cas contraire, des erreurs de validation peuvent se produire, par exemple lors de la définition de la fenêtre de visualisation, car les valeurs fournies par l'application peuvent devenir hors limites du point de vue de Vulkan.
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initSwapChainResources() jusqu'à QVulkanWindowRenderer::releaseSwapChainResources().
VkImageView QVulkanWindow::swapChainImageView(int idx) const
Renvoie la vue de l'image de la chaîne d'échange spécifiée.
idx doit être compris entre [0, swapChainImageCount() - 1].
Remarque : l'appel à cette fonction n'est valable qu'à partir de l'invocation de QVulkanWindowRenderer::initSwapChainResources() et jusqu'à QVulkanWindowRenderer::releaseSwapChainResources().
Documentation des variables membres
const int QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT
Cette variable contient une valeur constante qui est toujours égale ou supérieure à la valeur maximale de concurrentFrameCount().
© 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.