QRhiSwapChain Class
Ressource de la chaîne d'échange. Plus d'informations...
| En-tête : | #include <rhi/qrhi.h> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS GuiPrivate)target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate) |
| qmake : | QT += gui-private |
| Depuis : | Qt 6.6 |
| Hérite : | QRhiResource |
Types publics
| enum | Flag { SurfaceHasPreMulAlpha, SurfaceHasNonPreMulAlpha, sRGB, UsedAsTransferSource, NoVSync, MinimalBufferCount } |
| flags | Flags |
| enum | Format { SDR, HDRExtendedSrgbLinear, HDR10, HDRExtendedDisplayP3Linear } |
| enum | StereoTargetBuffer { LeftBuffer, RightBuffer } |
Fonctions publiques
| virtual bool | createOrResize() = 0 |
| virtual QRhiCommandBuffer * | currentFrameCommandBuffer() = 0 |
| virtual QRhiRenderTarget * | currentFrameRenderTarget() = 0 |
| virtual QRhiRenderTarget * | currentFrameRenderTarget(QRhiSwapChain::StereoTargetBuffer targetBuffer) |
| QSize | currentPixelSize() const |
| QRhiRenderBuffer * | depthStencil() const |
| QRhiSwapChain::Flags | flags() const |
| QRhiSwapChain::Format | format() const |
| virtual QRhiSwapChainHdrInfo | hdrInfo() |
| virtual bool | isFormatSupported(QRhiSwapChain::Format f) = 0 |
| virtual QRhiRenderPassDescriptor * | newCompatibleRenderPassDescriptor() = 0 |
| QRhiSwapChainProxyData | proxyData() const |
| QRhiRenderPassDescriptor * | renderPassDescriptor() const |
| int | sampleCount() const |
| void | setDepthStencil(QRhiRenderBuffer *ds) |
| void | setFlags(QRhiSwapChain::Flags f) |
| void | setFormat(QRhiSwapChain::Format f) |
| void | setProxyData(const QRhiSwapChainProxyData &d) |
| void | setRenderPassDescriptor(QRhiRenderPassDescriptor *desc) |
| void | setSampleCount(int samples) |
(since 6.9) void | setShadingRateMap(QRhiShadingRateMap *map) |
| void | setWindow(QWindow *window) |
(since 6.9) QRhiShadingRateMap * | shadingRateMap() const |
| virtual QSize | surfacePixelSize() = 0 |
| QWindow * | window() const |
Fonctions publiques réimplémentées
| virtual QRhiResource::Type | resourceType() const override |
Description détaillée
Une chaîne d'échange permet de présenter les résultats du rendu à une surface. Une chaîne d'échange est généralement soutenue par un ensemble de tampons de couleur. Un seul de ces tampons est affiché à la fois.
Vous trouverez ci-dessous un modèle typique de création et de gestion d'une chaîne d'échange et de certaines ressources associées afin d'effectuer un rendu sur une surface QWindow:
void init() { sc = rhi->newSwapChain(); ds = rhi->newRenderBuffer(QRhiRenderBuffer::DepthStencil, QSize(), // no need to set the size here due to UsedWithSwapChainOnly 1, QRhiRenderBuffer::UsedWithSwapChainOnly); sc->setWindow(window); sc->setDepthStencil(ds); rp = sc->newCompatibleRenderPassDescriptor(); sc->setRenderPassDescriptor(rp); resizeSwapChain(); } void resizeSwapChain() { hasSwapChain = sc->createOrResize(); } void render() { if (!hasSwapChain || notExposed) return; if (sc->currentPixelSize() != sc->surfacePixelSize() || newlyExposed) { resizeSwapChain(); if (!hasSwapChain) return; newlyExposed = false; } rhi->beginFrame(sc); // ... rhi->endFrame(sc); }
Évitez de vous fier aux événements de redimensionnement de QWindow pour redimensionner les chaînes d'échange, surtout si l'on considère que les tailles de surface ne correspondent pas toujours aux dimensions signalées sur QWindow. L'approche sûre et multiplateforme consiste à effectuer la vérification via surfacePixelSize() à chaque fois que l'on démarre une nouvelle image.
La libération de la chaîne d'échange doit se faire pendant que QWindow et la fenêtre native sous-jacente sont entièrement opérationnelles. En s'appuyant sur l'exemple précédent :
void releaseSwapChain() { if (hasSwapChain) { sc->destroy(); hasSwapChain = false; } } // assuming Window is our QWindow subclass bool Window::event(QEvent *e) { switch (e->type()) { case QEvent::UpdateRequest: // for QWindow::requestUpdate() render(); break; case QEvent::PlatformSurface: if (static_cast<QPlatformSurfaceEvent *>(e)->surfaceEventType() == QPlatformSurfaceEvent::SurfaceAboutToBeDestroyed) releaseSwapChain(); break; default: break; } return QWindow::event(e); }
L'initialisation de la chaîne d'échange et le début du rendu de la première image ne peuvent pas commencer à n'importe quel moment. L'approche sûre et multiplateforme consiste à s'appuyer sur les événements expose. QExposeEvent est un événement vaguement spécifié qui est envoyé chaque fois qu'une fenêtre est mappée, obscurcie et redimensionnée, en fonction de la plateforme.
void Window::exposeEvent(QExposeEvent *) { // initialize and start rendering when the window becomes usable for graphics purposes if (isExposed() && !running) { running = true; init(); } // stop pushing frames when not exposed or size becomes 0 if ((!isExposed() || (hasSwapChain && sc->surfacePixelSize().isEmpty())) && running) notExposed = true; // continue when exposed again and the surface has a valid size if (isExposed() && running && notExposed && !sc->surfacePixelSize().isEmpty()) { notExposed = false; newlyExposed = true; } if (isExposed() && !sc->surfacePixelSize().isEmpty()) render(); }
Une fois que le rendu a commencé, un moyen simple de demander une nouvelle image est QWindow::requestUpdate(). Alors que sur certaines plateformes il s'agit simplement d'un petit timer, sur d'autres il a une implémentation spécifique : par exemple sur macOS ou iOS il peut être soutenu par CVDisplayLink. L'exemple ci-dessus est déjà préparé aux demandes de mise à jour en gérant QEvent::UpdateRequest.
Tout en agissant en tant que QRhiRenderTarget, QRhiSwapChain gère également un QRhiCommandBuffer. L'appel à QRhi::endFrame() soumet les commandes enregistrées et met également en file d'attente une demande present. Le comportement par défaut est de le faire avec un intervalle d'échange de 1, ce qui signifie que la synchronisation avec le rafraîchissement vertical de l'écran est activée. Ainsi, le thread de rendu appelant beginFrame() et endFrame() sera accéléré à vsync. Sur certains backends, cela peut être désactivé en passant QRhiSwapChain :NoVSync dans flags().
Le multi-échantillonnage (MSAA) est géré de manière transparente pour les applications lorsqu'il est demandé via setSampleCount(). Le cas échéant, QRhiSwapChain se chargera de créer des tampons de couleur supplémentaires et d'émettre une commande de résolution de multi-échantillonnage à la fin d'une image. Pour OpenGL, il est nécessaire de demander le nombre d'échantillons approprié via QSurfaceFormat, en appelant QSurfaceFormat::setDefaultFormat() avant d'initialiser QRhi.
Note : Il s'agit d'une API RHI avec des garanties de compatibilité limitées, voir QRhi pour plus de détails.
Type de membre Documentation
enum QRhiSwapChain::Flag
flags QRhiSwapChain::Flags
Valeurs des drapeaux décrivant les propriétés de la chaîne d'échange
| Constante | Valeur | Description des propriétés de la chaîne d'échange |
|---|---|---|
QRhiSwapChain::SurfaceHasPreMulAlpha | 1 << 0 | Indique que la surface cible est transparente avec un alpha prémultiplié. Par exemple, c'est ce que Qt Quick utilise lorsque le canal alpha est activé sur la cible QWindow, parce que le moteur de rendu de la représentation scénique produit toujours des fragments avec l'alpha multiplié dans les valeurs rouge, verte et bleue. Pour garantir un comportement identique sur toutes les plates-formes, il faut toujours donner à QSurfaceFormat::alphaBufferSize() une valeur non nulle sur la cible QWindow lorsque ce drapeau est activé sur la chaîne d'échange. |
QRhiSwapChain::SurfaceHasNonPreMulAlpha | 1 << 1 | Indique que la surface cible est transparente et que l'alpha n'est pas multiplié. Sachez que cela peut ne pas être supporté sur certains systèmes, si le compositeur du système attend toujours un contenu avec un alpha prémultiplié. Dans ce cas, le comportement avec ce drapeau activé devrait être équivalent à SurfaceHasPreMulAlpha. |
QRhiSwapChain::sRGB | 1 << 2 | Demande de choisir un format sRGB pour les tampons de couleur de la chaîne d'échange et/ou les vues de la cible de rendu, le cas échéant. Notez que cela implique que la mise à jour du framebuffer sRGB et le blending seront activés pour tout le contenu ciblant cette chaîne d'échange, et qu'il n'est pas possible d'y renoncer. Pour OpenGL, définir sRGBColorSpace sur QSurfaceFormat de QWindow en plus. Applicable uniquement lorsque le format de la chaîne de remplacement est défini sur QRhiSwapChain::SDR. |
QRhiSwapChain::UsedAsTransferSource | 1 << 3 | Indique que la chaîne d'échange sera utilisée comme source d'un retour de lecture dans QRhiResourceUpdateBatch::readBackTexture(). |
QRhiSwapChain::NoVSync | 1 << 4 | Demande la désactivation de l'attente de la synchronisation verticale, évitant ainsi d'étrangler le thread de rendu. Le comportement est spécifique au backend et ne s'applique que lorsqu'il est possible de le contrôler. Certains peuvent ignorer la demande. Pour OpenGL, essayez plutôt de mettre l'intervalle d'échange à 0 sur QWindow via QSurfaceFormat::setSwapInterval(). |
QRhiSwapChain::MinimalBufferCount | 1 << 5 | Demande de créer la chaîne d'échange avec le nombre minimum de tampons, qui est en pratique de 2, à moins que l'implémentation graphique ait un nombre minimum plus élevé. Uniquement applicable avec les backends où un tel contrôle est disponible via l'API graphique, par exemple, Vulkan. Par défaut, c'est au backend de décider du nombre de tampons qu'il demande (en pratique, c'est presque toujours 2 ou 3), et cela ne concerne pas les applications. Cependant, sur Vulkan par exemple, le backend préférera probablement le nombre le plus élevé (3), par exemple pour éviter des problèmes de performance étranges avec certaines implémentations de Vulkan sur les appareils mobiles. Il se peut que sur certaines plateformes, il soit bénéfique de forcer le nombre de tampons le plus bas (2), donc ce drapeau permet de le forcer. Notez que tout cela n'a aucun effet sur le nombre d'images conservées en vol, de sorte que le CPU (QRhi) préparera toujours les images au plus N - 1 images avant le GPU, même lorsque le nombre de tampons d'images de la swapchain est supérieur à N(N = QRhi::FramesInFlight et typiquement 2). |
Le type Flags est un typedef pour QFlags<Flag>. Il stocke une combinaison OU de valeurs de drapeaux.
enum QRhiSwapChain::Format
Décrit le format de la chaîne d'échange. Le format par défaut est SDR.
Cette énumération est utilisée avec isFormatSupported() pour vérifier en amont si la création de la chaîne d'échange avec le format donné est prise en charge par la plate-forme et l'écran associé à la fenêtre, et avec setFormat() pour définir le format requis dans la chaîne d'échange avant d'appeler createOrResize() pour la première fois.
| Constante | Valeur | Description du format |
|---|---|---|
QRhiSwapChain::SDR | 0 | RGBA ou BGRA 8 bits, en fonction du backend et de la plateforme. Avec OpenGL ES en particulier, il peut arriver que la plateforme fournisse moins de 8 bits (par exemple, en raison d'EGL et de QSurfaceFormat qui choisissent un format 565 ou 444 - ceci est hors du contrôle de QRhi). Gamme dynamique standard. Peut être combiné avec le drapeau QRhiSwapChain::sRGB. |
QRhiSwapChain::HDRExtendedSrgbLinear | 1 | RGBA flottant 16 bits, gamme dynamique élevée, espace colorimétrique sRGB linéaire étendu (scRGB). Cela implique des primaires Rec. 709 (identiques à SDR/sRGB) et des couleurs linéaires. La conversion vers l'espace colorimétrique natif de l'écran (tel que HDR10) est effectuée par le système de fenêtrage. Sous Windows, il s'agit de l'espace colorimétrique canonique du compositeur système et du format recommandé pour les chaînes d'échange HDR en général sur les plates-formes de bureau. |
QRhiSwapChain::HDR10 | 2 | 10-bit unsigned int RGB or BGR with 2 bit alpha, high dynamic range, HDR10 (Rec. 2020) color space with an ST2084 PQ transfer function (espace colorimétrique HDR10 (Rec. 2020) avec une fonction de transfert ST2084 PQ). |
QRhiSwapChain::HDRExtendedDisplayP3Linear | 3 | RGBA flottant 16 bits, plage dynamique élevée, espace colorimétrique Display P3 linéaire étendu. Le premier choix pour le HDR sur des plateformes telles que iOS et VisionOS. |
enum QRhiSwapChain::StereoTargetBuffer
Sélectionne le backbuffer à utiliser avec une chaîne d'échange stéréoscopique.
| Constante | Valeur |
|---|---|
QRhiSwapChain::LeftBuffer | 0 |
QRhiSwapChain::RightBuffer | 1 |
Fonction membre Documentation
[pure virtual] bool QRhiSwapChain::createOrResize()
Crée la chaîne d'échange si ce n'est pas déjà fait et redimensionne les tampons de la chaîne d'échange pour qu'ils correspondent à la taille actuelle de la surface cible. Appeler cette fonction chaque fois que la taille de la surface cible est différente de la précédente.
Note : appelez destroy() seulement quand la chaîne d'échange doit être complètement libérée, typiquement lors de QPlatformSurfaceEvent::SurfaceAboutToBeDestroyed. Pour effectuer un redimensionnement, il suffit d'appeler createOrResize().
Retourne true en cas de succès, false en cas d'échec d'une opération graphique. Quelle que soit la valeur de retour, l'appel à destroy() est toujours sûr.
[pure virtual] QRhiCommandBuffer *QRhiSwapChain::currentFrameCommandBuffer()
Renvoie un tampon de commande sur lequel les commandes de rendu et les mises à jour de ressources peuvent être enregistrées dans un bloc beginFrame - endFrame, en supposant que beginFrame() a été appelé avec cette chaîne d'échange.
Note : L'objet retourné est également valide après endFrame(), jusqu'au prochain beginFrame(), mais le tampon de commande retourné ne doit pas être utilisé pour enregistrer des commandes à ce moment-là. Il peut plutôt être utilisé pour interroger les données collectées pendant la trame (ou les trames précédentes), par exemple en appelant lastCompletedGpuTime().
Remarque : la valeur ne doit pas être mise en cache et réutilisée entre les images. L'appelant ne doit pas conserver l'objet renvoyé une fois que beginFrame() est appelé à nouveau. Au lieu de cela, l'objet du tampon de commande doit être interrogé à nouveau en appelant cette fonction.
[pure virtual] QRhiRenderTarget *QRhiSwapChain::currentFrameRenderTarget()
Renvoie une cible de rendu qui peut être utilisée avec beginPass() afin de rendre le backbuffer actuel de la chaîne d'échange. Valable uniquement dans un bloc QRhi::beginFrame() - QRhi::endFrame() où beginFrame() a été appelé avec cette chaîne d'échange.
Remarque : la valeur ne doit pas être mise en cache et réutilisée entre les images.
[virtual] QRhiRenderTarget *QRhiSwapChain::currentFrameRenderTarget(QRhiSwapChain::StereoTargetBuffer targetBuffer)
Renvoie une cible de rendu qui peut être utilisée avec beginPass() afin d'effectuer le rendu dans le backbuffer gauche ou droit de la chaîne d'échange. Cette surcharge ne doit être utilisée qu'avec un rendu stéréoscopique, c'est-à-dire lorsque le site QWindow associé est soutenu par deux tampons de couleur, un pour chaque oeil, au lieu d'un seul.
Si le rendu stéréoscopique n'est pas pris en charge, la valeur de retour sera la cible par défaut. Il est supporté par tous les backends matériels à l'exception de Metal, en combinaison avec QSurfaceFormat::StereoBuffers, en supposant qu'il soit supporté par la pile de pilotes graphiques et d'affichage au moment de l'exécution. Les backends Metal et Null renverront la cible de rendu par défaut à partir de cette surcharge.
Note : la valeur ne doit pas être mise en cache et réutilisée entre les images.
QSize QRhiSwapChain::currentPixelSize() const
Renvoie la taille avec laquelle la chaîne d'échange a été construite pour la dernière fois avec succès. Utilisez cette fonction pour décider si createOrResize() doit être appelé à nouveau : si currentPixelSize() != surfacePixelSize(), la chaîne d'échange doit être redimensionnée.
Note : La logique de rendu typique appellera cette fonction pour obtenir la taille de sortie lors de la préparation d'une nouvelle image, et basera les calculs dépendants (tels que la fenêtre) sur la taille renvoyée par cette fonction.
Bien que dans de nombreux cas, la valeur soit la même que celle de QWindow::size() * QWindow::devicePixelRatio(), il n'est pas garanti que la taille rapportée par QWindow soit correcte sur toutes les plates-formes et dans toutes les implémentations d'API graphiques. Il est donc fortement recommandé d'utiliser cette fonction chaque fois qu'il est nécessaire d'identifier les dimensions, en pixels, de la couche ou de la surface de sortie.
Cela présente également l'avantage d'éviter les courses aux données potentielles lorsque QRhi est utilisé sur un thread de rendu dédié, car la nécessité d'appeler les fonctions QWindow, qui peuvent alors accéder aux données mises à jour sur le thread principal, est évitée.
Voir également surfacePixelSize().
QRhiRenderBuffer *QRhiSwapChain::depthStencil() const
Renvoie le tampon de rendu actuellement associé au crayon de profondeur.
Voir aussi setDepthStencil().
QRhiSwapChain::Flags QRhiSwapChain::flags() const
Renvoie les drapeaux actuellement définis.
Voir aussi setFlags().
QRhiSwapChain::Format QRhiSwapChain::format() const
Renvoie le format actuellement défini.
Voir aussi setFormat().
[virtual] QRhiSwapChainHdrInfo QRhiSwapChain::hdrInfo()
Renvoie les informations HDR pour l'écran associé.
Ne pensez pas qu'il s'agit d'une opération peu coûteuse. En fonction de la plate-forme, cette fonction effectue diverses requêtes de plate-forme qui peuvent avoir un impact sur les performances.
Note : Peut être appelée avant createOrResize() tant que la fenêtre est set.
Note : Ce qui se passe lors du déplacement d'une fenêtre avec une chaîne d'échange initialisée entre des écrans (HDR vers HDR avec des caractéristiques différentes, HDR vers SDR, etc.) n'est pas actuellement bien défini et dépend fortement du système de fenêtrage et du compositeur, avec un comportement potentiellement variable entre les plates-formes. Actuellement, QRhi garantit uniquement que hdrInfo() renvoie des données valides, si elles sont disponibles, pour l'affichage auquel la fenêtre associée à la chaîne d'échange appartenait au moment de createOrResize().
Voir également QRhiSwapChainHdrInfo.
[pure virtual] bool QRhiSwapChain::isFormatSupported(QRhiSwapChain::Format f)
Renvoie un résultat positif si le format de chaîne d'échange donné f est pris en charge. SDR est toujours pris en charge.
Note : Peut être appelé indépendamment de createOrResize(), mais window() doit déjà être défini. Un appel sans fenêtre définie peut conduire à des résultats inattendus en fonction du backend et de la plateforme (très probablement faux pour tout format HDR), car la prise en charge du format HDR est généralement liée à la sortie (écran) à laquelle la fenêtre associée à la chaîne d'échange appartient à un moment donné. Si le résultat est vrai pour un format HDR, la création de la chaîne d'échange avec ce format devrait réussir tant que la fenêtre n'est pas déplacée vers un autre écran entre-temps.
La principale utilisation de cette fonction est de l'appeler avant le premier createOrResize() après que la fenêtre a déjà été définie. Cela permet aux backends de QRhi d'effectuer des requêtes spécifiques à la plateforme ou au système de fenêtrage pour déterminer si la fenêtre (et l'écran sur lequel elle se trouve) est capable d'une véritable sortie HDR avec le format spécifié.
Lorsque le format est signalé comme étant pris en charge, appelez setFormat() pour définir le format demandé et appelez createOrResize(). Soyez toutefois conscient des conséquences : si vous réussissez à demander un format HDR, vous devrez gérer un espace colorimétrique différent, éventuellement effectuer une correction du niveau de blanc pour le contenu non compatible avec le HDR, ajuster les méthodes de mise en correspondance des tons, ajuster les paramètres de la cible de rendu hors écran, etc.
Voir également setFormat().
[pure virtual] QRhiRenderPassDescriptor *QRhiSwapChain::newCompatibleRenderPassDescriptor()
Renvoie un nouveau QRhiRenderPassDescriptor compatible avec cette chaîne d'échange.
La valeur renvoyée est utilisée de deux manières : elle peut être transmise à setRenderPassDescriptor() et QRhiGraphicsPipeline::setRenderPassDescriptor(). Un descripteur de passe de rendu décrit les pièces jointes (couleur, profondeur/stencil) et le comportement de chargement/stockage qui peuvent être affectés par flags(). Un QRhiGraphicsPipeline ne peut être utilisé qu'en combinaison avec une chaîne d'échange qui a un ensemble compatible QRhiRenderPassDescriptor .
Voir également createOrResize().
QRhiSwapChainProxyData QRhiSwapChain::proxyData() const
Renvoie les données proxy actuellement définies.
Voir aussi setProxyData().
QRhiRenderPassDescriptor *QRhiSwapChain::renderPassDescriptor() const
Renvoie l'objet QRhiRenderPassDescriptor actuellement associé.
Voir aussi setRenderPassDescriptor().
[override virtual] QRhiResource::Type QRhiSwapChain::resourceType() const
Réimplémente : QRhiResource::resourceType() const.
Renvoie le type de ressource.
int QRhiSwapChain::sampleCount() const
Renvoie le nombre d'échantillons actuellement défini. 1 signifie qu'il n'y a pas d'anti-crénelage multi-échantillon.
Voir aussi setSampleCount().
void QRhiSwapChain::setDepthStencil(QRhiRenderBuffer *ds)
Définit le tampon de rendu ds pour une utilisation en tant que tampon de profondeur.
Voir aussi depthStencil().
void QRhiSwapChain::setFlags(QRhiSwapChain::Flags f)
Définit les drapeaux f.
Voir aussi flags().
void QRhiSwapChain::setFormat(QRhiSwapChain::Format f)
Définit le format f.
Evitez de définir des formats qui sont signalés comme non supportés par isFormatSupported(). Notez que la prise en charge d'un format donné peut dépendre de l'écran sur lequel la fenêtre associée à la chaîne d'échange est ouverte. Sur certaines plateformes, telles que Windows et macOS, pour que la sortie HDR fonctionne, il est nécessaire que la sortie HDR soit activée dans les paramètres d'affichage.
Voir isFormatSupported(), QRhiSwapChainHdrInfo, et Format pour plus d'informations sur la sortie HDR.
Voir également format().
void QRhiSwapChain::setProxyData(const QRhiSwapChainProxyData &d)
Définit les données proxy d.
Voir aussi proxyData() et QRhi::updateSwapChainProxyData().
void QRhiSwapChain::setRenderPassDescriptor(QRhiRenderPassDescriptor *desc)
Associé au site QRhiRenderPassDescriptor desc .
Voir aussi renderPassDescriptor().
void QRhiSwapChain::setSampleCount(int samples)
Définit le nombre d'échantillons. Les valeurs courantes pour samples sont 1 (pas de MSAA), 4 (4x MSAA) ou 8 (8x MSAA).
Voir également sampleCount() et QRhi::supportedSampleCounts().
[since 6.9] void QRhiSwapChain::setShadingRateMap(QRhiShadingRateMap *map)
S'associe à l'adresse QRhiShadingRateMap map spécifiée. Ceci n'est fonctionnel que lorsque la fonctionnalité QRhi::VariableRateShadingMap est signalée comme étant prise en charge.
Lorsque QRhiCommandBuffer::setShadingRate() est également appelé, le plus élevé des deux taux d'ombrage est utilisé pour chaque tuile. Il n'existe actuellement aucun contrôle sur le comportement du combinateur.
Remarque : la définition d'une carte de taux d'ombrage implique qu'une nouvelle QRhiRenderPassDescriptor différente est nécessaire et que certains des objets natifs de la chaîne d'échange doivent être reconstruits. Par conséquent, si la chaîne d'échange est déjà configurée, appelez newCompatibleRenderPassDescriptor() et setRenderPassDescriptor() juste après setShadingRateMap(). Ensuite, createOrResize() doit également être appelé à nouveau. Cela a des conséquences en termes de roulement, par exemple pour les pipelines graphiques : ceux-ci doivent également être associés au nouveau QRhiRenderPassDescriptor, puis reconstruits. Voir QRhiRenderPassDescriptor::serializedFormat() pour des suggestions sur la manière de traiter ce problème. N'oubliez pas d'activer le drapeau QRhiGraphicsPipeline::UsesShadingRate pour eux aussi.
Cette fonction a été introduite dans Qt 6.9.
Voir aussi shadingRateMap().
void QRhiSwapChain::setWindow(QWindow *window)
Définit la valeur de window.
Voir aussi window().
[since 6.9] QRhiShadingRateMap *QRhiSwapChain::shadingRateMap() const
Renvoie l'adresse QRhiShadingRateMap actuellement définie. Par défaut, il s'agit de nullptr.
Cette fonction a été introduite dans Qt 6.9.
Voir aussi setShadingRateMap().
[pure virtual] QSize QRhiSwapChain::surfacePixelSize()
Renvoie la taille de la surface ou du calque associé à la fenêtre.
Attention : Ne supposez pas qu'il s'agit de la même chose que QWindow::size() * QWindow::devicePixelRatio(). Avec certaines API graphiques et interfaces de systèmes de fenêtrage (par exemple, Vulkan), il est théoriquement possible qu'une surface ait une taille différente de celle de la fenêtre associée. Pour prendre en charge ces cas, la logique de rendu doit toujours baser les calculs dérivés de la taille (tels que les viewports) sur la taille signalée par QRhiSwapChain, et jamais sur la taille demandée à QWindow.
Remarque : cette fonctionpeut également être appelée avant createOrResize(), si au moins window() est déjà activé. En combinaison avec currentPixelSize(), cela permet de détecter quand une chaîne d'échange a besoin d'être redimensionnée. Cependant, il faut faire attention au fait que la taille de l'objet natif sous-jacent (surface, couche, ou similaire) est "en direct", donc chaque fois que cette fonction est appelée, elle renvoie la dernière valeur rapportée par l'implémentation sous-jacente, sans aucune garantie d'atomicité. Par conséquent, il est fortement déconseillé d'utiliser cette fonction pour déterminer la taille des pixels des ressources graphiques utilisées dans une image. Utilisez plutôt currentPixelSize() qui renvoie une taille atomique et qui ne changera pas entre les invocations de createOrResize().
Note : Pour les tampons de profondeur utilisés en combinaison avec les tampons de couleur de la chaîne d'échange, il est fortement recommandé de s'appuyer sur le comportement de dimensionnement et de reconstruction automatique fourni par le drapeau QRhiRenderBuffer:UsedWithSwapChainOnly. Evitez d'interroger la taille de la surface via cette fonction juste pour obtenir une taille qui peut être passée à QRhiRenderBuffer::setPixelSize() car cela souffrirait du manque d'atomicité décrit ci-dessus.
Voir également currentPixelSize().
QWindow *QRhiSwapChain::window() const
Renvoie la fenêtre actuellement définie.
Voir aussi setWindow().
© 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.