Auf dieser Seite

QRhiResourceUpdateBatch Class

Vorgänge zum Hochladen und Kopieren von Datensätzen. Mehr...

Überschrift: #include <rhi/qrhi.h>
CMake: find_package(Qt6 REQUIRED COMPONENTS GuiPrivate)
target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate)
qmake: QT += gui-private
Seit: 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)
(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)

Ausführliche Beschreibung

Mit „ QRhi “ ist es nicht mehr möglich, Kopiervorgänge zu beliebigen Zeitpunkten durchzuführen. Stattdessen werden alle derartigen Vorgänge in Stapeln erfasst, die dann in der Regel an „ QRhiCommandBuffer::beginPass()“ übergeben werden. Was dann im Hintergrund geschieht, bleibt der Anwendung verborgen: Die zugrunde liegenden Implementierungen können diese Vorgänge auf verschiedene Weise verzögern und ausführen.

Ein Ressourcen-Update-Batch besitzt keine Grafikressourcen und führt selbst keine tatsächlichen Operationen durch. Er sollte vielmehr als Befehlspuffer für Befehle vom Typ „Update“, „Upload“ und „Copy“ betrachtet werden.

Um einen verfügbaren, leeren Batch aus dem Pool abzurufen, rufen Sie ` QRhi::nextResourceUpdateBatch()` auf.

Hinweis: Hierbei handelt es sich um eine RHI-API mit eingeschränkten Kompatibilitätsgarantien; weitere Informationen finden Sie unter „ QRhi “.

Dokumentation der Mitgliedsfunktionen

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

Stellt einen Textur-zu-Textur-Kopiervorgang von src nach dst in die Warteschlange, wie unter desc beschrieben.

Hinweis: Die Quelltextur „ src “ muss mit „ QRhiTexture::UsedAsTransferSource “ erstellt worden sein.

Hinweis: Das Format der Texturen muss übereinstimmen. Bei den meisten Grafik-APIs werden die Daten unverändert und ohne Formatkonvertierungen kopiert. Wenn dst und src in unterschiedlichen Formaten erstellt wurden, können nicht näher beschriebene Probleme auftreten.

void QRhiResourceUpdateBatch::generateMips(QRhiTexture *tex)

Stellt einen Vorgang zur Erzeugung von Mipmaps für die angegebene Textur „ tex “ in die Warteschlange ein.

2D- und Würfeltexturen werden unterstützt. 1D- und 3D-Texturen werden unterstützt, wenn die Funktion „ QRhi::OneDimensionalTextureMipmaps “ bzw. „ QRhi::ThreeDimensionalTextureMipmaps “ als unterstützt gemeldet wird.

Hinweis: Die Textur muss mit den Funktionen „ QRhiTexture::MipMapped “ und „ QRhiTexture::UsedWithGenerateMips “ erstellt worden sein.

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

bool QRhiResourceUpdateBatch::hasOptimalCapacity() const

Gibt „true“ zurück, bis die Anzahl der in diesem Batch in die Warteschlange gestellten Puffer- und Texturoperationen unter einen angemessenen Grenzwert fällt.

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

void QRhiResourceUpdateBatch::merge(QRhiResourceUpdateBatch *other)

Kopiert alle in der Warteschlange befindlichen Vorgänge aus dem „ other “-Batch in diesen.

Hinweis: „ other “ enthält nach dem Zusammenführungsvorgang möglicherweise keine gültigen Daten mehr und darf nicht mehr übermittelt werden, muss jedoch weiterhin durch den Aufruf von „ release()“ freigegeben werden.

Dies ermöglicht ein praktisches Muster, bei dem Ressourcenaktualisierungen, die bereits während des Initialisierungsschritts bekannt sind, in einem Batch gesammelt werden, der später beim Start des ersten Renderdurchgangs in einen anderen Batch 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 aus „ QRhiBuffer “ buf “ in die Warteschlange. Die Größe des Bereichs wird durch „ size “ in Byte angegeben, „ offset “ ist der Offset in Byte, ab dem mit dem Lesen begonnen werden soll.

Ein Rücklesen erfolgt asynchron. result enthält einen Callback, der aufgerufen wird, sobald der Vorgang abgeschlossen ist. Die Daten werden in QRhiReadbackResult::data bereitgestellt. Bei erfolgreichem Abschluss hat QByteArray eine Größe, die size entspricht. Bei einem Fehler ist QByteArray leer.

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: Das asynchrone Zurücklesen 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 den Zurücklesevorgang ausgelöst hat, und das 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 einen Kopiervorgang von einer Textur auf den Host in die Warteschlange, wie unter rb beschrieben.

Normalerweise gibt rb einen „ QRhiTexture “ als Quelle an. Wenn die Swapchain im aktuellen Frame jedoch mit QRhiSwapChain::UsedAsTransferSource erstellt wurde, kann sie auch als Quelle für das Zurücklesen dienen. 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 liefert ` result ` nicht nur die Daten, sondern auch einen Callback, da Operationen auf dem Batch 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: Das Zurücklesen liefert rohe Byte-Daten, damit die Anwendungen diese nach eigenem Ermessen interpretieren können. Beachten Sie die Blending-Einstellungen des Rendering-Codes: Wenn das Blending so eingerichtet ist, dass es auf vormultipliziertem Alpha basiert, müssen die Ergebnisse des Zurücklesens ebenfalls als vormultipliziert interpretiert werden.

Hinweis: Beachten Siebei der Interpretation der resultierenden Rohdaten, dass das Zurücklesen in einem byte-geordneten Format erfolgt. Eine „ RGBA8 “-Textur entspricht daher byte-geordneten „ QImage “-Formaten, wie z. B. „ QImage::Format_RGBA8888 “.

Hinweis: Das asynchrone Auslesen 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 den Auslesevorgang ausgelöst hat, und der recording of a new frame wurde gestartet, wobei N der für QRhi::MaxAsyncReadbackFrames zurückgegebene resource limit value ist.

Ein einzelner Readback-Vorgang kopiert jeweils eine Mip-Ebene einer Schicht (Cubemap-Fläche, 3D-Schnitt oder Textur-Array-Element). Die Ebene und die Schicht werden durch die entsprechenden Felder in rb angegeben.

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

void QRhiResourceUpdateBatch::release()

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

Hinweis: QRhiResourceUpdateBatch -Instanzen dürfen von Anwendungen niemals mit deleted aufgerufen werden.

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

Stellt die Aktualisierung eines Bereichs eines QRhiBuffer buf in die Warteschlange, der mit dem Typ QRhiBuffer::Dynamic 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 wird kopiert und kann nach der Rückkehr dieser Funktion sicher zerstört oder geändert werden.

Hinweis: Wenn Host-Schreibvorgänge beteiligt sind – was bei `updateDynamicBuffer()` typischerweise der Fall ist, da solche Puffer bei den meisten Backends durch für den Host sichtbaren Speicher gestützt werden –, können sich diese innerhalb eines Frames ansammeln. Daher kann Pass 1, der einen durch einen an Pass 2 übergebenen Batch geänderten Bereich liest, die in dem Update-Batch von Pass 2 festgelegten Änderungen erkennen.

Hinweis: „ QRhi “ verwaltet die Doppelpufferung transparent, um ein Blockieren der Grafikpipeline zu verhindern. Die Tatsache, dass ein „ QRhiBuffer “ möglicherweise mehrere native Pufferobjekte im Hintergrund enthält, kann bei der Verwendung von „ QRhi “ und „ QRhiResourceUpdateBatch “ getrost ignoriert werden.

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

Stellt die Aktualisierung eines Bereichs eines „ QRhiBuffer “ buf in die Warteschlange, der mit dem Typ „ QRhiBuffer::Dynamic “ erstellt wurde.

data wird bei dieser Überladung in den Batch verschoben, anstatt kopiert zu werden.

Dies ist eine überladene Funktion.

Diese Funktion wurde in Qt 6.10 eingeführt.

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

Stellt die Aktualisierung eines Bereichs eines QRhiBuffer buf in die Warteschlange, der 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 wird kopiert und kann nach der Rückkehr dieser Funktion bedenkenlos gelöscht oder geändert werden.

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

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

data wird bei dieser Überladung in den Batch verschoben, anstatt kopiert zu werden.

data `size` muss der Größe von ` buf` entsprechen.

Dies ist eine überladene Funktion.

Diese Funktion wurde in Qt 6.10 eingeführt.

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

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

Dies ist eine überladene Funktion.

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

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

data wird bei dieser Überladung in den Batch verschoben, anstatt kopiert zu werden.

Dies ist eine überladene Funktion.

Diese Funktion wurde in Qt 6.10 eingeführt.

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

Stellt das Hochladen der Bilddaten für Mip-Ebene 0 von Ebene 0 der Textur tex in die Warteschlange.

tex muss ein unkomprimiertes Format haben. Das Format muss außerdem mit der Funktion ` QImage::format()` von ` image` kompatibel sein. Die Quelldaten sind in ` image` angegeben.

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

Stellt das Hochladen der Bilddaten für eine oder mehrere Mip-Stufen in einer oder mehreren Ebenen der Textur tex in die Warteschlange.

Die Details des Kopiervorgangs (Quell QImage oder komprimierte Texturdaten, Bereiche, Zielebenen und -stufen) werden unter desc beschrieben.

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