QRhiResourceUpdateBatch Class

Zeichnet Vorgänge vom Typ Hochladen und Kopieren auf. Mehr...

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

Öffentliche Funktionen

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)
void uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data)
void uploadStaticBuffer(QRhiBuffer *buf, const void *data)
void uploadTexture(QRhiTexture *tex, const QImage &image)
void uploadTexture(QRhiTexture *tex, const QRhiTextureUploadDescription &desc)

Detaillierte Beschreibung

Mit QRhi ist es nicht mehr möglich, Kopiervorgänge zu beliebigen Zeitpunkten durchzuführen. Stattdessen werden alle diese Operationen in Stapeln aufgezeichnet, die dann meist an QRhiCommandBuffer::beginPass() übergeben werden. Was dann unter der Haube passiert, bleibt der Anwendung verborgen: Die zugrundeliegenden Implementierungen können diese Operationen auf verschiedene Weise aufschieben und umsetzen.

Ein Ressourcenaktualisierungsstapel besitzt keine Grafikressourcen und führt selbst keine eigentlichen Operationen aus. Er sollte vielmehr als Befehlspuffer für Aktualisierungs-, Upload- und Kopierbefehle betrachtet werden.

Um einen verfügbaren, leeren Stapel aus dem Pool zu erhalten, rufen Sie QRhi::nextResourceUpdateBatch() auf.

Hinweis: Dies ist eine RHI-API mit eingeschränkten Kompatibilitätsgarantien, siehe QRhi für Details.

Dokumentation der Mitgliedsfunktionen

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

Stellt einen Textur-zu-Textur-Kopiervorgang von src in dst ein, wie in desc beschrieben.

Hinweis: Die Quelltextur src muss mit QRhiTexture::UsedAsTransferSource erstellt werden.

Hinweis: Das Format der Texturen muss übereinstimmen. Bei den meisten Grafik-APIs werden die Daten so kopiert, wie sie sind, ohne jegliche Formatkonvertierung. Wenn dst und src mit unterschiedlichen Formaten erstellt werden, kann es zu nicht spezifizierten Problemen kommen.

void QRhiResourceUpdateBatch::generateMips(QRhiTexture *tex)

Stellt eine Mipmap-Erzeugungsoperation für die angegebene Textur tex in die Warteschlange.

Es werden sowohl 2D- als auch Würfeltexturen unterstützt.

Hinweis: Die Textur muss mit QRhiTexture::MipMapped und QRhiTexture::UsedWithGenerateMips erstellt werden.

Warnung: QRhi kann nicht garantieren, dass Mipmaps für alle unterstützten Texturformate erzeugt werden können. Zum Beispiel ist QRhiTexture::RGBA32F kein filterable Format in OpenGL ES 3.0 und Metal auf iOS, und daher kann die Mipmap-Generierungsanfrage fehlschlagen. RGBA8 und RGBA16F sind in der Regel filterbar, daher wird empfohlen, diese Formate zu verwenden, wenn eine Mipmap-Generierung gewünscht wird.

bool QRhiResourceUpdateBatch::hasOptimalCapacity() const

Gibt true zurück, bis die Anzahl der Puffer- und Texturoperationen, die in diesen Stapel eingereiht wurden, unter einer angemessenen Grenze liegt.

Der Rückgabewert ist false, wenn die Anzahl der zu diesem Stapel hinzugefügten Puffer- und/oder Texturoperationen eine bestimmte Grenze erreicht hat oder kurz davor ist, sie zu erreichen. Der Stapel ist auch danach voll funktionsfähig, muss aber möglicherweise zusätzlichen Speicher zuweisen. Daher sollte ein Renderer, der bei der Vorbereitung eines Frames viele Puffer- und Texturaktualisierungen in einem einzigen Stapel sammelt, submitting the batch und starting a new one in Betracht ziehen, wenn diese Funktion den Wert false zurückgibt.

void QRhiResourceUpdateBatch::merge(QRhiResourceUpdateBatch *other)

Kopiert alle in der Warteschlange stehenden Vorgänge aus dem Stapel other in diesen.

Hinweis: other enthält nach der Zusammenführung möglicherweise keine gültigen Daten mehr und darf nicht übermittelt werden, muss aber dennoch durch Aufruf von release() freigegeben werden.

Dies ermöglicht ein bequemes Muster, bei dem Ressourcenaktualisierungen, die bereits während des Initialisierungsschritts bekannt sind, in einem Stapel gesammelt werden, der dann später beim Start des ersten Rendering-Durchgangs in einen anderen zusammengeführt wird:

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)

Stellt das Zurücklesen eines Bereichs der Datei QRhiBuffer buf in die Warteschlange. Die Größe des Bereichs wird durch size in Bytes angegeben, offset ist der Offset in Bytes, ab dem gelesen werden soll.

Ein Readback ist asynchron. result enthält einen Callback, der aufgerufen wird, wenn der Vorgang abgeschlossen ist. Die Daten werden in QRhiReadbackResult::data bereitgestellt. Bei erfolgreichem Abschluss hat QByteArray die gleiche Größe wie size. Bei einem Fehlschlag wird QByteArray leer sein.

Hinweis: Das Lesen von Puffern mit einer anderen Verwendung als QRhiBuffer::UniformBuffer wird nur unterstützt, wenn die Funktion QRhi::ReadBackNonUniformBuffer als unterstützt gemeldet wird.

Hinweis: Die asynchrone Rücklesung ist garantiert abgeschlossen, wenn eine der folgenden Bedingungen erfüllt ist: finish() wurde aufgerufen; oder mindestens N Frames wurden submitted, einschließlich des Frames, der die Rücklese-Operation ausgelöst hat, und recording of a new frame wurde gestartet, wobei N der für QRhi::MaxAsyncReadbackFrames zurückgegebene resource limit value ist.

Siehe auch readBackTexture(), QRhi::isFeatureSupported(), und QRhi::resourceLimit().

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

Stellt eine Textur-zu-Host-Kopieroperation in die Warteschlange, wie von rb beschrieben.

Normalerweise wird rb eine QRhiTexture als Quelle angeben. Wenn jedoch die Swapchain im aktuellen Frame mit QRhiSwapChain::UsedAsTransferSource erstellt wurde, kann sie auch die Quelle für das Zurücklesen sein. Lassen Sie dazu die Textur in rb auf Null gesetzt.

Im Gegensatz zu anderen Operationen müssen die Ergebnisse hier von der Anwendung verarbeitet werden. Daher stellt result nicht nur die Daten, sondern auch einen Callback zur Verfügung, da Operationen mit dem Stapel von Natur aus asynchron sind:

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

Hinweis: Die Textur muss mit QRhiTexture::UsedAsTransferSource erstellt werden.

Hinweis: Multisample-Texturen können nicht zurückgelesen werden.

Hinweis: Die Rücklesung liefert rohe Byte-Daten, damit die Anwendungen sie auf jede erdenkliche Weise interpretieren können. Achten Sie auf die Überblendungseinstellungen des Rendering-Codes: Wenn die Überblendung so eingestellt ist, dass sie auf vormultipliziertem Alpha beruht, müssen die Ergebnisse des Rücklesens auch als vormultipliziert interpretiert werden.

Hinweis: Bei der Interpretation der resultierenden Rohdaten ist zu beachten, dass die Rücklesung in einem byte-geordneten Format erfolgt. Eine RGBA8 Textur bildet daher byte-geordnete QImage Formate ab, wie z.B. QImage::Format_RGBA8888.

Hinweis: Die asynchrone Rücklesung ist garantiert abgeschlossen, wenn eine der folgenden Bedingungen erfüllt ist: finish() wurde aufgerufen; oder, mindestens N Frames wurden submitted, einschließlich des Frames, der die Rücklese-Operation auslöste, und die recording of a new frame wurde gestartet, wobei N die resource limit value ist, die für QRhi::MaxAsyncReadbackFrames zurückgegeben wurde.

Ein einzelner Rücklesevorgang kopiert jeweils eine Mip-Ebene einer Ebene (Cubemap-Fläche oder 3D-Slice oder Textur-Array-Element). Die Ebene und der Layer werden durch die entsprechenden Felder in rb angegeben.

Siehe auch readBackBuffer() und QRhi::resourceLimit().

void QRhiResourceUpdateBatch::release()

Gibt den Stapel an den Pool zurück. Dies sollte nur verwendet werden, wenn der Stapel nicht an eine der Funktionen QRhiCommandBuffer::beginPass(), QRhiCommandBuffer::endPass() oder QRhiCommandBuffer::resourceUpdate() übergeben wird, da diese implizit destroy() aufrufen.

Hinweis: QRhiResourceUpdateBatch Instanzen dürfen niemals von deleted von Anwendungen verwendet werden.

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

Enqueues Aktualisierung einer Region eines QRhiBuffer buf erstellt mit dem Typ QRhiBuffer::Dynamic.

Der Bereich wird durch offset und size angegeben. Die tatsächlich zu schreibenden Bytes werden durch data angegeben, das mindestens size Bytes zur Verfügung haben muss. data kann sicher zerstört oder geändert werden, sobald diese Funktion zurückkehrt.

Hinweis: Wenn Host-Schreibvorgänge involviert sind, was bei updateDynamicBuffer() typischerweise der Fall ist, da solche Puffer bei den meisten Backends von sichtbarem Host-Speicher unterstützt werden, können sie sich innerhalb eines Frames anhäufen. So kann Pass 1, der eine Region liest, die durch einen an Pass 2 übergebenen Stapel geändert wurde, die im Aktualisierungsstapel von Pass 2 angegebenen Änderungen sehen.

Hinweis: QRhi verwaltet die doppelte Pufferung auf transparente Weise, um ein Abwürgen der Grafikpipeline zu verhindern. Die Tatsache, dass ein QRhiBuffer möglicherweise mehrere native Pufferobjekte enthält, kann bei Verwendung von QRhi und QRhiResourceUpdateBatch ignoriert werden.

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

Ermöglicht die Aktualisierung einer Region von QRhiBuffer buf , die mit dem Typ QRhiBuffer::Immutable oder QRhiBuffer::Static erstellt wurde.

Der Bereich wird durch offset und size angegeben. Die tatsächlich zu schreibenden Bytes werden durch data angegeben, das mindestens size Bytes zur Verfügung haben muss. data kann sicher zerstört oder geändert werden, sobald diese Funktion zurückkehrt.

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

Dies ist eine überladene Funktion.

Stellt die Aktualisierung der gesamten QRhiBuffer buf , die mit dem Typ QRhiBuffer::Immutable oder QRhiBuffer::Static erstellt wurde, in die Warteschlange.

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

Ermöglicht das Hochladen der Bilddaten für die Mip-Ebene 0 der Ebene 0 der Textur tex.

tex muss ein unkomprimiertes Format haben. Sein Format muss auch mit dem QImage::format() von image kompatibel sein. Die Quelldaten sind in image angegeben.

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

Enqueues Hochladen der Bilddaten für eine oder mehrere mip-Ebenen in einer oder mehreren Ebenen der Textur tex.

Die Einzelheiten der Kopie (Quelldaten QImage oder komprimierte Texturdaten, Regionen, Zielebenen und -ebenen) sind in desc beschrieben.

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