Sur cette page

QRhiResourceUpdateBatch Class

Enregistre les opérations de type téléchargement et copie. 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

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 QRhi, il n'est plus possible d'effectuer des opérations de type copie à des moments arbitraires. Au lieu de cela, toutes ces opérations sont enregistrées dans des lots qui sont ensuite transmis, le plus souvent, à QRhiCommandBuffer::beginPass(). Ce qui se passe alors sous le capot est caché à 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 réelle par lui-même. Il doit plutôt être considéré comme un tampon de commande pour les commandes de type mise à jour, téléchargement et copie.

Pour obtenir un lot vide et disponible dans le pool, appelez QRhi::nextResourceUpdateBatch().

Remarque : il s'agit d'une API RHI avec des garanties de compatibilité limitées, 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 à texture de src à dst comme décrit par desc.

Remarque : la texture source src doit être créée avec QRhiTexture::UsedAsTransferSource.

Remarque : le format des textures doit correspondre. Avec la plupart des API graphiques, les données sont copiées telles quelles sans conversion de format. Si dst et src sont créés 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 mipmap pour la texture spécifiée tex.

Les textures 2D et cubiques sont prises en charge.

Remarque : la texture doit être créée avec QRhiTexture::MipMapped et QRhiTexture::UsedWithGenerateMips.

Avertissement : QRhi ne peut pas garantir que des mipmaps peuvent ê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, et donc la demande de génération de mipmap peut échouer. RGBA8 et RGBA16F sont généralement filtrables, il est donc recommandé d'utiliser ces formats lorsque la génération de mipmap est souhaitée.

bool QRhiResourceUpdateBatch::hasOptimalCapacity() const

Retourne vrai jusqu'à ce que le nombre d'opérations de tampon et de texture mises en file d'attente dans ce lot soit inférieur à une limite raisonnable.

La valeur de retour est fausse lorsque le nombre d'opérations de tampon et/ou de texture ajoutées à ce lot a atteint, ou est sur le point d'atteindre, une certaine limite. Le lot est également pleinement fonctionnel par la suite, mais peut avoir besoin d'allouer de la mémoire supplémentaire. Par conséquent, un moteur de rendu qui collecte de nombreuses mises à jour de tampons et de textures en un seul lot lors de la préparation d'une image peut envisager d'utiliser submitting the batch et starting a new one lorsque cette fonction renvoie une valeur fausse.

void QRhiResourceUpdateBatch::merge(QRhiResourceUpdateBatch *other)

Copie toutes les opérations en file d'attente du lot other dans celui-ci.

Note : 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 quand même être libéré en appelant release().

Cela permet un schéma pratique où les mises à jour des ressources qui sont déjà connues pendant l'étape d'initialisation sont rassemblées dans un lot qui est ensuite fusionné dans un autre lors du démarrage de la première passe de rendu plus tard :

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)

Enqueues reading back a region of the QRhiBuffer buf . La taille de la région est spécifiée par size en octets, offset est le décalage en octets à partir duquel commencer la lecture.

Une relecture est asynchrone. result contient un rappel qui est invoqué lorsque l'opération est terminée. Les données sont fournies dans QRhiReadbackResult::data. Si l'opération est réussie, la taille de QByteArray sera égale à celle de size. En cas d'échec, QByteArray sera vide.

Remarque : la lecture de tampons dont l'utilisation est différente de celle de QRhiBuffer::UniformBuffer n'est possible que si la fonction QRhi::ReadBackNonUniformBuffer est déclarée comme étant prise en charge.

Remarque : la lecture asynchrone est garantie comme étant terminée lorsque l'une des conditions suivantes est remplie : finish() a été appelé ; ou au moins N cadres ont été submitted, y compris le cadre qui a émis l'opération de relecture, et le recording of a new frame a été démarré, où N est le resource limit value renvoyé pour QRhi::MaxAsyncReadbackFrames.

Voir également readBackTexture(), QRhi::isFeatureSupported() et QRhi::resourceLimit().

void QRhiResourceUpdateBatch::readBackTexture(const QRhiReadbackDescription &rb, QRhiReadbackResult *result)

Demande une opération de copie texture-hôte telle que décrite par rb.

Normalement, rb spécifie une QRhiTexture comme source. Cependant, lorsque la chaîne d'échange dans le cadre actuel a été créée avec QRhiSwapChain::UsedAsTransferSource, elle peut également être la source de la lecture. Pour cela, laissez la texture à null dans rb.

Contrairement à d'autres opérations, les résultats doivent être traités par l'application. Par conséquent, result fournit non seulement les données, mais aussi un rappel, car les opérations sur le lot sont asynchrones par nature :

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 textures multi-échantillons ne peuvent pas être relues.

Remarque : la lecture renvoie des données brutes en octets, afin de permettre aux applications de les interpréter comme elles l'entendent. Tenez compte des paramètres de mélange du code de rendu : si le mélange est configuré pour s'appuyer sur l'alpha prémultiplié, les résultats de la lecture doivent également être interprétés comme étant prémultipliés.

Remarque : lors de l'interprétation des données brutes résultantes, il faut tenir compte du fait que la relecture s'effectue dans un format ordonné par octets. Une texture RGBA8 correspond donc à des formats QImage ordonnés par octets, tels que QImage::Format_RGBA8888.

Remarque : la lecture asynchrone est garantie comme étant terminée lorsque l'une des conditions suivantes est remplie : finish() a été appelé ; ou, au moins N images ont été submitted, y compris l'image qui a émis l'opération de relecture, et recording of a new frame a été démarré, où N est le resource limit value renvoyé pour QRhi::MaxAsyncReadbackFrames.

Une seule opération de relecture permet de copier un niveau mip d'une couche (face cubemap ou tranche 3D ou élément de tableau de texture) à la fois. Le niveau et la couche sont spécifiés par les champs respectifs de rb.

Voir également readBackBuffer() et QRhi::resourceLimit().

void QRhiResourceUpdateBatch::release()

Retourne le lot au pool. Cette fonction ne doit être utilisée que si le lot n'est pas transmis à l'une des fonctions suivantes : QRhiCommandBuffer::beginPass(), QRhiCommandBuffer::endPass() ou QRhiCommandBuffer::resourceUpdate(), car celles-ci appellent implicitement la fonction destroy().

Remarque : les instancesQRhiResourceUpdateBatch ne doivent jamais être deleted par les applications.

void QRhiResourceUpdateBatch::updateDynamicBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data)

Enqueues updating a region of a QRhiBuffer buf created with the 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 avoir au moins size octets disponibles.

data La région est copiée et peut être détruite ou modifiée en toute sécurité après le retour de cette fonction.

Note : Si des écritures de l'hôte sont impliquées, ce qui est le cas avec updateDynamicBuffer(), typiquement parce que de tels tampons sont soutenus par la mémoire visible de l'hôte avec la plupart des backends, ils peuvent s'accumuler à l'intérieur d'une image. Ainsi, la passe 1 qui lit une région modifiée par un lot transmis à la passe 2 peut voir les modifications spécifiées dans le lot de mise à jour de la passe 2.

Remarque : QRhi gère de manière transparente la double mise en mémoire tampon afin d'éviter de bloquer le pipeline graphique. Le fait qu'un QRhiBuffer puisse avoir plusieurs objets tampons natifs en dessous peut être ignoré en toute sécurité lors de l'utilisation des QRhi et QRhiResourceUpdateBatch.

[since 6.10] void QRhiResourceUpdateBatch::updateDynamicBuffer(QRhiBuffer *buf, quint32 offset, QByteArray data)

Enqueues updating a region of a QRhiBuffer buf created with the type QRhiBuffer::Dynamic.

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::uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data)

Enqueues updating a region of a QRhiBuffer buf created with the type QRhiBuffer::Immutable or QRhiBuffer::Static.

La région est spécifiée par offset et size. Les octets à écrire sont spécifiés par data qui doit avoir au moins size octets disponibles.

data La région est copiée et peut être détruite ou modifiée en toute sécurité après le retour de cette fonction.

[since 6.10] void QRhiResourceUpdateBatch::uploadStaticBuffer(QRhiBuffer *buf, QByteArray data)

Enqueues updating the entire QRhiBuffer buf created with the type QRhiBuffer::Immutable or QRhiBuffer::Static.

data Avec cette surcharge, le contenu est déplacé dans le lot au lieu d'être copié.

data La taille doit être égale à 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)

Enqueues updating the entire QRhiBuffer buf created with the type QRhiBuffer::Immutable or QRhiBuffer::Static.

Il s'agit d'une fonction surchargée.

[since 6.10] void QRhiResourceUpdateBatch::uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, QByteArray data)

Enqueues updating a region of a QRhiBuffer buf created with the type QRhiBuffer::Immutable or 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)

Enqueues uploading the image data for mip level 0 of layer 0 of the texture tex.

tex Le format de l'image doit être non compressé. Son format doit également être compatible avec celui de QImage::format() de image. Les données sources sont indiquées dans image.

void QRhiResourceUpdateBatch::uploadTexture(QRhiTexture *tex, const QRhiTextureUploadDescription &desc)

Enqueues uploading the image data for one or more mip levels in one or more layers of the texture tex.

Les détails de la copie (données de texture source QImage ou compressées, régions, couches et niveaux cibles) sont décrits dans 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.