QRhiSwapChain Class
Ressource Swapchain. En savoir plus...
| 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 de : | 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 (swapchain) permet d'afficher les résultats du rendu sur une surface. Une chaîne d'échange s'appuie généralement sur un ensemble de tampons de couleur. Parmi ceux-ci, un seul est affiché à la fois.
Vous trouverez ci-dessous un modèle type pour la création et la gestion d’une chaîne d’échange et de certaines ressources associées afin d’effectuer un rendu sur une 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);
}QWindow Évitez de vous fier aux événements de redimensionnement de la surface pour redimensionner les swapchains, d’autant plus que les tailles de surface ne correspondent pas toujours exactement aux dimensions indiquées par l’ QWindow. L’approche la plus sûre et multiplateforme consiste à effectuer la vérification via ` surfacePixelSize()` à chaque début de nouvelle image.
La libération de la swapchain doit avoir lieu alors que l’ QWindow et la fenêtre native sous-jacente sont pleinement opérationnelles. Dans la continuité de 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 swapchain et le rendu de la première image ne peuvent pas démarrer à n’importe quel moment. L’approche sûre et multiplateforme consiste à s’appuyer sur les événements d’exposition. QExposeEvent est un événement dont la spécification est assez vague, envoyé chaque fois qu’une fenêtre est mappée, masquée ou redimensionnée, selon 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 le rendu lancé, un moyen simple de demander une nouvelle image consiste à appeler ` QWindow::requestUpdate()`. Si, sur certaines plateformes, il s’agit simplement d’un petit minuteur, sur d’autres, il dispose d’une implémentation spécifique : par exemple, sur macOS ou iOS, il peut s’appuyer sur `CVDisplayLink`. L’exemple ci-dessus est déjà prêt à gérer les demandes de mise à jour grâce à la gestion de ` QEvent::UpdateRequest`.
Tout en agissant comme un ` QRhiRenderTarget`, `QRhiSwapChain` gère également un ` QRhiCommandBuffer`. L’appel à ` QRhi::endFrame()` soumet les commandes enregistrées et met également en file d’attente une requête ` present `. Par défaut, cela s’effectue avec un intervalle de commutation (swap) 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 limité par la synchronisation verticale (vsync). Sur certains backends, cette fonctionnalité peut être désactivée en passant `QRhiSwapChain:NoVSync ` dans ` flags()`.
Le multisampling (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 multisample à la fin d’une image. Pour OpenGL, il est nécessaire de demander le nombre d’échantillons approprié également via QSurfaceFormat, en appelant QSurfaceFormat::setDefaultFormat() avant d’initialiser l’ QRhi.
Remarque : il s’agit d’une API RHI dont la compatibilité est garantie de manière limitée ; voir QRhi pour plus de détails.
Documentation sur les types de membres
enum QRhiSwapChain::Flag
flags QRhiSwapChain::Flags
Valeurs des indicateurs permettant de décrire les propriétés de la chaîne d'échange
| Constante | Valeur | Description |
|---|---|---|
QRhiSwapChain::SurfaceHasPreMulAlpha | 1 << 0 | Indique que la surface cible est transparente avec un alpha pré-multiplié. C'est par exemple ce qu'utilise ` Qt Quick ` lorsque le canal alpha est activé sur la cible ` QWindow`, car le rendu du graphe de scène génère toujours des fragments dont l'alpha est multiplié par les valeurs de rouge, vert et bleu. Pour garantir un comportement identique sur toutes les plateformes, définissez toujours QSurfaceFormat::alphaBufferSize() sur une valeur non nulle sur la QWindow cible chaque fois que cet indicateur est activé sur la swapchain. |
QRhiSwapChain::SurfaceHasNonPreMulAlpha | 1 << 1 | Indique que la surface cible présente une transparence avec un alpha non pré-multiplié. Notez que cette fonctionnalité peut ne pas être prise en charge sur certains systèmes, si le compositeur système s’attend toujours à un contenu avec un alpha pré-multiplié. Dans ce cas, le comportement lorsque ce drapeau est activé devrait être équivalent à celui de `SurfaceHasPreMulAlpha`. |
QRhiSwapChain::sRGB | 1 << 2 | Demande de sélection d'un format sRGB pour les tampons de couleur et/ou les vues de la cible de rendu de la chaîne d'échange, le cas échéant. Notez que cela implique que la mise à jour et le mélange du tampon de trame sRGB seront activés pour tout contenu ciblant cette chaîne d'échange, et qu'il n'est pas possible de désactiver cette fonctionnalité. Pour OpenGL, définissez également ` sRGBColorSpace ` sur l’ QSurfaceFormat e de l’ QWindow. Applicable uniquement lorsque le format de la chaîne d’échange est défini sur ` QRhiSwapChain::SDR`. |
QRhiSwapChain::UsedAsTransferSource | 1 << 3 | Indique que la swapchain sera utilisée comme source d’une lecture dans ` QRhiResourceUpdateBatch::readBackTexture()` (). |
QRhiSwapChain::NoVSync | 1 << 4 | Demande la désactivation de l’attente de la synchronisation verticale, ce qui évite également de limiter le thread de rendu. Ce comportement dépend du backend et n’est applicable que lorsqu’il est possible de le contrôler. Certains backends peuvent ignorer complètement cette demande. Pour OpenGL, essayez plutôt de définir l’intervalle de swap à 0 dans QWindow via QSurfaceFormat::setSwapInterval(). |
QRhiSwapChain::MinimalBufferCount | 1 << 5 | Demande la création de la chaîne d'échange avec le nombre minimal de tampons, qui est en pratique de 2, à moins que l'implémentation graphique n'impose un nombre minimal supérieur. Applicable uniquement 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, ce nombre est presque toujours de 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), notamment pour éviter des problèmes de performances inhabituels avec certaines implémentations de Vulkan sur les appareils mobiles. Il se peut que, sur certaines plateformes, il s’avère avantageux d’imposer le nombre de tampons le plus bas (2) ; ce drapeau permet donc de le forcer. Notez que tout cela n’a aucun effet sur le nombre d’images conservées en attente ; ainsi, le processeur (QRhi) continuera à préparer des images avec une avance maximale de N - 1 par rapport au GPU, même lorsque le nombre de tampons d’image de la chaîne d’échange est supérieur à N. (N = QRhi::FramesInFlight et est généralement égal à 2). |
Le type Flags est un typedef pour QFlags<Flag>. Il stocke une combinaison OR de valeurs Flag.
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 la fonction ` isFormatSupported()` pour vérifier au préalable si la création d’une swapchain au format donné est prise en charge par la plateforme et l’écran associé à la fenêtre, et avec la fonction ` setFormat()` pour définir le format demandé dans la swapchain avant d’appeler la fonction ` createOrResize()` pour la première fois.
| Constante | Valeur | Description |
|---|---|---|
QRhiSwapChain::SDR | 0 | RGBA ou BGRA 8 bits, selon le backend et la plateforme. Avec OpenGL ES en particulier, il peut arriver que la plateforme ne fournisse pas 8 bits (par exemple en raison d’EGL et du fait que la fonction QSurfaceFormat choisisse un format 565 ou 444 — cela échappe au contrôle de la fonction QRhi). Plage dynamique standard. Peut être combiné avec l’activation du drapeau « QRhiSwapChain::sRGB ». |
QRhiSwapChain::HDRExtendedSrgbLinear | 1 | RGBA à 16 bits en virgule flottante, plage dynamique élevée, espace colorimétrique sRGB linéaire étendu (scRGB). Cela implique les couleurs primaires Rec. 709 (identiques à celles du 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 ; c’est le format recommandé pour les swapchains HDR en général sur les plateformes de bureau. |
QRhiSwapChain::HDR10 | 2 | RGB ou BGR en entier non signé 10 bits avec canal alpha de 2 bits, plage dynamique élevée, espace colorimétrique HDR10 (Rec. 2020) avec une fonction de transfert PQ ST2084. |
QRhiSwapChain::HDRExtendedDisplayP3Linear | 3 | RGBA à 16 bits en virgule flottante, plage dynamique élevée, espace colorimétrique Display P3 linéaire étendu. Le choix principal pour le HDR sur des plateformes telles qu’iOS et VisionOS. |
enum QRhiSwapChain::StereoTargetBuffer
Sélectionne le tampon arrière à utiliser avec une chaîne d'échange stéréoscopique.
| Constante | Valeur |
|---|---|
QRhiSwapChain::LeftBuffer | 0 |
QRhiSwapChain::RightBuffer | 1 |
Documentation des fonctions membres
[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 les adapter à la taille actuelle de la surface cible. Appelez cette fonction chaque fois que la taille de la surface cible diffère de celle d'auparavant.
Remarque : n’appelez ` destroy()` que lorsque la chaîne d’échange doit être libérée complètement, généralement lors d’un appel à ` QPlatformSurfaceEvent::SurfaceAboutToBeDestroyed`. Pour redimensionner, il suffit d’appeler `createOrResize()`.
Renvoie ` true ` en cas de succès, ` false ` lorsqu’une opération graphique a échoué. Quelle que soit la valeur renvoyée, l’appel à ` destroy()` est toujours sans risque.
[pure virtual] QRhiCommandBuffer *QRhiSwapChain::currentFrameCommandBuffer()
Renvoie un tampon de commandes dans lequel les commandes de rendu et les mises à jour de ressources peuvent être enregistrées au sein d’un bloc « beginFrame » - endFrame, à condition que la fonction beginFrame() ait été appelée avec cette chaîne d’échange.
Remarque : l’objet renvoyé reste valide après l’appel à endFrame(), jusqu’au prochain appel à beginFrame(), mais le tampon de commandes renvoyé ne doit pas être utilisé pour enregistrer des commandes à ce moment-là. Il peut en revanche servir à interroger les données collectées au cours de l’image (ou des images précédentes), par exemple en appelant lastCompletedGpuTime().
Remarque : la valeur ne doit pas être mise en cache ni réutilisée d’une image à l’autre. L’appelant ne doit pas conserver l’objet renvoyé une fois que la fonction ` beginFrame()` a été appelée à nouveau. Il convient plutôt d’interroger à nouveau l’objet tampon de commandes en appelant cette fonction.
[pure virtual] QRhiRenderTarget *QRhiSwapChain::currentFrameRenderTarget()
Renvoie une cible de rendu pouvant être utilisée avec la fonction `beginPass()` afin de rendre le tampon arrière actuel de la chaîne d'échange. Valable uniquement au sein d'un bloc ` QRhi::beginFrame()` - ` QRhi::endFrame()` dans lequel la fonction `beginFrame()` a été appelée avec cette chaîne d'échange.
Remarque : la valeur ne doit pas être mise en cache ni réutilisée d'une image à l'autre.
[virtual] QRhiRenderTarget *QRhiSwapChain::currentFrameRenderTarget(QRhiSwapChain::StereoTargetBuffer targetBuffer)
Renvoie une cible de rendu pouvant être utilisée avec la fonction `beginPass()` afin d'effectuer le rendu vers le tampon arrière gauche ou droit de la chaîne d'échange. Cette surcharge ne doit être utilisée qu'avec le rendu stéréoscopique, c'est-à-dire lorsque la chaîne d'échange associée ( QWindow ) s'appuie sur deux tampons de couleur, un pour chaque œil, au lieu d'un seul.
Lorsque le rendu stéréoscopique n’est pas pris en charge, la valeur renvoyée sera la cible par défaut. Cette fonctionnalité est prise en charge par tous les backends matériels, à l’exception de Metal, en combinaison avec ` QSurfaceFormat::StereoBuffers`, à condition qu’elle soit prise en charge par la pile des pilotes graphiques et d’affichage lors de l’exécution. Les backends Metal et Null renverront la cible de rendu par défaut à partir de cette surcharge.
Remarque : la valeur ne doit pas être mise en cache ni réutilisée d’une image à l’autre
QSize QRhiSwapChain::currentPixelSize() const
Renvoie la taille avec laquelle la chaîne d'échange a été créée avec succès pour la dernière fois. Utilisez cette fonction pour déterminer s'il est nécessaire d'appeler à nouveau ` createOrResize()` : si ` currentPixelSize() != surfacePixelSize() `, cela signifie que la chaîne d'échange doit être redimensionnée.
Remarque : la logique de renduclassique appelle cette fonction pour obtenir la taille de sortie au moment de commencer à préparer une nouvelle image, et base les calculs dépendants (tels que la fenêtre d’affichage) sur la taille renvoyée par cette fonction.
Bien que, dans de nombreux cas, la valeur soit identique à celle renvoyée par ` QWindow::size() * QWindow::devicePixelRatio()`, il n’est pas garanti que la taille indiquée par ` QWindow` soit correcte sur toutes les plateformes et dans toutes les implémentations d’API graphiques. L’utilisation de cette fonction est donc fortement recommandée 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 d’éventuels conflits d’accès lorsque la fonction QRhi est utilisée sur un thread de rendu dédié, car cela évite d’avoir à appeler des fonctions QWindow, qui pourraient alors accéder à des données mises à jour sur le thread principal.
Voir également surfacePixelSize().
QRhiRenderBuffer *QRhiSwapChain::depthStencil() const
Renvoie le tampon de rendu actuellement associé à la profondeur-stencil.
Voir également setDepthStencil().
QRhiSwapChain::Flags QRhiSwapChain::flags() const
Renvoie les indicateurs actuellement activés.
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 relatives à l'écran associé.
Ne partez pas du principe que cette opération est peu coûteuse. Selon la plate-forme, cette fonction effectue diverses requêtes qui peuvent avoir un impact sur les performances.
Remarque : peut être appelée avant ` createOrResize()` tant que la fenêtre est de type ` set`.
Remarque : le comportement lors du déplacement d'une fenêtre avec une chaîne d'échange initialisée entre différents écrans (de HDR à HDR avec des caractéristiques différentes, de HDR à SDR, etc.) n'est actuellement pas bien défini et dépend fortement du système de fenêtrage et du compositeur, avec un comportement pouvant varier d'une plateforme à l'autre. Actuellement, ` QRhi ` garantit uniquement que `hdrInfo()` renvoie des données valides, si elles sont disponibles, pour l’écran auquel appartenait la fenêtre associée à la chaîne d’échange au moment de l’appel à ` createOrResize()`.
Voir également QRhiSwapChainHdrInfo.
[pure virtual] bool QRhiSwapChain::isFormatSupported(QRhiSwapChain::Format f)
Renvoie « true » si le format de swapchain indiqué ( f ) est pris en charge. Le format SDR est toujours pris en charge.
Remarque : peut être appelé indépendamment de la fonction createOrResize(), mais la fonction window() doit déjà avoir été définie. Un appel sans fenêtre définie peut entraîner des résultats inattendus selon le backend et la plateforme (le résultat sera très probablement « false » pour tout format HDR), car la prise en charge des formats HDR est généralement liée à la sortie (écran) à laquelle appartient la fenêtre associée à la swapchain à un moment donné. Si le résultat est « true » pour un format HDR, la création de la swapchain avec ce format devrait alors aboutir, à condition que la fenêtre ne soit pas déplacée vers un autre écran entre-temps.
Cette fonction sert principalement à être appelée avant le premier appel à ` createOrResize()` une fois que la fenêtre est déjà définie. Cela permet aux backends ` QRhi ` d’effectuer des requêtes spécifiques à la plateforme ou au système de fenêtrage afin de 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 pris en charge, appelez ` setFormat()` pour définir le format demandé, puis appelez ` createOrResize()`. Soyez toutefois conscient des conséquences : la demande réussie d’un format HDR impliquera de gérer un espace colorimétrique différent, éventuellement d’effectuer une correction du niveau de blanc pour les contenus non compatibles HDR, d’ajuster les méthodes de mappage de tons, de modifier les paramètres de la cible de rendu hors écran, etc.
Voir également setFormat().
[pure virtual] QRhiRenderPassDescriptor *QRhiSwapChain::newCompatibleRenderPassDescriptor()
Renvoie un nouvel objet ` QRhiRenderPassDescriptor ` compatible avec cette chaîne d'échange.
La valeur renvoyée est utilisée de deux manières : elle peut être transmise aux fonctions ` 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 pouvant être affecté par la fonction ` flags()`. Un ` QRhiGraphicsPipeline ` ne peut être utilisé qu’en combinaison avec une chaîne d’échange pour laquelle le paramètre ` compatible ` QRhiRenderPassDescriptor est défini.
Voir également createOrResize().
QRhiSwapChainProxyData QRhiSwapChain::proxyData() const
Renvoie les données de proxy actuellement définies.
Voir également 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. La valeur 1 signifie qu'il n'y a pas d'anticrénelage par échantillonnage multiple.
Voir également la fonction ` setSampleCount()`.
void QRhiSwapChain::setDepthStencil(QRhiRenderBuffer *ds)
Définit l’ ds du tampon de rendu pour qu’il soit utilisé comme tampon de profondeur-stencil.
Voir également depthStencil().
void QRhiSwapChain::setFlags(QRhiSwapChain::Flags f)
Définit les indicateurs « f ».
Voir aussi flags().
void QRhiSwapChain::setFormat(QRhiSwapChain::Format f)
Définit le format f.
Évitez de définir des formats signalés comme non pris en charge par la fonction ` 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 d'activer la sortie HDR dans les paramètres d'affichage.
Consultez isFormatSupported(), QRhiSwapChainHdrInfo et Format pour plus d’informations sur la sortie à plage dynamique élevée.
Voir également format().
void QRhiSwapChain::setProxyData(const QRhiSwapChainProxyData &d)
Définit l'd des données du proxy.
Voir également proxyData() et QRhi::updateSwapChainProxyData().
void QRhiSwapChain::setRenderPassDescriptor(QRhiRenderPassDescriptor *desc)
Partenaire de l'QRhiRenderPassDescriptor desc .
Voir également renderPassDescriptor().
void QRhiSwapChain::setSampleCount(int samples)
Définit le nombre d'échantillons. Les valeurs courantes pour « samples » sont 1 (pas de MSAA), 4 (MSAA 4x) ou 8 (MSAA 8x).
Voir également sampleCount() et QRhi::supportedSampleCounts().
[since 6.9] void QRhiSwapChain::setShadingRateMap(QRhiShadingRateMap *map)
S'associe à l'QRhiShadingRateMap spécifiée map. Cette fonctionnalité n'est disponible que lorsque la fonctionnalité QRhi::VariableRateShadingMap est signalée comme prise en charge.
Lorsque la fonction ` QRhiCommandBuffer::setShadingRate()` est également appelée, c’est le taux d’ombrage le plus élevé des deux qui est utilisé pour chaque tuile. Il n’existe actuellement aucun moyen de contrôler le comportement du combinateur.
Remarque : la définition d’ une carte de taux d’ombrage implique qu’un nouveau QRhiRenderPassDescriptor est nécessaire et que certains 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() immédiatement après setShadingRateMap(). Ensuite, createOrResize() doit également être appelé à nouveau. Cela a des répercussions en cascade, notamment sur les pipelines graphiques : ceux-ci doivent également être associés au nouveau ` QRhiRenderPassDescriptor `, puis reconstruits. Consultez ` QRhiRenderPassDescriptor::serializedFormat()` pour obtenir des suggestions sur la manière de gérer cette situation. N’oubliez pas de définir également le drapeau ` QRhiGraphicsPipeline::UsesShadingRate ` pour ces derniers.
Cette fonction a été introduite dans Qt 6.9.
Voir également shadingRateMap().
void QRhiSwapChain::setWindow(QWindow *window)
Définit la propriété « window ».
Voir aussi window().
[since 6.9] QRhiShadingRateMap *QRhiSwapChain::shadingRateMap() const
Renvoie la valeur actuellement définie pour ` QRhiShadingRateMap`. Par défaut, cette valeur est ` nullptr`.
Cette fonction a été introduite dans Qt 6.9.
Voir également setShadingRateMap().
[pure virtual] QSize QRhiSwapChain::surfacePixelSize()
Renvoie la taille de la surface ou du calque associé à la fenêtre.
Avertissement : ne partez pas du principeque cette valeur est identique à celle de ` QWindow::size() * QWindow::devicePixelRatio()`. Avec certaines API graphiques et certaines interfaces de systèmes de fenêtrage (par exemple, Vulkan), il existe une possibilité théorique 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 fenêtres de visualisation) sur la taille renvoyée par ` QRhiSwapChain`, et jamais sur la taille interrogée via ` QWindow `.
Remarque : cette fonctionpeut également être appelée avant ` createOrResize()`, à condition que ` window()` soit déjà défini. Combinée à ` currentPixelSize()`, elle permet de détecter quand une chaîne d’échange doit être redimensionnée. Cependant, il faut tenir compte du fait que la taille de l’objet natif sous-jacent (surface, couche ou similaire) est « dynamique » ; ainsi, chaque fois que cette fonction est appelée, elle renvoie la dernière valeur signalé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 les tailles en pixels des ressources graphiques utilisées dans une image. Privilégiez plutôt la fonction currentPixelSize() qui renvoie une taille atomique et qui ne changera pas entre deux appels à createOrResize().
Remarque : pour les tampons de profondeur-stencil 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 redimensionnement et de reconstruction automatiques fourni par l’indicateur ` QRhiRenderBuffer:UsedWithSwapChainOnly`. Évitez d’interroger la taille de la surface via cette fonction dans le seul but d’obtenir une valeur pouvant être transmise à ` QRhiRenderBuffer::setPixelSize()` (), car cela souffrirait d’un manque d’atomicité, comme décrit ci-dessus.
Voir également ` currentPixelSize()`.
QWindow *QRhiSwapChain::window() const
Renvoie la fenêtre actuellement sélectionnée.
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.