En esta página

QRhiResourceUpdateBatch Class

Registra operaciones de tipo carga y copia. Más...

Cabecera: #include <rhi/qrhi.h>
CMake: find_package(Qt6 REQUIRED COMPONENTS GuiPrivate)
target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate)
qmake: QT += gui-private
Desde: Qt 6.6

Funciones Públicas

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)

Descripción detallada

Con QRhi ya no es posible realizar operaciones de tipo copia en momentos arbitrarios. En su lugar, todas estas operaciones se registran en lotes que luego se pasan, normalmente, a QRhiCommandBuffer::beginPass(). Lo que ocurre entonces bajo el capó queda oculto para la aplicación: las implementaciones subyacentes pueden aplazar e implementar estas operaciones de varias maneras diferentes.

Un lote de actualización de recursos no posee recursos gráficos y no realiza ninguna operación por sí mismo. Debe considerarse más bien como un búfer de comandos de actualización, carga y copia.

Para obtener un lote disponible y vacío del pool, llame a QRhi::nextResourceUpdateBatch().

Nota: Se trata de una API RHI con garantías de compatibilidad limitadas; consulte QRhi para obtener más información.

Documentación de las funciones miembro

void QRhiResourceUpdateBatch::copyTexture(QRhiTexture *dst, QRhiTexture *src, const QRhiTextureCopyDescription &desc = QRhiTextureCopyDescription())

Coloca en cola una operación de copia de textura a textura desde src a dst como se describe en desc.

Nota: La textura de origen src debe crearse con QRhiTexture::UsedAsTransferSource.

Nota : El formato de las texturas debe coincidir. Con la mayoría de las APIs gráficas los datos se copian tal cual sin ninguna conversión de formato. Si dst y src se crean con formatos diferentes, pueden surgir problemas no especificados.

void QRhiResourceUpdateBatch::generateMips(QRhiTexture *tex)

Pone en cola una operación de generación de mipmap para la textura especificada tex.

Se admiten texturas 2D y cúbicas.

Nota: La textura debe crearse con QRhiTexture::MipMapped y QRhiTexture::UsedWithGenerateMips.

Advertencia: QRhi no puede garantizar que se puedan generar mipmaps para todos los formatos de textura soportados. Por ejemplo, QRhiTexture::RGBA32F no es un formato filterable en OpenGL ES 3.0 y Metal en iOS, y por lo tanto la solicitud de generación de mipmap puede fallar. RGBA8 y RGBA16F suelen ser filtrables, por lo que se recomienda utilizar estos formatos cuando se desee generar mipmaps.

bool QRhiResourceUpdateBatch::hasOptimalCapacity() const

Devuelve verdadero hasta que el número de operaciones de búfer y textura en cola en este lote esté por debajo de un límite razonable.

El valor de retorno es false cuando el número de operaciones de búfer y/o textura añadidas a este lote han alcanzado, o están a punto de alcanzar, un cierto límite. El lote es completamente funcional después también, pero puede necesitar asignar memoria adicional. Por lo tanto, un renderizador que recoge muchas actualizaciones de búfer y textura en un solo lote cuando prepara un fotograma puede querer considerar submitting the batch y starting a new one cuando esta función devuelva false.

void QRhiResourceUpdateBatch::merge(QRhiResourceUpdateBatch *other)

Copia todas las operaciones en cola del lote other en éste.

Nota: other puede que ya no contenga datos válidos después de la operación de fusión, y no debe ser enviado, pero aún así necesitará ser liberado llamando a release().

Esto permite un patrón conveniente donde las actualizaciones de recursos que ya se conocen durante el paso de inicialización se recogen en un lote que luego se fusiona en otro cuando se inicia el primer pase de renderizado más adelante:

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)

Pone en cola la lectura de una región de QRhiBuffer buf . El tamaño de la región se especifica en size en bytes, offset es el offset en bytes desde el que empezar a leer.

Una relectura es asíncrona. result contiene una llamada de retorno que se invoca cuando la operación ha finalizado. Los datos se proporcionan en QRhiReadbackResult::data. Si la operación se completa con éxito, QByteArray tendrá un tamaño igual a size. En caso de fallo, QByteArray estará vacío.

Nota: La lectura de buffers con un uso diferente a QRhiBuffer::UniformBuffer sólo es soportada cuando la característica QRhi::ReadBackNonUniformBuffer es reportada como soportada.

Nota: Se garantiza que la lectura asíncrona se ha completado cuando se cumple una de las siguientes condiciones: finish() ha sido llamada; o, al menos N tramas han sido submitted, incluyendo la trama que emitió la operación de readback, y la recording of a new frame ha sido iniciada, donde N es la resource limit value devuelta para QRhi::MaxAsyncReadbackFrames.

Véase también readBackTexture(), QRhi::isFeatureSupported() y QRhi::resourceLimit().

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

Coloca en cola una operación de copia de textura a host como se describe en rb.

Normalmente rb especificará un QRhiTexture como fuente. Sin embargo, cuando el swapchain en el frame actual fue creado con QRhiSwapChain::UsedAsTransferSource, también puede ser la fuente de la readback. Para ello, deje la textura en null en rb.

A diferencia de otras operaciones, aquí los resultados deben ser procesados por la aplicación. Por lo tanto, result proporciona no sólo los datos, sino también una llamada de retorno, ya que las operaciones en el lote son asíncronas por naturaleza:

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);

Nota: La textura debe crearse con QRhiTexture::UsedAsTransferSource.

Nota : Las texturas multimuestra no se pueden volver a leer.

Nota: La relectura devuelve datos en bytes sin procesar, para permitir que las aplicaciones los interpreten de la forma que consideren oportuna. Tenga en cuenta la configuración de mezcla del código de renderizado: si la mezcla está configurada para basarse en alfa premultiplicado, los resultados de la lectura de retorno también deben interpretarse como Premultiplicado.

Nota: Al interpretar los datos brutos resultantes, tenga en cuenta que la lectura se produce con un formato ordenado por bytes. Una textura RGBA8 mapea por lo tanto a formatos QImage ordenados por byte, tales como, QImage::Format_RGBA8888.

Nota: Se garantiza que la lectura asíncrona se ha completado cuando se cumple una de las siguientes condiciones: finish() ha sido llamado; o, al menos N frames han sido submitted, incluyendo el frame que emitió la operación de readback, y el recording of a new frame ha sido iniciado, donde N es el resource limit value devuelto para QRhi::MaxAsyncReadbackFrames.

Una única operación de readback copia un nivel mip de una capa (cara de cubemap o corte 3D o elemento de matriz de textura) cada vez. El nivel y la capa se especifican en los campos respectivos de rb.

Véase también readBackBuffer() y QRhi::resourceLimit().

void QRhiResourceUpdateBatch::release()

Devuelve el lote al pool. Esto sólo debería usarse cuando el lote no se pasa a uno de QRhiCommandBuffer::beginPass(), QRhiCommandBuffer::endPass(), o QRhiCommandBuffer::resourceUpdate() porque estos llaman implícitamente a destroy().

Nota: Las instanciasQRhiResourceUpdateBatch nunca deben ser deleted por las aplicaciones.

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

Encarga la actualización de una región de un QRhiBuffer buf creado con el tipo QRhiBuffer::Dynamic.

La región se especifica offset y size. Los bytes reales a escribir son especificados por data que debe tener al menos size bytes disponibles.

data es copiado y puede ser destruido o cambiado con seguridad una vez que esta función retorna.

Nota: Si hay escrituras del host involucradas, como es el caso de updateDynamicBuffer() típicamente ya que tales buffers están respaldados por memoria visible del host con la mayoría de los backends, pueden acumularse dentro de un frame. Así, el paso 1 que lee una región cambiada por un lote pasado al paso 2 puede ver los cambios especificados en el lote de actualización del paso 2.

Nota: QRhi gestiona de forma transparente el doble búfer para evitar que se bloquee el canal de gráficos. El hecho de que un QRhiBuffer pueda tener varios objetos de búfer nativos debajo puede ignorarse con seguridad cuando se utilizan los QRhi y QRhiResourceUpdateBatch.

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

Encarga la actualización de una región de un QRhiBuffer buf creado con el tipo QRhiBuffer::Dynamic.

data se mueve al lote en lugar de copiarse con esta sobrecarga.

Esta es una función sobrecargada.

Esta función se introdujo en Qt 6.10.

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

Encarga la actualización de una región de un QRhiBuffer buf creado con el tipo QRhiBuffer::Immutable o QRhiBuffer::Static.

La región se especifica offset y size. Los bytes reales a escribir son especificados por data que debe tener al menos size bytes disponibles.

data es copiado y puede ser destruido o cambiado con seguridad una vez que esta función retorna.

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

Pone en cola la actualización completa de QRhiBuffer buf creada con el tipo QRhiBuffer::Immutable o QRhiBuffer::Static.

data se mueve al lote en lugar de copiarse con esta sobrecarga.

data size debe ser igual al tamaño de buf.

Esta es una función sobrecargada.

Esta función se introdujo en Qt 6.10.

void QRhiResourceUpdateBatch::uploadStaticBuffer(QRhiBuffer *buf, const void *data)

Pone en cola la actualización de todo el QRhiBuffer buf creado con el tipo QRhiBuffer::Immutable o QRhiBuffer::Static.

Se trata de una función sobrecargada.

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

Encarga la actualización de una región de un QRhiBuffer buf creado con el tipo QRhiBuffer::Immutable o QRhiBuffer::Static.

data se mueve al lote en lugar de copiarse con esta sobrecarga.

Esta es una función sobrecargada.

Esta función se introdujo en Qt 6.10.

void QRhiResourceUpdateBatch::uploadTexture(QRhiTexture *tex, const QImage &image)

Encarga la carga de los datos de imagen para el nivel mip 0 de la capa 0 de la textura tex.

tex debe tener un formato sin comprimir. Su formato también debe ser compatible con el QImage::format() de image. Los datos de origen se dan en image.

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

Pone en cola la carga de los datos de imagen para uno o más niveles mip en una o más capas de la textura tex.

Los detalles de la copia (fuente QImage o datos de textura comprimidos, regiones, capas y niveles de destino) se describen en 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.