QRhiResourceUpdateBatch Class
Opérations de téléchargement et de copie d'enregistrements. 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 |
Fonctions publiques
| void | copyTexture(QRhiTexture *dst, QRhiTexture *src, const QRhiTextureCopyDescription &desc = QRhiTextureCopyDescription()) |
| void | generateMips(QRhiTexture *tex) |
| bool | hasOptimalCapacity() const |
| void | merge(QRhiResourceUpdateBatch *other) |
| void | readBackBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, QRhiReadbackResult *result) |
| void | readBackTexture(const QRhiReadbackDescription &rb, QRhiReadbackResult *result) |
| void | release() |
| void | updateDynamicBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data) |
(since 6.10) void | updateDynamicBuffer(QRhiBuffer *buf, quint32 offset, QByteArray data) |
| void | uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data) |
(since 6.10) void | uploadStaticBuffer(QRhiBuffer *buf, QByteArray data) |
| void | uploadStaticBuffer(QRhiBuffer *buf, const void *data) |
(since 6.10) void | uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, QByteArray data) |
| void | uploadTexture(QRhiTexture *tex, const QImage &image) |
| void | uploadTexture(QRhiTexture *tex, const QRhiTextureUploadDescription &desc) |
Description détaillée
Avec l'QRhi, il n'est plus possible d'effectuer des opérations de type copie à tout moment. À la place, toutes ces opérations sont enregistrées dans des lots qui sont ensuite transmis, le plus souvent, à la fonction ` QRhiCommandBuffer::beginPass()`. Ce qui se passe ensuite en arrière-plan est masqué à l'application : les implémentations sous-jacentes peuvent différer et mettre en œuvre ces opérations de différentes manières.
Un lot de mise à jour des ressources ne possède aucune ressource graphique et n’effectue aucune opération concrète de lui-même. Il doit plutôt être considéré comme un tampon de commandes pour les commandes de type mise à jour, téléchargement et copie.
Pour obtenir un lot disponible et vide du pool, appelez la fonction ` QRhi::nextResourceUpdateBatch()`.
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 des fonctions membres
void QRhiResourceUpdateBatch::copyTexture(QRhiTexture *dst, QRhiTexture *src, const QRhiTextureCopyDescription &desc = QRhiTextureCopyDescription())
Met en file d'attente une opération de copie de texture vers texture depuis src vers dst, comme décrit à l'adresse desc.
Remarque : la texture source src doit avoir été créée à l’aide de QRhiTexture::UsedAsTransferSource.
Remarque : le format des textures doit correspondre. Avec la plupart des API graphiques, les données sont copiées telles quelles, sans aucune conversion de format. Si dst et src sont créées avec des formats différents, des problèmes non spécifiés peuvent survenir.
void QRhiResourceUpdateBatch::generateMips(QRhiTexture *tex)
Met en file d'attente une opération de génération de mipmaps pour la texture spécifiée tex.
Les textures 2D et cubiques sont prises en charge. Les textures 1D et 3D sont prises en charge lorsque la fonctionnalité QRhi::OneDimensionalTextureMipmaps ou QRhi::ThreeDimensionalTextureMipmaps est signalée comme prise en charge, respectivement.
Remarque : la texture doit être créée à l’aide de QRhiTexture::MipMapped et QRhiTexture::UsedWithGenerateMips.
Avertissement : la fonction ` QRhi ` ne peut pas garantir que des mipmaps puissent être générées pour tous les formats de texture pris en charge. Par exemple, ` QRhiTexture::RGBA32F ` n’est pas un format « filterable » dans OpenGL ES 3.0 et Metal sur iOS ; par conséquent, la demande de génération de mipmaps peut échouer. Les formats RGBA8 et RGBA16F sont généralement filtrables ; il est donc recommandé de les utiliser lorsque la génération de mipmaps est souhaitée.
bool QRhiResourceUpdateBatch::hasOptimalCapacity() const
Renvoie « true » tant que le nombre d'opérations sur les tampons et les textures mises en file d'attente dans ce lot reste inférieur à une limite raisonnable.
La valeur de retour est « false » lorsque le nombre d’opérations sur les tampons et/ou les textures ajoutées à ce lot a atteint, ou est sur le point d’atteindre, une certaine limite. Le lot reste pleinement fonctionnel par la suite, mais peut nécessiter l’allocation de mémoire supplémentaire. Par conséquent, un moteur de rendu qui regroupe un grand nombre de mises à jour de tampons et de textures dans un seul lot lors de la préparation d’une image peut envisager d’appeler ` submitting the batch ` et ` starting a new one ` lorsque cette fonction renvoie `false`.
void QRhiResourceUpdateBatch::merge(QRhiResourceUpdateBatch *other)
Copie toutes les opérations en file d’attente du lot « other » vers celui-ci.
Remarque : le lot « other » peut ne plus contenir de données valides après l’opération de fusion et ne doit pas être soumis, mais il devra tout de même être libéré en appelant la fonction release().
Cela permet de mettre en place un schéma pratique où les mises à jour de ressources déjà connues lors de l’étape d’initialisation sont regroupées dans un lot qui est ensuite fusionné avec un autre lors du lancement du premier passage de rendu ultérieurement :
void init()
{
initialUpdates = rhi->nextResourceUpdateBatch();
initialUpdates->uploadStaticBuffer(vbuf, vertexData);
initialUpdates->uploadStaticBuffer(ibuf, indexData);
// ...
}
void render()
{
QRhiResourceUpdateBatch *resUpdates = rhi->nextResourceUpdateBatch();
if (initialUpdates) {
resUpdates->merge(initialUpdates);
initialUpdates->release();
initialUpdates = nullptr;
}
// resUpdates->updateDynamicBuffer(...);
cb->beginPass(rt, clearCol, clearDs, resUpdates);
}void QRhiResourceUpdateBatch::readBackBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, QRhiReadbackResult *result)
Met en file d'attente la relecture d'une région de l'QRhiBuffer buf . La taille de la région est spécifiée par size en octets, offset correspond au décalage en octets à partir duquel la lecture doit commencer.
La relecture est asynchrone. result contient un callback qui est appelé lorsque l’opération est terminée. Les données sont fournies dans QRhiReadbackResult::data. En cas de réussite, QByteArray aura une taille égale à size. En cas d’échec, QByteArray sera vide.
Remarque : la lecture de tampons selon une utilisation différente de celle décrite à l'adresse QRhiBuffer::UniformBuffer n’est prise en charge que lorsque la fonctionnalité QRhi::ReadBackNonUniformBuffer est signalée comme prise en charge.
Remarque : la lecture asynchrone est garantie comme étant terminée lorsque l’une des conditions suivantes est remplie : la fonction finish() a été appelée ; ou au moins N trames ont été submitted, y compris la trame qui a lancé l’opération de lecture, et la fonction recording of a new frame a été lancée, où N correspond à l’ resource limit value renvoyé par QRhi::MaxAsyncReadbackFrames.
Voir également readBackTexture(), QRhi::isFeatureSupported() et QRhi::resourceLimit().
void QRhiResourceUpdateBatch::readBackTexture(const QRhiReadbackDescription &rb, QRhiReadbackResult *result)
Met en file d'attente une opération de copie d'une texture vers l'hôte, comme décrit à l'adresse rb.
Normalement, la fonction ` rb ` spécifie une ` QRhiTexture ` comme source. Cependant, lorsque la chaîne d’échange (swapchain) de l’image actuelle a été créée avec ` QRhiSwapChain::UsedAsTransferSource`, elle peut également servir de source pour la relecture. Pour cela, laissez la texture définie sur `null` dans ` rb`.
Contrairement à d’autres opérations, les résultats doivent ici être traités par l’application. Par conséquent, ` result ` fournit non seulement les données, mais également un callback, car les opérations sur le lot sont de nature asynchrone :
rhi->beginFrame(swapchain);
cb->beginPass(swapchain->currentFrameRenderTarget(), colorClear, dsClear);
// ...
QRhiReadbackResult *rbResult = new QRhiReadbackResult;
rbResult->completed = [rbResult] {
{
const QImage::Format fmt = QImage::Format_RGBA8888_Premultiplied; // fits QRhiTexture::RGBA8
const uchar *p = reinterpret_cast<const uchar *>(rbResult->data.constData());
QImage image(p, rbResult->pixelSize.width(), rbResult->pixelSize.height(), fmt);
image.save("result.png");
}
delete rbResult;
};
QRhiResourceUpdateBatch *u = nextResourceUpdateBatch();
QRhiReadbackDescription rb; // no texture -> uses the current backbuffer of sc
u->readBackTexture(rb, rbResult);
cb->endPass(u);
rhi->endFrame(swapchain);Remarque : la texture doit être créée à l’aide de ` QRhiTexture::UsedAsTransferSource`.
Remarque : les texturesmulti-échantillonnées ne peuvent pas être relues.
Remarque : la relecture renvoie des données brutes au niveau des octets, afin de permettre aux applications de les interpréter comme elles l’entendent. Tenez compte des paramètres de fusion du code de rendu : si la fusion est configurée pour s’appuyer sur un alpha prémultiplié, les résultats de la relecture doivent également être interprétés comme prémultipliés.
Remarque : lors de l’interprétation des données brutes obtenues, gardez à l’esprit que la relecture s’effectue au format « byte ordered ». Une texture RGBA8 correspond donc à des formats « byte ordered » QImage, tels que QImage::Format_RGBA8888.
Remarque : la lecture asynchrone est considérée comme terminée dès lors que l’une des conditions suivantes est remplie : la fonction finish() a été appelée ; ou au moins N images ont été submitted, y compris l’image à l’origine de l’opération de lecture, et l’ recording of a new frame a été lancé, où N correspond à l’ resource limit value renvoyé par QRhi::MaxAsyncReadbackFrames.
Une opération de relecture unique copie un niveau de mip d’une couche (face de cubemap, tranche 3D ou élément de tableau de textures) à la fois. Le niveau et la couche sont spécifiés par les champs respectifs dans rb.
Voir également readBackBuffer() et QRhi::resourceLimit().
void QRhiResourceUpdateBatch::release()
Renvoie le lot au pool. Cette méthode ne doit être utilisée que lorsque le lot n'est pas transmis à l'une des méthodes suivantes : QRhiCommandBuffer::beginPass(), QRhiCommandBuffer::endPass() ou QRhiCommandBuffer::resourceUpdate(), car celles-ci appellent implicitement la méthode destroy().
Remarque : les instances de `QRhiResourceUpdateBatch ` ne doivent jamais être ` deleted ` par les applications.
void QRhiResourceUpdateBatch::updateDynamicBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data)
Met en file d'attente la mise à jour d'une région d'un QRhiBuffer buf créé avec le type QRhiBuffer::Dynamic.
La région est spécifiée par offset et size. Les octets à écrire sont spécifiés par data, qui doit disposer d’au moins size octets disponibles.
data est copiée et peut être détruite ou modifiée en toute sécurité une fois que cette fonction renvoie une valeur.
Remarque : si des écritures sur l’hôte sont impliquées, ce qui est généralement le cas avec `updateDynamicBuffer()` car ces tampons sont adossés à de la mémoire visible par l’hôte avec la plupart des backends, elles peuvent s’accumuler au sein d’une trame. Ainsi, un passage 1 lisant une région modifiée par un lot transmis au passage 2 peut voir les modifications spécifiées dans le lot de mise à jour du passage 2.
Remarque : QRhi gère de manière transparente la double mise en mémoire tampon afin d’éviter tout blocage du pipeline graphique. Le fait qu’un objet « QRhiBuffer » puisse comporter plusieurs objets de tampon natifs sous-jacents peut être ignoré sans risque lors de l’utilisation des fonctions QRhi et QRhiResourceUpdateBatch.
[since 6.10] void QRhiResourceUpdateBatch::updateDynamicBuffer(QRhiBuffer *buf, quint32 offset, QByteArray data)
Cette surcharge met en file d’attente la mise à jour d’une région d’un objet ` QRhiBuffer ` buf créé avec le type ` QRhiBuffer::Dynamic`.
data est déplacé dans le lot au lieu d’être copié avec cette surcharge.
Il s'agit d'une fonction surchargée.
Cette fonction a été introduite dans Qt 6.10.
void QRhiResourceUpdateBatch::uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data)
Met en file d'attente la mise à jour d'une région d'un QRhiBuffer buf créé avec le type QRhiBuffer::Immutable ou QRhiBuffer::Static.
La région est spécifiée par offset et size. Les octets à écrire sont spécifiés par data, qui doit disposer d’au moins size octets disponibles.
data est copiée et peut être détruite ou modifiée en toute sécurité une fois que cette fonction renvoie une valeur.
[since 6.10] void QRhiResourceUpdateBatch::uploadStaticBuffer(QRhiBuffer *buf, QByteArray data)
Cette surcharge met en file d'attente la mise à jour de l'ensemble de l'QRhiBuffer buf créée avec le type QRhiBuffer::Immutable ou QRhiBuffer::Static.
data est déplacé dans le lot au lieu d’être copié avec cette surcharge.
data size doit être égal à la taille de buf.
Il s’agit d’une fonction surchargée.
Cette fonction a été introduite dans Qt 6.10.
void QRhiResourceUpdateBatch::uploadStaticBuffer(QRhiBuffer *buf, const void *data)
Met en file d'attente la mise à jour de l'ensemble de l'QRhiBuffer buf créé avec le type QRhiBuffer::Immutable ou QRhiBuffer::Static.
Il s'agit d'une fonction surchargée.
[since 6.10] void QRhiResourceUpdateBatch::uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, QByteArray data)
Cette surcharge met en file d'attente la mise à jour d'une région d'un objet de type ` QRhiBuffer ` ( buf ) créé avec le type ` QRhiBuffer::Immutable ` ou ` QRhiBuffer::Static`.
data est déplacée dans le lot au lieu d’être copiée avec cette surcharge.
Il s'agit d'une fonction surchargée.
Cette fonction a été introduite dans Qt 6.10.
void QRhiResourceUpdateBatch::uploadTexture(QRhiTexture *tex, const QImage &image)
Met en file d'attente le téléchargement des données d'image pour le niveau mip 0 de la couche 0 de la texture tex.
tex Le format doit être non compressé. Il doit également être compatible avec la fonction QImage::format() de image. Les données source sont fournies dans image.
void QRhiResourceUpdateBatch::uploadTexture(QRhiTexture *tex, const QRhiTextureUploadDescription &desc)
Met en file d’attente le téléchargement des données d’image pour un ou plusieurs niveaux de mip dans un ou plusieurs calques de la texture tex.
Les détails de la copie ( QImage s source ou données de texture compressées, régions, couches cibles et niveaux) sont décrits à l'adresse desc.
© 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.