Sur cette page

QRhiCommandBuffer Class

Ressource du tampon de commandes. 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 BeginPassFlag { ExternalContent, DoNotTrackResourcesForCompute }
flags BeginPassFlags
DynamicOffset
enum IndexFormat { IndexUInt16, IndexUInt32 }
VertexInput

Fonctions publiques

void beginComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})
void beginExternal()
void beginPass(QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})
void debugMarkBegin(const QByteArray &name)
void debugMarkEnd()
void debugMarkMsg(const QByteArray &msg)
void dispatch(int x, int y, int z)
void draw(quint32 vertexCount, quint32 instanceCount = 1, quint32 firstVertex = 0, quint32 firstInstance = 0)
void drawIndexed(quint32 indexCount, quint32 instanceCount = 1, quint32 firstIndex = 0, qint32 vertexOffset = 0, quint32 firstInstance = 0)
(since 6.12) void drawIndexedIndirect(QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride = sizeof(QRhiIndexedIndirectDrawCommand))
(since 6.12) void drawIndirect(QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride = sizeof(QRhiIndirectDrawCommand))
void endComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)
void endExternal()
void endPass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)
double lastCompletedGpuTime()
const QRhiNativeHandles *nativeHandles()
void resourceUpdate(QRhiResourceUpdateBatch *resourceUpdates)
void setBlendConstants(const QColor &c)
void setComputePipeline(QRhiComputePipeline *ps)
void setGraphicsPipeline(QRhiGraphicsPipeline *ps)
void setScissor(const QRhiScissor &scissor)
void setShaderResources(QRhiShaderResourceBindings *srb = nullptr, int dynamicOffsetCount = 0, const QRhiCommandBuffer::DynamicOffset *dynamicOffsets = nullptr)
(since 6.9) void setShadingRate(const QSize &coarsePixelSize)
void setStencilRef(quint32 refValue)
void setVertexInput(int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings, QRhiBuffer *indexBuf = nullptr, quint32 indexOffset = 0, QRhiCommandBuffer::IndexFormat indexFormat = IndexUInt16)
void setViewport(const QRhiViewport &viewport)

Fonctions publiques réimplémentées

virtual QRhiResource::Type resourceType() const override

Description détaillée

Ne peut pas être créé par les applications pour le moment. Les seuls moyens d’obtenir un QRhiCommandBuffer valide consistent à le récupérer depuis la swapchain ciblée via QRhiSwapChain::currentFrameCommandBuffer() ou, en cas de rendu entièrement hors écran, à en initialiser un via QRhi::beginOffscreenFrame().

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 QRhiCommandBuffer::BeginPassFlag
flags QRhiCommandBuffer::BeginPassFlags

Valeurs des indicateurs pour QRhi::beginPass()

ConstanteValeurDescription
QRhiCommandBuffer::ExternalContent0x01Spécifie qu’il y aura un appel à ` QRhiCommandBuffer::beginExternal()` au cours de ce passage. Certains backends, notamment Vulkan, échoueront si ce drapeau n’est pas activé et que ` beginExternal()` est tout de même appelé.
QRhiCommandBuffer::DoNotTrackResourcesForCompute0x02Indique qu’il n’est pas nécessaire de suivre les ressources utilisées dans ce passage si le seul but de ce suivi est de générer des barrières pour le calcul. Cela implique qu’il n’y a pas de passages de calcul dans l’image. Il s’agit d’une indication d’optimisation qui peut être prise en compte par certains backends, notamment OpenGL, leur permettant ainsi d’ignorer certaines opérations. Lorsque cet indicateur est activé pour un passage de rendu dans une image, l’appel de ` beginComputePass()` dans cette image peut entraîner un comportement inattendu, en fonction des dépendances de ressources entre les passages de rendu et de calcul.

Le type `BeginPassFlags` est un `typedef` pour ` QFlags<BeginPassFlag>`. Il stocke une combinaison OR de valeurs `BeginPassFlag`.

[alias] QRhiCommandBuffer::DynamicOffset

Synonyme de std::pair<int, quint32>. Le premier élément correspond à la liaison, le second à l'offset dans le tampon.

enum QRhiCommandBuffer::IndexFormat

Spécifie le type de données de l'index

ConstanteValeurDescription
QRhiCommandBuffer::IndexUInt16016 bits non signés (quint16)
QRhiCommandBuffer::IndexUInt32132 bits non signé (quint32)

[alias] QRhiCommandBuffer::VertexInput

Synonyme de `std::pair<QRhiBuffer *, quint32>`. Le deuxième élément correspond à un décalage dans le tampon spécifié par le premier.

Documentation des fonctions membres

void QRhiCommandBuffer::beginComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})

Enregistre le début d'un nouveau cycle de calcul.

resourceUpdates, lorsqu'il n'est pas nul, spécifie un lot de mises à jour de ressources qui doit être validé puis libéré.

Remarque : ne partez pas du principe que l'état ou les liaisons de ressources persistent d'un cycle à l'autre.

Remarque : un passage de calcul peut enregistrer les appels ` setComputePipeline()`, ` setShaderResources()` et ` dispatch()`, mais pas les appels graphiques. Les fonctionnalités générales, telles que les marqueurs de débogage et ` beginExternal()`, sont disponibles à la fois dans les passages de rendu et de calcul.

Remarque : le calcul n’est disponible que lorsque la fonctionnalité Compute est signalée comme prise en charge.

flags n'est actuellement pas utilisé.

void QRhiCommandBuffer::beginExternal()

À appeler lorsque l'application en cours s'apprête à mettre en file d'attente des commandes dans le tampon de commandes du passage actuel en appelant directement les fonctions de l'API graphique.

Remarque : cette fonction n'est disponible que si l'intention a été déclarée au préalable dans beginPass() ou beginComputePass(). Par conséquent, cette fonction ne doit être appelée que lorsque l'enregistrement du passage a été lancé en spécifiant QRhiCommandBuffer::ExternalContent.

Avec Vulkan, Metal ou Direct3D 12, il est possible d’interroger les objets natifs de tampon de commandes ou d’encodeur via ` nativeHandles()` et d’y mettre des commandes en file d’attente. Avec OpenGL ou Direct3D 11, le contexte (du périphérique) peut être récupéré via ` QRhi::nativeHandles()`. Cependant, cela ne doit jamais être effectué sans s’assurer que l’état de l’ QRhiCommandBuffer reste à jour. D’où la nécessité d’encapsuler tout enregistrement de commande ajouté en externe entre les fonctions `beginExternal()` et ` endExternal()`. Conceptuellement, cela correspond aux fonctions ` beginNativePainting()` et ` endNativePainting()` de l’ QPainter.

Pour OpenGL en particulier, cette fonction a une tâche supplémentaire : elle s'assure que le contexte est rendu actif sur le thread actuel.

Remarque : une fois que beginExternal() a été appelée, aucune autre fonction spécifique au passage de rendu (set* ou draw*) ne doit être appelée sur l’ QRhiCommandBuffer jusqu’à ce que endExternal() soit appelée.

Avertissement : certains backends peuvent renvoyer, via ` QRhiCommandBuffer::nativeHandles()`, un objet de tampon de commandes natif différent de l’objet principal lorsqu’ils se trouvent à l’intérieur d’un bloc `beginExternal()` - ` endExternal()`. Il est donc important de (re)interroger l’objet de tampon de commandes natif après avoir appelé `beginExternal()`. Concrètement, cela signifie qu’avec Vulkan, par exemple, les commandes Vulkan enregistrées en externe sont placées dans un tampon de commandes secondaire (avec VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT). La fonction nativeHandles() renvoie ce tampon de commandes secondaire lorsqu’elle est appelée entre les fonctions begin/endExternal.

Voir également endExternal() et nativeHandles().

void QRhiCommandBuffer::beginPass(QRhiRenderTarget *rt, const QColor &colorClearValue, const QRhiDepthStencilClearValue &depthStencilClearValue, QRhiResourceUpdateBatch *resourceUpdates = nullptr, QRhiCommandBuffer::BeginPassFlags flags = {})

Enregistre le début d'un nouveau passage de rendu ciblant la cible de rendu rt.

resourceUpdates, lorsqu’elle n’est pas nulle, spécifie un lot de mise à jour de ressources qui doit être validé puis libéré.

Les tampons de couleur et de profondeur/stencil de la cible de rendu sont normalement effacés. Les valeurs d’effacement sont spécifiées dans ` colorClearValue ` et ` depthStencilClearValue`. Il en va autrement lorsque la cible de rendu a été créée avec ` QRhiTextureRenderTarget::PreserveColorContents ` et/ou ` QRhiTextureRenderTarget::PreserveDepthStencilContents`. Dans ce cas, les valeurs d’effacement sont ignorées.

Remarque : l’activation de la conservation du contenu de couleur ou de profondeur entraîne une baisse des performances en fonction du matériel sous-jacent. Les GPU mobiles dotés d’une architecture en mosaïque bénéficient du fait de ne pas avoir à recharger le contenu précédent dans le tampon de mosaïque. De même, une opération de « QRhiTextureRenderTarget » utilisant une texture de profondeur ( QRhiTexture ) comme tampon de profondeur est moins efficace qu’une opération de « QRhiRenderBuffer », car l’utilisation d’une texture de profondeur nécessite d’y écrire les données, alors qu’avec les tampons de rendu (renderbuffers), cela n’est pas nécessaire (l’API n’autorisant ni l’échantillonnage ni la lecture à partir d’un tampon de rendu).

Remarque : ne partez pas du principe que les liaisons d’états ou de ressources persistent d’un passage à l’autre.

Remarque : les fonctions ` set ` et ` draw ` de l’ QRhiCommandBuffer ne peuvent être appelées qu’à l’intérieur d’un passage. De plus, à l’exception de ` setGraphicsPipeline()`, elles supposent qu’un pipeline est déjà défini dans le tampon de commande. Dans le cas contraire, des problèmes non spécifiés peuvent survenir, selon le backend.

Si ` rt ` est un ` QRhiTextureRenderTarget`, `beginPass()` vérifie si les objets texture et tampon de rendu référencés par la cible de rendu sont à jour. Ce comportement est similaire à celui de la fonction setShaderResources() pour QRhiShaderResourceBindings. Si l’un des éléments associés a été reconstruit depuis l’appel à QRhiTextureRenderTarget::create(), un appel implicite à create() est effectué sur rt. Par conséquent, si rt comporte un élément de couleur associé QRhiTexture texture et qu’il est nécessaire de modifier la taille de la texture, le code suivant est alors valide :

QRhiTextureRenderTarget *rt = rhi->newTextureRenderTarget({ { texture } });
rt->create();
// ...
texture->setPixelSize(new_size);
texture->create();
cb->beginPass(rt, colorClear, dsClear); // this is ok, no explicit rt->create() is required before

flags permet de contrôler certaines fonctionnalités avancées. Un indicateur couramment utilisé est ExternalContents. Celui-ci doit être spécifié chaque fois que beginExternal() sera appelé au cours de la passe lancée par cette fonction.

Voir également endPass() et BeginPassFlags.

void QRhiCommandBuffer::debugMarkBegin(const QByteArray &name)

Enregistre un groupe de débogage nommé dans le tampon de commande avec l'name spécifiée. Ce groupe s'affiche dans les outils de débogage graphique tels que RenderDoc et XCode. La fin du regroupement est indiquée par la fonction debugMarkEnd().

Remarque : ignoré lorsque les QRhi::DebugMarkers ne sont pas pris en charge ou que QRhi::EnableDebugMarkers n'est pas défini.

Remarque : peut être appelé n'importe où dans le cadre, aussi bien à l'intérieur qu'à l'extérieur des passes.

void QRhiCommandBuffer::debugMarkEnd()

Marque la fin d'un groupe de débogage.

Remarque : ignoré lorsque les « QRhi::DebugMarkers » ne sont pas pris en charge ou que « QRhi::EnableDebugMarkers » n'est pas défini.

Remarque : peut être appelé n'importe où dans le cadre, aussi bien à l'intérieur qu'à l'extérieur des passes.

void QRhiCommandBuffer::debugMarkMsg(const QByteArray &msg)

Insère un message de débogage msg dans le flux de commandes.

Remarque : ignoré lorsque les messages de débogage ( QRhi::DebugMarkers ) ne sont pas pris en charge ou que l'option ` QRhi::EnableDebugMarkers ` n'est pas définie.

Remarque : avec certains backends, la fonction `debugMarkMsg()` n'est prise en charge qu'à l'intérieur d'un passage et est ignorée lorsqu'elle est appelée en dehors d'un passage. Avec d'autres, elle est enregistrée n'importe où dans la trame.

void QRhiCommandBuffer::dispatch(int x, int y, int z)

Enregistre les éléments de travail de calcul à distribuer, en utilisant les paramètres x, y et z pour spécifier le nombre de groupes de travail locaux dans la dimension correspondante.

Remarque : cette fonction ne peut être appelée qu’au sein d’un passage de calcul, c’est-à-dire entre un appel à beginComputePass() et un appel à endComputePass().

Remarque : les fonctions x, y et z doivent respecter les limites imposées par l’implémentation de l’API graphique sous-jacente au moment de l’exécution. Les valeurs maximales sont généralement de 65 535.

Remarque : veillez également aux limites éventuelles concernant la taille du groupe de travail local. Celle-ci est spécifiée dans le shader, par exemple : layout(local_size_x = 16, local_size_y = 16) in;. Par exemple, avec OpenGL, la valeur minimale imposée par la spécification pour le nombre d’invocations dans un seul groupe de travail local (le produit de local_size_x, local_size_y et local_size_z) est de 1 024, tandis qu’avec OpenGL ES (3.1), cette valeur peut descendre jusqu’à 128. Cela signifie que l’exemple donné ci-dessus peut être rejeté par certaines implémentations d’OpenGL ES, car le nombre d’invocations est de 256.

void QRhiCommandBuffer::draw(quint32 vertexCount, quint32 instanceCount = 1, quint32 firstVertex = 0, quint32 firstInstance = 0)

Enregistre un tracé non indexé.

Le nombre de sommets est spécifié dans ` vertexCount`. Pour un dessin instancié, définissez ` instanceCount ` sur une valeur différente de 1. ` firstVertex ` correspond à l'index du premier sommet à dessiner. Lors du dessin de plusieurs instances, l'ID de la première instance est spécifié par ` firstInstance`.

Remarque : ` firstInstance ` peut ne pas être pris en charge et est ignoré lorsque la fonctionnalité ` QRhi::BaseInstance ` est signalée comme non prise en charge. Dans ce cas, l’ID de la première instance est toujours 0. ` QRhi::BaseInstance ` n’est actuellement jamais pris en charge par OpenGL, principalement en raison des limitations d’OpenGL ES ; par conséquent, les applications portables ne doivent pas être conçues pour s’appuyer sur cet argument.

Remarque : les shaders qui doivent accéder à l’index du sommet ou de l’instance actuel doivent utiliser gl_VertexIndex et gl_InstanceIndex, c’est-à-dire les variables intégrées compatibles avec Vulkan, au lieu de gl_VertexID et gl_InstanceID.

Remarque : lorsque firstInstance est différent de zéro, gl_InstanceIndex n’inclut pas la valeur de base avec certaines API 3D sous-jacentes. Ceci est indiqué par la fonctionnalité QRhi::InstanceIndexIncludesBaseInstance. S’il est impossible d’éviter de s’appuyer sur une valeur d’instance de base, il est conseillé aux applications de transmettre cette valeur sous forme d’uniform de manière conditionnelle, en fonction de ce que cette fonctionnalité indique, et de l’ajouter à gl_InstanceIndex dans le shader.

Remarque : cette fonction ne peut être appelée qu’au sein d’un passage de rendu, c’est-à-dire entre un appel à ` beginPass()` et un appel à ` endPass()`.

void QRhiCommandBuffer::drawIndexed(quint32 indexCount, quint32 instanceCount = 1, quint32 firstIndex = 0, qint32 vertexOffset = 0, quint32 firstInstance = 0)

Enregistre un tirage indexé.

Le nombre de sommets est spécifié dans ` indexCount`. ` firstIndex ` est l'index de base. Le décalage effectif dans le tampon d'index est donné par ` indexOffset + firstIndex * n `, où ` n ` vaut 2 ou 4 selon le type d'élément d'index. ` indexOffset ` est spécifié dans ` setVertexInput()`.

Remarque : le décalage effectif dans le tampon d'index doit être aligné sur 4 octets avec certains backends (par exemple, Metal). Avec ces backends, la fonctionnalité « NonFourAlignedEffectiveIndexBufferOffset » sera signalée comme non prise en charge.

vertexOffset (également appelée « base vertex ») est une valeur signée qui est ajoutée à l’index de l’élément avant l’indexation dans le tampon de sommets. Cette fonctionnalité n’est pas toujours prise en charge, et la valeur est ignorée lorsque la fonctionnalité « QRhi::BaseVertex » est signalée comme non prise en charge.

Pour le dessin instancié, définissez « instanceCount » sur une valeur autre que 1. Lors du dessin de plusieurs instances, l’ID de la première instance est spécifié par « firstInstance ».

Remarque : firstInstance peut ne pas être pris en charge et est ignoré lorsque la fonctionnalité QRhi::BaseInstance est signalée comme non prise en charge. Dans ce cas, l’ID de la première instance est toujours 0. QRhi::BaseInstance n’est pour l’instant jamais pris en charge par OpenGL, principalement en raison des limitations d’OpenGL ES ; par conséquent, les applications portables ne doivent pas être conçues pour s’appuyer sur cet argument.

Remarque : les shaders qui doivent accéder à l’index du sommet ou de l’instance actuel doivent utiliser gl_VertexIndex et gl_InstanceIndex, c’est-à-dire les variables intégrées compatibles avec Vulkan, au lieu de gl_VertexID et gl_InstanceID.

Remarque : lorsque firstInstance est différent de zéro, gl_InstanceIndex n’inclut pas la valeur de base avec certaines API 3D sous-jacentes. Ceci est indiqué par la fonctionnalité QRhi::InstanceIndexIncludesBaseInstance. S’il est impossible d’éviter de s’appuyer sur une valeur d’instance de base, il est conseillé aux applications de transmettre cette valeur sous forme d’uniform de manière conditionnelle, en fonction de ce que cette fonctionnalité indique, et de l’ajouter à gl_InstanceIndex dans le shader.

Remarque : cette fonction ne peut être appelée qu'au sein d'un passage de rendu, c'est-à-dire entre un appel à ` beginPass()` et un appel à ` endPass()`.

[since 6.12] void QRhiCommandBuffer::drawIndexedIndirect(QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride = sizeof(QRhiIndexedIndirectDrawCommand))

Enregistre un tracé indirect indexé.

Les paramètres de lecture sont fournis par le tampon spécifié dans ` indirectBuffer`, qui doit contenir un tableau d'éléments de type ` QRhiIndexedIndirectDrawCommand`. Les paramètres de ` QRhiIndexedIndirectDrawCommand ` ont la même signification que dans ` drawIndexed()`.

Le décalage, en octets, à partir duquel les paramètres sont lus dans le tampon est spécifié par indirectBufferOffset.

drawCount spécifie le nombre de ces commandes de dessin à émettre.

stride indique la taille en octets de chaque structure de commande de dessin dans le tampon. Cela permet d’intercaler des données personnalisées entre les commandes si nécessaire. La valeur doit être un multiple de 4 et supérieure ou égale à sizeof(QRhiIndexedIndirectDrawCommand).

Remarque : une valeur de ` drawCount ` supérieure à 1 n’est prise en charge nativement que si la fonctionnalité ` QRhi::DrawIndirectMulti ` est signalée comme prise en charge et que `stride` est la valeur par défaut. Sinon, cette fonction émule le multi-draw en enregistrant plusieurs appels de dessin, sans offrir d’avantage en termes de performances par rapport à des appels répétés à ` drawIndexed()`.

Remarque : cette fonction ne peut être appelée qu’au sein d’un passage de rendu, c’est-à-dire entre un appel à ` beginPass()` et un appel à ` endPass()`.

Cette fonction a été introduite dans Qt 6.12.

[since 6.12] void QRhiCommandBuffer::drawIndirect(QRhiBuffer *indirectBuffer, quint32 indirectBufferOffset, quint32 drawCount, quint32 stride = sizeof(QRhiIndirectDrawCommand))

Enregistre un tracé indirect non indexé.

Les paramètres de lecture sont fournis par le tampon spécifié dans ` indirectBuffer`, qui doit contenir un tableau d’éléments de type ` QRhiIndirectDrawCommand`. Les paramètres de ` QRhiIndirectDrawCommand ` ont la même signification que dans ` draw()`.

Le décalage, en octets, à partir duquel les paramètres sont lus dans le tampon est spécifié par indirectBufferOffset.

drawCount spécifie le nombre de ces commandes de dessin à émettre.

stride indique la taille en octets de chaque structure de commande de dessin dans le tampon. Cela permet d’intercaler des données personnalisées entre les commandes si nécessaire. La valeur doit être un multiple de 4 et supérieure ou égale à sizeof(QRhiIndirectDrawCommand).

Remarque : une valeur de ` drawCount ` supérieure à 1 n’est prise en charge en natif que si la fonctionnalité ` QRhi::DrawIndirectMulti ` est signalée comme prise en charge et que `stride` est la valeur par défaut. Sinon, cette fonction émule le multi-dessin en enregistrant plusieurs appels de dessin, sans offrir d’avantage en termes de performances par rapport à des appels répétés à ` draw()`.

Remarque : cette fonction ne peut être appelée qu’au sein d’un passage de rendu, c’est-à-dire entre un appel à ` beginPass()` et un appel à ` endPass()`.

Cette fonction a été introduite dans Qt 6.12.

void QRhiCommandBuffer::endComputePass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)

Enregistrements marquant la fin du cycle de calcul en cours.

resourceUpdates, lorsqu'il n'est pas nul, spécifie un lot de mise à jour de ressources qui doit être validé puis libéré.

void QRhiCommandBuffer::endExternal()

À appeler une fois que les commandes ajoutées en externe ont été enregistrées dans le tampon de commandes ou le contexte.

Remarque : tous les états de l'QRhiCommandBuffer doivent être considérés comme invalides après l'appel de cette fonction. Les pipelines, les tampons de sommets et d'index, ainsi que les autres états, doivent être reconfigurés si d'autres appels de dessin sont enregistrés après les commandes externes.

Voir également beginExternal() et nativeHandles().

void QRhiCommandBuffer::endPass(QRhiResourceUpdateBatch *resourceUpdates = nullptr)

Enregistrements mettant fin au cycle de rendu en cours.

resourceUpdates, lorsqu'il n'est pas nul, spécifie un lot de mises à jour de ressources qui doit être validé puis libéré.

Voir également beginPass().

double QRhiCommandBuffer::lastCompletedGpuTime()

Renvoie le dernier horodatage disponible, en secondes, lorsque la fonctionnalité « QRhi::EnableTimestamps » était activée lors de la création de l'QRhi. Cette valeur indique le temps écoulé sur le GPU pendant la dernière image traitée.

Remarque : ne vous attendez pas à des résultats autres que 0 lorsque la fonctionnalité « QRhi::Timestamps » n’est pas signalée comme prise en charge, ou lorsque QRhi::EnableTimestamps n’a pas été transmis à QRhi::create(). Il existe toutefois des exceptions à cette règle, car certaines API graphiques (comme Metal) fournissent des informations de temps sans nécessiter d’opérations supplémentaires (requêtes de timestamp), mais les applications portables doivent toujours choisir délibérément d’activer la collecte de timestamps lorsqu’elles savent que cela est nécessaire, et appeler cette fonction en conséquence.

Il convient de faire preuve de prudence lors de l’interprétation de la valeur, car sa précision et sa granularité ne sont souvent pas contrôlées par Qt et dépendent de l’API graphique sous-jacente et de son implémentation. En particulier, la comparaison des valeurs entre différentes API graphiques et différents matériels est déconseillée et peut s’avérer dénuée de sens.

Les valeurs de temps seront probablement mises à disposition de manière asynchrone. La valeur renvoyée peut donc être 0 (par exemple, pour les 1 à 2 premières images) ou la dernière valeur connue se rapportant à une image précédente. La valeur peut également redevenir 0 dans certaines conditions, par exemple lors du redimensionnement de la fenêtre. On peut s’attendre à ce que la valeur la plus récente disponible soit récupérée dans `beginFrame()` et devienne accessible via cette fonction une fois que `beginFrame()` a renvoyé une valeur.

Remarque : ne partez pas du principe que la valeur se rapporte à l’image précédente (currently_recorded - 1). Elle peut également se rapporter à currently_recorded - 2 ou currently_recorded - 3. Le comportement exact peut dépendre de l’API graphique et de son implémentation.

Faites attention aux conséquences de la modulation de fréquence du GPU et des changements d’horloge du GPU, selon la plateforme. Par exemple, sous Windows, le temps de traitement renvoyé peut varier dans une fourchette assez large d’une image à l’autre avec des cartes graphiques modernes, même en soumettant des images avec une charge de travail similaire, voire identique. D’une manière générale, cela dépasse le champ d’action de Qt et ne relève pas de sa responsabilité. Cependant, le backend D3D12 appelle automatiquement la fonction ID3D12Device::SetStablePowerState() dès que la variable d’environnement QT_D3D_STABLE_POWER_STATE est définie sur une valeur non nulle. Cela peut considérablement stabiliser le résultat. Cela peut également avoir un effet non négligeable sur les temps mesurés côté CPU via QElapsedTimer par exemple, en particulier lorsque des images hors écran sont concernées.

Remarque : ne jamais déployer d’applications en production avec la variable QT_D3D_STABLE_POWER_STATE définie. Consultez la documentation de l’API Windows pour plus de détails.

Voir également QRhi::Timestamps et QRhi::EnableTimestamps.

const QRhiNativeHandles *QRhiCommandBuffer::nativeHandles()

Renvoie un pointeur vers une sous-classe de ` QRhiNativeHandles ` spécifique au backend, telle que ` QRhiVulkanCommandBufferNativeHandles`. La valeur renvoyée est ` nullptr ` lorsque l'exposition des ressources natives sous-jacentes n'est pas prise en charge par le backend ou ne s'applique pas à celui-ci.

Voir également QRhiVulkanCommandBufferNativeHandles, QRhiMetalCommandBufferNativeHandles, beginExternal() et endExternal().

[override virtual] QRhiResource::Type QRhiCommandBuffer::resourceType() const

Réimplémente : ` QRhiResource::resourceType()` const.

Renvoie le type de ressource.

void QRhiCommandBuffer::resourceUpdate(QRhiResourceUpdateBatch *resourceUpdates)

Il est parfois nécessaire, ou simplement plus pratique, de valider les mises à jour des ressources sans lancer de passe de rendu. L'appel de cette fonction avec ` resourceUpdates ` constitue une alternative au passage de ` resourceUpdates ` à un appel ` beginPass()` (ou ` endPass()`, ce qui serait courant dans le cas de relectures).

Remarque : ne peut pas être appelée à l’intérieur d’un passage.

void QRhiCommandBuffer::setBlendConstants(const QColor &c)

Enregistrements définissant les constantes de mélange actives sur c.

Cette fonction ne peut être appelée que lorsque le pipeline lié a une valeur définie pour « QRhiGraphicsPipeline::UsesBlendConstants ».

Remarque : cette fonction ne peut être appelée qu’au sein d’un passage de rendu, c’est-à-dire entre un appel à ` beginPass()` et un appel à ` endPass()`.

void QRhiCommandBuffer::setComputePipeline(QRhiComputePipeline *ps)

Enregistre la configuration d'un nouveau pipeline de calcul ps.

Remarque : cette fonction doit être appelée avant d'enregistrer les commandes setShaderResources() ou dispatch() dans le tampon de commandes.

Remarque : la fonction ` QRhi ` optimise automatiquement les appels superflus au sein d’un passage ; il n’est donc pas nécessaire, du côté de l’application, de procéder à une optimisation excessive pour éviter d’appeler cette fonction.

Remarque : cette fonction ne peut être appelée qu’au sein d’un passage de calcul, c’est-à-dire entre un appel à ` beginComputePass()` et un appel à ` endComputePass()`.

void QRhiCommandBuffer::setGraphicsPipeline(QRhiGraphicsPipeline *ps)

Enregistre une nouvelle ps du pipeline graphique.

Remarque : cette fonction doit être appelée avant d’enregistrer d’autres commandes set ou draw dans le tampon de commandes.

Remarque : la fonction ` QRhi ` optimise automatiquement les appels superflus au sein d’un passage ; il n’est donc pas nécessaire, du côté de l’application, de procéder à une optimisation excessive pour éviter d’appeler cette fonction.

Remarque : cette fonction ne peut être appelée qu’au sein d’un passage de rendu, c’est-à-dire entre un appel à ` beginPass()` et un appel à ` endPass()`.

Remarque : le nouveau pipeline graphique ps doit être un pointeur valide.

La définition d’un pipeline graphique ne comportant pas le drapeau UsesScissor désactivera le découpage, avec les API graphiques où cela est applicable, ou définira le rectangle de découpage pour qu’il corresponde à la dernière fenêtre de visualisation définie (avec les API graphiques où le découpage est en réalité toujours actif), afin de garantir un comportement uniforme sur tous les backends QRhi.

void QRhiCommandBuffer::setScissor(const QRhiScissor &scissor)

Enregistre le rectangle « ciseaux » actif spécifié dans scissor.

Cette fonction ne peut être appelée que lorsque le pipeline lié a le drapeau « UsesScissor » activé. Lorsque ce drapeau est activé sur le pipeline actif, cette fonction doit être appelée car le test de recadrage sera activé et un rectangle de recadrage doit donc être fourni.

Remarque : QRhi utilise des coordonnées de fenêtre de visualisation de type OpenGL, ce qui signifie que les axes x et y sont centrés en bas à gauche.

Remarque : cette fonction ne peut être appelée qu’au sein d’un passage de rendu, c’est-à-dire entre un appel à ` beginPass()` et un appel à ` endPass()`.

void QRhiCommandBuffer::setShaderResources(QRhiShaderResourceBindings *srb = nullptr, int dynamicOffsetCount = 0, const QRhiCommandBuffer::DynamicOffset *dynamicOffsets = nullptr)

Enregistrements associant un ensemble de ressources de shader, telles que des tampons uniformes ou des textures, qui sont rendues visibles à un ou plusieurs étages de shader.

srb Peut être nul, auquel cas l’ QRhiShaderResourceBindings associé au pipeline graphique ou de calcul actuel est utilisé. Lorsque srb n’est pas nul, il doit être de type layout-compatible, ce qui signifie que la configuration (nombre de liaisons, type et numéro de liaison de chacune d’entre elles) doit correspondre exactement à l’ QRhiShaderResourceBindings qui était associé au pipeline au moment de l’appel de la fonction create() de ce dernier.

Dans certains cas, un appel à `setShaderResources()` apparemment superflu est obligatoire : lors de la reconstruction d’une ressource référencée depuis ` srb`, par exemple lors d’une modification de la taille d’un ` QRhiBuffer ` suivie d’un appel à ` QRhiBuffer::create()`, c’est à ce moment-là que les objets natifs associés (tels que les ensembles de descripteurs dans le cas de Vulkan) sont mis à jour pour faire référence aux ressources natives actuelles qui sous-tendent les objets QRhiBuffer, QRhiTexture, QRhiSampler référencés depuis srb. Dans ce cas, setShaderResources() doit être appelé même si srb est identique à celui du dernier appel.

Lorsque ` srb ` n’est pas nul, il est garanti que l’objet ` QRhiShaderResourceBindings ` utilisé pour construire le pipeline dans `create()` ne sera en aucun cas accédé. En effet, il n’est même pas nécessaire qu’il soit valide à ce stade : il est tout à fait valable de détruire le `srb` associé au pipeline après `create()` et d’en spécifier explicitement un autre, ` layout compatible `, à chaque appel à `setShaderResources()`.

dynamicOffsets Permet de spécifier des décalages de tampon pour les tampons uniformes qui ont été associés à srb via QRhiShaderResourceBinding::uniformBufferWithDynamicOffset(). Cela diffère de la fourniture du décalage dans l’ srb lui-même : les décalages dynamiques ne nécessitent pas la création d’une nouvelle QRhiShaderResourceBindings pour chaque décalage différent, peuvent éviter l’écriture des descripteurs sous-jacents (avec les backends où cela s’applique), et peuvent donc s’avérer plus efficaces. Chaque élément de ` dynamicOffsets ` est une paire ` binding ` - ` offset `. ` dynamicOffsetCount ` spécifie le nombre d’éléments dans ` dynamicOffsets`.

Remarque : tous les décalages dans dynamicOffsets doivent être alignés sur l’octet correspondant à la valeur renvoyée par QRhi::ubufAlignment().

Remarque : certains backends peuvent limiter le nombre de décalages dynamiques pris en charge. Évitez d’utiliser une valeur dynamicOffsetCount supérieure à 8.

Remarque : la fonctionQRhi optimise en supprimant les appels inutiles au sein d’un passage (en tenant compte des conditions décrites ci-dessus) ; il n’est donc pas nécessaire, du côté de l’application, de procéder à une optimisation excessive pour éviter les appels à cette fonction.

Remarque : cette fonction ne peut être appelée qu’au sein d’une passe de rendu ou de calcul, c’est-à-dire entre un ` beginPass()` et un ` endPass()`, ou entre un ` beginComputePass()` et un ` endComputePass()`.

[since 6.9] void QRhiCommandBuffer::setShadingRate(const QSize &coarsePixelSize)

Définit le taux d'ombrage pour les appels de dessin suivants à coarsePixelSize.

La valeur par défaut est 1x1.

Ne fonctionne que lorsque la fonctionnalité « QRhi::VariableRateShading » est signalée comme prise en charge et que les QRhiGraphicsPipeline s liées au tampon de commande ont été déclarées « QRhiGraphicsPipeline::UsesShadingRate » lors de leur création.

Appelez la fonction ` QRhi::supportedShadingRates()` pour vérifier quels taux d’ombrage sont pris en charge pour un nombre d’échantillons donné.

Lorsque la fonction ` QRhiShadingRateMap ` et cette fonction sont toutes deux utilisées, 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.

Cette fonction a été introduite dans Qt 6.9.

void QRhiCommandBuffer::setStencilRef(quint32 refValue)

Enregistrements définissant la valeur de référence active du pochoir sur refValue.

Cette fonction ne peut être appelée que lorsque le pipeline lié a la valeur « QRhiGraphicsPipeline::UsesStencilRef » définie.

Remarque : cette fonction ne peut être appelée qu’au sein d’un passage de rendu, c’est-à-dire entre un appel à ` beginPass()` et un appel à ` endPass()`.

void QRhiCommandBuffer::setVertexInput(int startBinding, int bindingCount, const QRhiCommandBuffer::VertexInput *bindings, QRhiBuffer *indexBuf = nullptr, quint32 indexOffset = 0, QRhiCommandBuffer::IndexFormat indexFormat = IndexUInt16)

Enregistre les liaisons d'entrée des sommets.

Le tampon d’index utilisé par les commandes drawIndexed() suivantes est spécifié par indexBuf, indexOffset et indexFormat. indexBuf peut être défini sur null lorsque le dessin indexé n’est pas nécessaire.

Les liaisons de tampons de sommets sont regroupées par lots. startBinding spécifie le numéro de la première liaison. La commande enregistrée lie alors chaque tampon de bindings au point de liaison startBinding + i, où i est l’index dans bindings. Chaque élément de bindings spécifie une QRhiBuffer et un décalage.

Remarque : certains backends peuvent limiter le nombre de liaisons de tampons de sommets. Évitez d’utiliser un bindingCount supérieur à 8.

Les modifications superflues des entrées de sommets et des index au sein d’un même passage sont automatiquement ignorées par la plupart des backends ; les applications n’ont donc pas besoin de recourir à une optimisation excessive pour éviter les appels à cette fonction.

Remarque : cette fonction ne peut être appelée qu’au sein d’un passage de rendu, c’est-à-dire entre un appel à ` beginPass()` et un appel à ` endPass()`.

Prenons un exemple simple : un shader de sommet avec deux entrées :

layout(location = 0) in vec4 position;
layout(location = 1) in vec3 color;

et supposons que les données soient disponibles au format entrelacé, en utilisant seulement 2 flottants pour la position (soit 5 flottants par sommet : x, y, r, g, b). Un QRhiGraphicsPipeline pour ce shader peut alors être créé en utilisant la disposition d’entrée suivante :

QRhiVertexInputLayout inputLayout;
inputLayout.setBindings({
    { 5 * sizeof(float) }
});
inputLayout.setAttributes({
    { 0, 0, QRhiVertexInputAttribute::Float2, 0 },
    { 0, 1, QRhiVertexInputAttribute::Float3, 2 * sizeof(float) }
});

Il y a ici une liaison de tampon (numéro de liaison 0), à laquelle deux entrées font référence. Lors de l’enregistrement de la passe, une fois le pipeline configuré, les liaisons de sommets peuvent être spécifiées simplement comme suit, en supposant que `vbuf` soit l’ QRhiBuffer contenant toutes les données entrelacées de position et de couleur :

const QRhiCommandBuffer::VertexInput vbufBinding(vbuf, 0);
cb->setVertexInput(0, 1, &vbufBinding);

void QRhiCommandBuffer::setViewport(const QRhiViewport &viewport)

Enregistre le rectangle de la fenêtre d'affichage active spécifié dans viewport.

Avec les backends dont l’API graphique sous-jacente a le « scissoring » toujours activé, cette fonction définit également le « scissor » pour qu’il corresponde à la fenêtre d’affichage chaque fois que l’ QRhiGraphicsPipeline active n’a pas de paramètre « UsesScissor » défini.

Remarque : ` QRhi ` utilise les coordonnées de la fenêtre d’affichage au format OpenGL, c’est-à-dire que les axes x et y sont centrés en bas à gauche.

Remarque : cette fonction ne peut être appelée qu’au sein d’un passage de rendu, c’est-à-dire entre un appel à ` beginPass()` et un appel à ` endPass()`.

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