Sur cette page

QRhiCommandBuffer Class

Ressource de tampon de commande. 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 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)
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

Pour l'instant, il n'est pas possible de créer des applications. Les seules façons d'obtenir un QRhiCommandBuffer valide sont de l'obtenir à partir de la chaîne d'échange ciblée via QRhiSwapChain::currentFrameCommandBuffer(), ou, dans le cas d'un rendu complètement hors écran, d'en initialiser un via QRhi::beginOffscreenFrame().

Remarque : il s'agit d'une API RHI avec des garanties de compatibilité limitées, voir QRhi pour plus de détails.

Documentation des types de membres

enum QRhiCommandBuffer::BeginPassFlag
flags QRhiCommandBuffer::BeginPassFlags

Valeurs des drapeaux pour QRhi::beginPass()

ConstanteValeurDescription
QRhiCommandBuffer::ExternalContent0x01Spécifie qu'il y aura un appel à QRhiCommandBuffer::beginExternal() dans cette passe. Certains backends, Vulkan en particulier, échoueront si ce drapeau n'est pas défini et que beginExternal() est toujours appelé.
QRhiCommandBuffer::DoNotTrackResourcesForCompute0x02Spécifie qu'il n'est pas nécessaire de suivre les ressources utilisées dans cette passe si le seul but de ce suivi est de générer des barrières pour le calcul. Implique qu'il n'y a pas de passes de calcul dans la trame. Il s'agit d'un indice d'optimisation qui peut être pris en compte par certains backends, OpenGL en particulier, leur permettant de sauter certaines opérations. Lorsque ce drapeau est défini pour une passe de rendu dans une image, appeler beginComputePass() dans cette image peut conduire à un comportement inattendu, en fonction des dépendances de ressources entre les passes de rendu et de calcul.

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

[alias] QRhiCommandBuffer::DynamicOffset

Synonyme de std::pair<int, quint32>. La première entrée est la liaison, la seconde est le décalage dans le tampon.

enum QRhiCommandBuffer::IndexFormat

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

ConstanteValeurDescription de la constante
QRhiCommandBuffer::IndexUInt160Non signé 16 bits (quint16)
QRhiCommandBuffer::IndexUInt321Non signé 32 bits (quint32)

[alias] QRhiCommandBuffer::VertexInput

Synonyme de std::pair<QRhiBuffer *, quint32>. La deuxième entrée est un décalage dans le tampon spécifié par la première.

Documentation des fonctions membres

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

Enregistrements démarrant une nouvelle passe de calcul.

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

Remarque : il ne faut pas supposer que les liaisons d'état ou de ressources persistent d'une passe à l'autre.

Remarque : une passe 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 passes de rendu et de calcul.

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

flags n'est pas utilisé actuellement.

void QRhiCommandBuffer::beginExternal()

À appeler lorsque l'application avant l'application est sur le point de mettre en file d'attente des commandes dans le tampon de commande de la passe actuelle en appelant directement les fonctions de l'API graphique.

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

Avec Vulkan, Metal ou Direct3D 12, il est possible d'interroger le tampon de commande natif ou les objets d'encodage via nativeHandles() et de leur envoyer des commandes enqueue. Avec OpenGL ou Direct3D 11, le contexte (du périphérique) peut être récupéré à partir de QRhi::nativeHandles(). Cependant, cela ne doit jamais être fait sans s'assurer que l'état de QRhiCommandBuffer's reste à jour. D'où la nécessité d'envelopper tout enregistrement de commande ajouté de l'extérieur entre beginExternal() et endExternal(). D'un point de vue conceptuel, il s'agit de la même chose que les fonctions beginNativePainting() et endNativePainting() de QPainter.

Pour OpenGL en particulier, cette fonction a une tâche supplémentaire : elle s'assure que le contexte est mis à jour sur le thread courant.

Note : Une fois que beginExternal() est appelée, aucune autre fonction spécifique à la passe de rendu (set* ou draw*) ne doit être appelée sur QRhiCommandBuffer jusqu'à endExternal().

Attention : Certains backends peuvent renvoyer un objet de tampon de commande natif à partir de QRhiCommandBuffer::nativeHandles() qui est différent de l'objet principal lorsqu'il se trouve à l'intérieur d'un bloc beginExternal() - endExternal(). Il est donc important de (re)demander l'objet tampon de commande natif après avoir appelé beginExternal(). En pratique, cela signifie qu'avec Vulkan par exemple, les commandes Vulkan enregistrées en externe sont placées dans un tampon de commande secondaire (avec VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT). nativeHandles() renvoie ce tampon de commande secondaire lorsqu'il est appelé entre begin/endExternal.

Voir également endExternal() et nativeHandles().

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

Enregistrements démarrant une nouvelle passe de rendu ciblant la cible de rendu rt.

resourceUpdatessi elle n'est pas nulle, spécifie un lot de mise à jour de ressources qui doit être engagé 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 existe une exception lorsque la cible de rendu a été créée avec QRhiTextureRenderTarget::PreserveColorContents et/ou QRhiTextureRenderTarget::PreserveDepthStencilContents. Les valeurs d'effacement sont alors ignorées.

Remarque : l'activation des contenus de couleur ou de profondeur préservés 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 qu'il n'est pas nécessaire de recharger le contenu précédent dans le tampon de la mosaïque. De même, une page QRhiTextureRenderTarget avec une page QRhiTexture comme tampon de profondeur est moins efficace qu'une page QRhiRenderBuffer, car l'utilisation d'une texture de profondeur nécessite l'écriture des données dans celle-ci, alors qu'avec les tampons de rendu, cela n'est pas nécessaire (car l'API ne permet pas d'échantillonner ou de lire à partir d'un tampon de rendu).

Remarque : ne supposez pas que les liaisons d'état ou de ressources persistent entre les passes.

Remarque : les fonctions set et draw de QRhiCommandBuffer ne peuvent être appelées qu'à l'intérieur d'une passe. De plus, à l'exception de setGraphicsPipeline(), elles s'attendent à ce qu'un jeu de pipeline soit déjà présent dans le tampon de commande. Des problèmes non spécifiés peuvent survenir dans le cas contraire, en fonction du backend.

Si rt est un QRhiTextureRenderTarget, beginPass() vérifie que les objets texture et renderbuffer référencés par la cible de rendu sont à jour. Ceci est similaire à ce que fait setShaderResources() pour QRhiShaderResourceBindings. Si l'une des pièces jointes a été reconstruite depuis QRhiTextureRenderTarget::create(), un appel implicite à create() est effectué sur rt. Par conséquent, si rt a une pièce jointe de couleur QRhiTexture texture , et que l'on a besoin de donner une taille différente à la texture, la procédure suivante est alors valable :

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 permettent de contrôler certaines fonctionnalités avancées. Un drapeau couramment utilisé est ExternalContents. Il doit être spécifié chaque fois que beginExternal() sera appelé dans la passe lancée par cette fonction.

Voir aussi endPass() et BeginPassFlags.

void QRhiCommandBuffer::debugMarkBegin(const QByteArray &name)

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

Remarque : cette fonction est ignorée lorsque QRhi::DebugMarkers n'est pas pris en charge ou que QRhi::EnableDebugMarkers n'est pas défini.

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

void QRhiCommandBuffer::debugMarkEnd()

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

Remarque : cette fonction est ignorée lorsque QRhi::DebugMarkers n'est pas pris en charge ou que QRhi::EnableDebugMarkers n'est pas défini.

Note : Peut être appelé n'importe où dans le cadre, à la fois à l'intérieur et à l'extérieur des passes.

void QRhiCommandBuffer::debugMarkMsg(const QByteArray &msg)

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

Note : Ignoré lorsque QRhi::DebugMarkers n'est pas supporté ou que QRhi::EnableDebugMarkers n'est pas défini.

Note : Avec certains backends, debugMarkMsg() n'est supporté qu'à l'intérieur d'une passe et est ignoré lorsqu'il est appelé en dehors d'une passe. Avec d'autres, il est enregistré n'importe où dans la trame.

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

Enregistrements distribuant des éléments de travail de calcul, avec x, y, et z spécifiant le nombre de groupes de travail locaux dans la dimension correspondante.

Remarque : cette fonction ne peut être appelée qu'à l'intérieur d'une passe de calcul, c'est-à-dire entre un appel à beginComputePass() et à endComputePass().

Remarque : x, y, et z doivent respecter les limites de l'implémentation de l'API graphique sous-jacente au moment de l'exécution. Les valeurs maximales sont généralement de 65535.

Remarque : faites attention aux limites éventuelles de 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 1024, alors qu'avec OpenGL ES (3.1), la valeur peut être aussi basse que 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 dessin non indexé.

Le nombre de sommets est spécifié dans vertexCount. Pour un dessin instancié, définissez instanceCount à une valeur différente de 1. firstVertex est l'index du premier sommet à dessiner. Lorsque plusieurs instances sont dessinées, le premier identifiant d'instance est spécifié par firstInstance.

Remarque : firstInstance peut ne pas être pris en charge et est ignoré lorsque la fonction QRhi::BaseInstance est signalée comme n'étant pas prise en charge. L'ID de la première instance est toujours 0 dans ce cas. QRhi::BaseInstance n'est jamais supporté par OpenGL pour le moment, principalement à cause des limitations d'OpenGL ES, et donc les applications portables ne devraient pas être conçues pour s'appuyer sur cet argument.

Note : Les shaders qui ont besoin d'accéder à l'index du vertex ou de l'instance en cours 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'inclura pas la valeur de base avec certaines des API 3D sous-jacentes. Ceci est indiqué par la fonctionnalité QRhi::InstanceIndexIncludesBaseInstance. S'il n'est pas possible de s'appuyer sur une valeur d'instance de base, il est conseillé aux applications de transmettre la valeur en tant que condition uniforme basée sur ce que cette fonctionnalité signale, et de l'ajouter à gl_InstanceIndex dans le nuage de points.

Remarque : cette fonction ne peut être appelée qu'à l'intérieur d'une passe de rendu, c'est-à-dire entre un appel à beginPass() et à endPass().

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

Enregistre un dessin indexé.

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

Note : 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 n'étant pas 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 valeur n'est pas toujours prise en charge et est ignorée lorsque la fonctionnalité QRhi::BaseVertex est signalée comme non prise en charge.

Pour le dessin d'instances, définissez instanceCount à une valeur autre que 1. Lorsque vous dessinez plusieurs instances, le premier identifiant d'instance est spécifié par firstInstance.

Remarque : firstInstance peut ne pas être pris en charge et est ignoré lorsque la caractéristique QRhi::BaseInstance est signalée comme n'étant pas prise en charge. L'ID de la première instance est toujours 0 dans ce cas. QRhi::BaseInstance n'est jamais supporté par OpenGL pour le moment, principalement à cause des limitations d'OpenGL ES, et donc les applications portables ne devraient pas être conçues pour s'appuyer sur cet argument.

Note : Les shaders qui ont besoin d'accéder à l'index du vertex ou de l'instance en cours 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'inclura pas la valeur de base avec certaines des API 3D sous-jacentes. Ceci est indiqué par la fonctionnalité QRhi::InstanceIndexIncludesBaseInstance. S'il n'est pas possible de s'appuyer sur une valeur d'instance de base, il est conseillé aux applications de transmettre la valeur en tant que condition uniforme basée sur ce que cette fonctionnalité signale, et de l'ajouter à gl_InstanceIndex dans le nuage de points.

Remarque : cette fonction ne peut être appelée qu'à l'intérieur d'une passe de rendu, c'est-à-dire entre un appel à beginPass() et à endPass().

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

Enregistrements terminant la passe de calcul en cours.

resourceUpdatesSi elle n'est pas nulle, spécifie un lot de mise à jour de ressources qui doit être validé et ensuite libéré.

void QRhiCommandBuffer::endExternal()

À appeler une fois que les commandes ajoutées de l'extérieur sont enregistrées dans le tampon de commande ou le contexte.

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

Voir aussi beginExternal() et nativeHandles().

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

Enregistrements terminant la passe de rendu en cours.

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

Voir aussi beginPass().

double QRhiCommandBuffer::lastCompletedGpuTime()

Renvoie le dernier horodatage disponible, en secondes, lorsque QRhi::EnableTimestamps a été activé lors de la création de QRhi. La valeur indique le temps écoulé sur le GPU lors de la dernière image terminée.

Remarque : ne vous attendez pas à des résultats différents de 0 lorsque la fonctionnalité QRhi::Timestamps n'est pas signalée comme étant prise en charge ou lorsque QRhi::EnableTimestamps n'a pas été transmis à QRhi::create(). Il existe des exceptions à cette règle, car certaines API graphiques (Metal) permettent d'obtenir des données temporelles sans avoir à effectuer d'opérations supplémentaires (requêtes d'horodatage), mais les applications portables doivent toujours opter consciemment pour la collecte d'horodatage lorsqu'elles savent qu'elle est nécessaire, et appeler cette fonction en conséquence.

Il faut faire attention à 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 être dénuée de sens.

Lorsque l'image a été enregistrée avec beginFrame() et endFrame(), c'est-à-dire avec une chaîne d'échange, les valeurs de synchronisation seront probablement disponibles 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 référant à une image précédente. La valeur peut également redevenir 0 dans certaines conditions, par exemple en cas de redimensionnement de la fenêtre. On peut s'attendre à ce que la valeur disponible la plus récente soit récupérée dans beginFrame() et devienne interrogeable via cette fonction une fois que beginFrame() est retournée.

Remarque : ne supposez pas que la valeur se réfère à la trame précédente (currently_recorded - 1). Elle peut également se référer à currently_recorded - 2 ou currently_recorded - 3. Le comportement exact peut dépendre de l'API graphique et de son implémentation.

D'autre part, avec les images hors écran, la valeur renvoyée est à jour une fois que endOffscreenFrame() est renvoyé, parce que les images hors écran réduisent le pipelining du GPU et attendent que les commandes soient terminées.

Note : Cela signifie que, contrairement aux trames swapchain, avec les trames offscreen, la valeur renvoyée est garantie de faire référence à la trame qui vient d'être soumise et complétée. (en supposant que cette fonction soit appelée après endOffscreenFrame() mais avant le prochain beginOffscreenFrame()).

Attention aux conséquences de la mise à l'échelle de la fréquence du GPU et des changements d'horloge du GPU, en fonction de la plateforme. Par exemple, sous Windows, la durée renvoyée peut varier dans une fourchette assez large entre les images avec des cartes graphiques modernes, même si l'on soumet des images avec une charge de travail similaire ou identique. Qt n'est pas en mesure de contrôler et de résoudre ce problème, d'une manière générale. Cependant, le backend D3D12 appelle automatiquement ID3D12Device::SetStablePowerState() chaque fois que la variable d'environnement QT_D3D_STABLE_POWER_STATE est réglée sur une valeur non nulle. Cela peut grandement stabiliser le résultat. Cela peut également avoir un effet non significatif sur les temps mesurés côté CPU via QElapsedTimer par exemple, en particulier lorsque des images hors écran sont impliquées.

Note : Ne pas et ne jamais livrer des applications en production avec QT_D3D_STABLE_POWER_STATE. Voir 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 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 n'est pas applicable à celui-ci.

Voir aussi 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 d'effectuer des mises à jour de ressources sans lancer une passe de rendu. L'appel à cette fonction avec resourceUpdates est une alternative à la transmission de resourceUpdates à un appel à beginPass() (ou endPass(), ce qui serait typique dans le cas de retours en arrière).

Note : Cette fonction ne peut pas être appelée à l'intérieur d'une passe.

void QRhiCommandBuffer::setBlendConstants(const QColor &c)

Enregistre le réglage des constantes de mélange actives sur c.

Cette fonction ne peut être appelée que lorsque le pipeline lié a été défini sur QRhiGraphicsPipeline::UsesBlendConstants.

Remarque : cette fonction ne peut être appelée qu'à l'intérieur d'une passe de rendu, c'est-à-dire entre un appel à beginPass() et à endPass().

void QRhiCommandBuffer::setComputePipeline(QRhiComputePipeline *ps)

Enregistre la mise en place 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 commande.

Remarque : QRhi optimisera les invocations inutiles au sein d'une passe, de sorte qu'une suroptimisation pour éviter les appels à cette fonction n'est pas nécessaire du côté de l'application.

Note : Cette fonction ne peut être appelée qu'à l'intérieur d'une passe de calcul, c'est-à-dire entre un appel à beginComputePass() et endComputePass().

void QRhiCommandBuffer::setGraphicsPipeline(QRhiGraphicsPipeline *ps)

Enregistre la configuration d'un nouveau pipeline graphique ps.

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

Note : QRhi optimisera les invocations inutiles au sein d'une passe, il n'est donc pas nécessaire de sur-optimiser pour éviter les appels à cette fonction du côté de l'application.

Remarque : Cette fonction ne peut être appelée qu'à l'intérieur d'une passe de rendu, c'est-à-dire entre un appel à beginPass() et endPass().

Note : Le nouveau pipeline graphique ps doit être un pointeur valide.

void QRhiCommandBuffer::setScissor(const QRhiScissor &scissor)

Enregistre la définition du rectangle de ciseaux actif spécifié à l'adresse scissor.

Cette fonction ne peut être appelée que lorsque la canalisation liée a été définie à l'adresse UsesScissor. Lorsque le drapeau est activé sur le pipeline actif, cette fonction doit être appelée parce que les tests de ciseaux seront activés et qu'un rectangle de ciseaux doit être fourni.

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

Note : Cette fonction ne peut être appelée qu'à l'intérieur d'une passe de rendu, c'est-à-dire entre un appel à beginPass() et endPass().

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

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

srb peut être nul, auquel cas le pipeline graphique ou de calcul associé à QRhiShaderResourceBindings est utilisé. Lorsque srb n'est pas nul, il doit s'agir de layout-compatible, ce qui signifie que la disposition (nombre de liaisons, type et numéro de liaison de chaque liaison) doit correspondre entièrement à QRhiShaderResourceBindings qui était associé au pipeline au moment de l'appel à la fonction create() du pipeline.

Dans certains cas, l'appel à setShaderResources(), apparemment inutile, est obligatoire : lors de la reconstruction d'une ressource référencée à partir de srb, par exemple en modifiant la taille d'un QRhiBuffer suivi d'un QRhiBuffer::create(), c'est l'endroit où 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 soutiennent les objets QRhiBuffer, QRhiTexture, QRhiSampler référencés à partir de srb. Dans ce cas, setShaderResources() doit être appelé même si srb est le même que lors du dernier appel.

Lorsque srb n'est pas nul, l'objet QRhiShaderResourceBindings avec lequel le pipeline a été construit dans create() est garanti de ne pas être accédé sous quelque forme que ce soit. En fait, il n'a pas besoin d'être valide même à ce stade : détruire le srb associé au pipeline après create() et à la place en spécifier explicitement un autre, layout compatible dans chaque appel à setShaderResources() est valide.

dynamicOffsets permet de spécifier les décalages de tampons pour les tampons uniformes qui ont été associés à srb via QRhiShaderResourceBinding::uniformBufferWithDynamicOffset(). C'est différent de fournir le décalage dans srb lui-même : les décalages dynamiques ne nécessitent pas la construction d'un nouveau QRhiShaderResourceBindings pour chaque décalage différent, peuvent éviter d'écrire les descripteurs sous-jacents (avec les backends le cas échéant), et donc ils peuvent être 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 la valeur renvoyée par QRhi::ubufAlignment().

Note : Certains backends peuvent limiter le nombre de décalages dynamiques supportés. Évitez d'utiliser un dynamicOffsetCount supérieur à 8.

Remarque : QRhi optimisera les invocations inutiles au cours d'une passe (en tenant compte des conditions décrites ci-dessus), de sorte qu'il n'est pas nécessaire de suroptimiser pour éviter les appels à cette fonction du côté des applications.

Note : Cette fonction ne peut être appelée qu'à l'intérieur d'une passe de rendu ou de calcul, c'est-à-dire entre beginPass() et endPass(), ou beginComputePass() et 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.

Fonctionnel uniquement lorsque la fonctionnalité QRhi::VariableRateShading est signalée comme étant prise en charge et que le(s) QRhiGraphicsPipeline(s) lié(s) au tampon de commande déclarait(ent) QRhiGraphicsPipeline::UsesShadingRate lors de sa(leur) création.

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

Lorsqu'une fonction QRhiShadingRateMap et cette fonction sont toutes deux utilisées, le taux d'ombrage le plus élevé des deux est utilisé pour chaque tuile. Il n'existe actuellement aucun contrôle sur le comportement du combinateur.

Cette fonction a été introduite dans Qt 6.9.

void QRhiCommandBuffer::setStencilRef(quint32 refValue)

Enregistrements fixant la valeur de référence du pochoir actif à refValue.

Cette fonction ne peut être appelée que lorsque le pipeline lié a été défini à QRhiGraphicsPipeline::UsesStencilRef.

Remarque : cette fonction ne peut être appelée qu'à l'intérieur d'une passe de rendu, c'est-à-dire entre un appel à beginPass() et à 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 vertex.

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

Les liaisons de tampons de sommets sont groupées. startBinding spécifie le premier numéro de liaison. La commande enregistrée lie ensuite chaque tampon à partir de bindings au point de liaison startBinding + ii est l'index dans bindings. Chaque élément de bindings spécifie un 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 entrées de sommets superflues et les changements d'index dans la même passe sont automatiquement ignorés par la plupart des backends et les applications n'ont donc pas besoin de sur-optimiser pour éviter les appels à cette fonction.

Remarque : cette fonction ne peut être appelée qu'à l'intérieur d'une passe de rendu, c'est-à-dire entre un appel à beginPass() et endPass().

Prenons un exemple simple : un vertex shader avec deux entrées :

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

et supposons que nous disposons des données dans un format entrelacé, en utilisant seulement 2 flottants pour la position (donc 5 flottants par vertex : x, y, r, g, b). Un QRhiGraphicsPipeline pour ce shader peut alors être créé en utilisant le layout d'entrée :

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

Ici, il y a une liaison de tampon (liaison numéro 0), avec deux entrées qui y font référence. Lors de l'enregistrement de la passe, une fois que le pipeline est défini, les fixations de vertex peuvent être spécifiées simplement comme suit, en supposant que vbuf est le QRhiBuffer avec toutes les données de position+couleur entrelacées :

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

void QRhiCommandBuffer::setViewport(const QRhiViewport &viewport)

Enregistrements définissant le rectangle de la fenêtre active spécifié dans viewport.

Avec les backends où l'API graphique sous-jacente a toujours activé le scissoring, cette fonction définit également le scissor pour qu'il corresponde au viewport lorsque le QRhiGraphicsPipeline actif n'a pas UsesScissor de défini.

Remarque : QRhi suppose des coordonnées d'affichage de type OpenGL, ce qui signifie que x et y sont en bas à gauche.

Note : Cette fonction ne peut être appelée qu'à l'intérieur d'une passe de rendu, c'est-à-dire entre un appel à beginPass() et 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.