QRhiResourceUpdateBatch Class

アップロードとコピーの操作を記録する。詳細...

Header: #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

パブリック関数

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)

詳細説明

QRhi では、コピータイプの操作を任意のタイミングで実行することはできなくなった。その代わりに、そのような操作はすべてバッチに記録され、QRhiCommandBuffer::beginPass ()に渡される。その後、フードの下で何が起こるかは、アプリケーションからは見えません。基礎となる実装は、さまざまな異なる方法でこれらの操作を延期したり、実装したりすることができます。

リソース更新バッチはグラフィックリソースを所有せず、それ自体では実際の操作を行いません。むしろ、更新、アップロード、コピータイプのコマンドのためのコマンドバッファとみなすべきです。

プールから利用可能な空のバッチを取得するには、QRhi::nextResourceUpdateBatch ()を呼び出します。

注: これは互換性保証に制限のあるRHI APIである。詳細はQRhi を参照のこと。

メンバー関数ドキュメント

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

desc で説明されているように、src からdst へのテクスチャ間コピー操作をエンキューします。

Note: ソーステクスチャsrcQRhiTexture::UsedAsTransferSource で作成する必要があります。

注意: テクスチャのフォーマットは一致していなければなりません。ほとんどのグラフィックスAPIでは、データはフォーマット変換なしでそのままコピーされます。dstsrc が異なるフォーマットで作成された場合、特定できない問題が発生する可能性があります。

void QRhiResourceUpdateBatch::generateMips(QRhiTexture *tex)

指定されたテクスチャのミップマップ生成操作をエンキューするtex

2D テクスチャと立方体テクスチャの両方がサポートされています。

注意: テクスチャはQRhiTexture::MipMapped およびQRhiTexture::UsedWithGenerateMips で作成する必要があります。

警告: QRhi は、サポートされているすべてのテクスチャフォーマットに対してミップマッ プを生成できることを保証するものではありません。たとえば、QRhiTexture::RGBA32F は iOS の OpenGL ES 3.0 および Metal ではfilterable フォーマットではないため、ミップマップ生成リクエストは失敗する可能性があります。RGBA8とRGBA16Fは通常フィルタリング可能であるため、ミップマップ生成が必要な場合はこれらのフォーマットを使用することを推奨します。

bool QRhiResourceUpdateBatch::hasOptimalCapacity() const

このバッチにエンキューされたバッファとテクスチャ操作の数が妥当な制限を下回るまでtrueを返します。

このバッチに追加されたバッファおよび/またはテクスチャ操作の数が、ある限界に達したか、または達しそうになると、戻り値はfalseになります。バッチはその後も完全に機能しますが、追加のメモリを割り当てる必要があるかもしれません。したがって、フレームを準備するときにバッファとテクスチャの更新を1つのバッチにたくさん集めるレンダラーは、この関数がfalseを返したときにsubmitting the batchstarting a new one

void QRhiResourceUpdateBatch::merge(QRhiResourceUpdateBatch *other)

other バッチからこのバッチに、キューに入れられたすべての操作をコピーします。

注: other はマージ操作の後、もはや有効なデータを含んでいない可能性があり、提出してはいけませんが、それでもrelease() を呼び出すことで解放する必要があります。

これによって、初期化ステップで既知のリソース更新をバッチに集め、後で最初のレンダーパスを開始するときに別のバッチにマージするという便利なパターンが可能になる:

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)

QRhiBuffer buf のリージョンの読み出しをエンキューする。領域のサイズはバイト単位でsize で指定され、offset は読み込みを開始するバイト単位のオフセットである。

リードバックは非同期である。result には、操作が完了したときに呼び出されるコールバックが含まれている。データはQRhiReadbackResult::data で提供される。成功すると、QByteArray のサイズはsize と等しくなる。失敗すると、QByteArray は空になる。

:QRhiBuffer::UniformBuffer と異なる使用法を持つバッファの読み取りは、QRhi::ReadBackNonUniformBuffer 機能がサポートされていると報告された場合にのみサポートされる。

注: 非同期リードバックは、以下の条件のいずれかが満たされたときに完了が保証される:finish() が呼び出された。または、リードバック操作を発行したフレームを含め、少なくともN フレームがsubmitted され、recording of a new frame が開始された。NQRhi::MaxAsyncReadbackFrames に対して返されたresource limit value である。

readBackTexture()、QRhi::isFeatureSupported()、QRhi::resourceLimit()も参照

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

rb で説明されているように、テクスチャからホストへのコピー操作をエンキューします。

通常、rb はソースとしてQRhiTexture を指定します。しかし、現在のフレームのスワップチェーンがQRhiSwapChain::UsedAsTransferSource で作成された場合、それをリードバックのソースにすることもできます。この場合、rb でテクスチャをNULLに設定しておきます。

他の操作と異なり、ここでの結果はアプリケーションで処理する必要があります。したがって、result 、データだけでなくコールバックも提供します。バッチに対する操作はもともと非同期だからです:

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

注: テクスチャはQRhiTexture::UsedAsTransferSource で作成する必要があります。

注意: マルチサンプルテクスチャはリードバックできません。

注意: リードバックは生のバイトデータを返しますが、これはアプリケーションが適切な方法で解釈できるようにするためです。レンダリングコードのブレンディング設定に注意してください:ブレンディングがプリマルチプライドアルファに依存するように設定されている場合、リードバックの結果もプリマルチプライドとして解釈する必要があります。

注意: 結果の生データを解釈する場合、リードバックはバイト順フォーマットで行われることに注意してください。したがって、RGBA8 テクスチャは、QImage::Format_RGBA8888 のような、バイト順のQImage フォーマットにマップされます。

注意: 非同期リードバックは、以下の条件のいずれかが満たされたときに完了が保証されます:finish() が呼び出された;または、リードバック操作を発行したフレームを含め、少なくともN フレームがsubmitted され、recording of a new frame が開始された(ここで、NQRhi::MaxAsyncReadbackFrames に対して返されたresource limit value である)。

1回のリードバック操作で、1つのレイヤー(キューブマップ面または3Dスライスまたはテクスチャ配列要素)の1つのmipレベルがコピーされます。レベルとレイヤはrb の各フィールドで指定します。

readBackBuffer() およびQRhi::resourceLimit()も参照して ください。

void QRhiResourceUpdateBatch::release()

バッチをプールに返します。これは、QRhiCommandBuffer::beginPass()、QRhiCommandBuffer::endPass()、QRhiCommandBuffer::resourceUpdate() のいずれかにバッチが渡されていない場合にのみ使用する必要があります。これらは暗黙的に destroy() を呼び出すからです。

注意: QRhiResourceUpdateBatch インスタンスは、アプリケーションによって決してdeleted してはならない。

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

QRhiBuffer::Dynamic 型で作成されたQRhiBuffer buf の領域を更新するエンキュー。

領域はoffsetsize で指定される。実際に書き込むバイトは、data で指定される。 は、少なくともsize バイトが利用可能でなければならない。data は、この関数が返ると、安全に破棄または変更できる。

注意: ホストからの書き込みが含まれる場合(updateDynamicBuffer()の場合)、そのようなバッファはほとんどのバックエンドでホストの可視メモリによってバックアップされるのが一般的であるため、フレーム内に蓄積される可能性があります。そのため、パス 2 に渡されたバッチによって変更された領域をパス 1 が読み取ると、パス 2 の更新バッチで指定された変更が表示される可能性があります。

注: QRhi は、グラフィックス・パイプラインのストールを防ぐために、二重バッファリングを透過的に管理します。QRhi およびQRhiResourceUpdateBatch を使用する場合、QRhiBuffer の下に複数のネイティブバッファオブジェクトがあっても、安全に無視することができます。

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

QRhiBuffer::Immutable またはQRhiBuffer::Static タイプで作成されたQRhiBuffer buf の領域を更新するエンキュー。

領域はoffsetsize で指定される。実際に書き込むバイトは、data で指定される。 は、少なくともsize バイトが利用可能でなければならない。data は、この関数が返ると安全に破棄または変更できる。

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

これはオーバーロードされた関数である。

QRhiBuffer::Immutable またはQRhiBuffer::Static の型で作成されたQRhiBuffer buf 全体の更新を待ち行列に入れます。

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

テクスチャのレイヤー0のミップレベル0のイメージデータをアップロードするためにエンキューtex

tex は非圧縮フォーマットでなければなりません。また、そのフォーマットは の () と互換性がなければなりません。ソースデータは で与えられます。image QImage::format image

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

テクスチャの1つまたは複数のレイヤーの1つまたは複数のミップレベルのイメージデータをアップロードするエンキューtex

コピーの詳細(ソースQImage または圧縮テクスチャデータ、リージョン、ターゲットレイヤーとレベル)は、desc で説明されています。

ここに含まれるドキュメントのコントリビューションは、それぞれの所有者の著作権です 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。