このページでは

QRhiResourceUpdateBatch Class

レコードのアップロードおよびコピーといった操作。詳細...

ヘッダー: #include <rhi/qrhi.h>
CMake: find_package(Qt6 REQUIRED COMPONENTS GuiPrivate)
target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate)
qmake: QT += gui-private
以下より: 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)
(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)

詳細な説明

QRhi では、コピー型の操作を任意のタイミングで実行することはできなくなりました。代わりに、そのような操作はすべてバッチとして記録され、通常はQRhiCommandBuffer::beginPass()に渡されます。その後、内部で何が起きているかはアプリケーションからは隠されています。基盤となる実装では、これらの操作をさまざまな方法で遅延させたり実装したりすることができます。

リソース更新バッチは、グラフィックスリソースを所有しておらず、それ自体では実際の操作を実行しません。むしろ、更新、アップロード、およびコピー型のコマンドのためのコマンドバッファとして捉えるべきです。

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

注:これは 互換性の保証が限定的な RHI API です。詳細については、QRhi を参照してください。

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

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

desc に記載されている通り、src からdst へのテクスチャ間コピー操作をキューに登録します。

注: ソーステクスチャ `src ` は 、`QRhiTexture::UsedAsTransferSource` を使用して作成されている必要があります。

注: テクスチャのフォーマットは 一致している必要があります。ほとんどのグラフィックスAPIでは、データはフォーマット変換を行わずにそのままコピーされます。dst とsrc が異なるフォーマットで作成されている場合、予期せぬ問題が発生する可能性があります。

void QRhiResourceUpdateBatch::generateMips(QRhiTexture *tex)

指定されたテクスチャtex に対して、ミップマップ生成操作をキューに登録します。

2D およびキューブテクスチャがサポートされています。1D および 3D テクスチャは、それぞれ `QRhi::OneDimensionalTextureMipmaps ` または `QRhi::ThreeDimensionalTextureMipmaps ` 機能がサポートされていると報告されている場合にサポートされます。

注: テクスチャは 、QRhiTexture::MipMapped およびQRhiTexture::UsedWithGenerateMips を使用して作成されている必要があります。

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

bool QRhiResourceUpdateBatch::hasOptimalCapacity() const

このバッチにキューに入れられたバッファおよびテクスチャ操作の数が、妥当な制限値を下回るまで、trueを返します。

このバッチに追加されたバッファおよび/またはテクスチャ操作の数が、特定の制限に達した、または達しようとしている場合、戻り値は false になります。その後もバッチは完全に機能しますが、追加のメモリを割り当てる必要がある場合があります。 したがって、フレームの準備時に多数のバッファおよびテクスチャの更新を単一のバッチに集約するレンダラーでは、この関数が false を返した際に、submitting the batch およびstarting a new one の使用を検討するとよいでしょう。

void QRhiResourceUpdateBatch::merge(QRhiResourceUpdateBatch *other)

「other 」バッチから、キューに登録されているすべての操作をこのバッチにコピーします。

注: マージ操作の後、「 other 」には 有効なデータが含まれていない可能性があるため、これを送信してはなりませんが、release() を呼び出して解放する必要があります。

これにより、初期化ステップの段階で既に判明しているリソースの更新情報を1つのバッチにまとめ、後で最初のレンダリングパスを開始する際に別のバッチにマージするという、便利な処理が可能になります:

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 が開始された場合です。ここで、N は、QRhi::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 が開始された場合です。ここで、N はQRhi::MaxAsyncReadbackFrames に対して返されたresource limit value です。

1回のリードバック操作では、1つのレイヤーの1ミップレベル(キューブマップの面、3Dスライス、またはテクスチャ配列の要素)が一度にコピーされます。レベルとレイヤーは、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 の領域を更新する処理をキューに入れます。

対象となる領域は、offset およびsize で指定されます。実際に書き込むバイトはdata で指定されますが、この領域には少なくともsize バイトの空き容量が必要です。

data はコピーされたものであり、この関数が返った後は安全に破棄または変更できます。

注: ホスト書き込みが関与する場合( updateDynamicBuffer() では通常、ほとんどのバックエンドでそのようなバッファがホスト可視メモリによって裏付けられているため、これが当てはまります)、それらは 1 フレーム内に蓄積される可能性があります。したがって、パス 1 で、パス 2 に渡されたバッチによって変更された領域を読み取ると、パス 2 の更新バッチで指定された変更が反映されている場合があります。

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

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

このオーバーロードでは、型QRhiBuffer::Dynamic で作成されたQRhiBuffer buf の領域を更新する処理をキューに追加します。 の領域は、コピーされるのではなく、バッチ内に移動されます。

data このオーバーロードでは、コピーされる代わりにバッチ内に移動されます。

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

この関数は Qt 6.10 で導入されました。

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

タイプQRhiBuffer::Immutable またはQRhiBuffer::Static で作成されたQRhiBuffer buf の領域を更新する処理をキューに追加します。

対象となる領域は、offset およびsize で指定されます。実際に書き込むバイトは、data で指定されますが、この領域には少なくともsize バイトの空き容量が必要です。

data はコピーされるため、この関数が返った後は安全に破棄または変更することができます。

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

型QRhiBuffer::Immutable またはQRhiBuffer::Static で作成されたQRhiBuffer buf 全体を更新する処理をキューに追加します。 は、このオーバーロードではコピーされるのではなく、バッチ内に移動されます。

data このオーバーロードでは、コピーされるのではなく、バッチ内に移動されます。

data size はbuf のサイズと等しくなければなりません。

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

この関数は Qt 6.10 で導入されました。

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

タイプQRhiBuffer::Immutable またはQRhiBuffer::Static で作成されたQRhiBuffer buf 全体の更新をキューに追加します。

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

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

このオーバーロードでは、型QRhiBuffer::Immutable またはQRhiBuffer::Static で作成されたQRhiBuffer buf の領域を更新する処理を、コピーするのではなく、バッチに追加します。

data このオーバーロードでは、コピーされる代わりに、データがバッチ内に移動されます。

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

この関数は Qt 6.10 で導入されました。

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

テクスチャ `tex` のレイヤー 0 のミップレベル 0 に対応する画像データのアップロードをキューに登録します。

tex 非圧縮形式である必要があります。また、その形式はimage のQImage::format() と互換性がある必要があります。ソースデータはimage に記載されています。

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

テクスチャtex の 1 つ以上のレイヤーに含まれる 1 つ以上のミップレベルについて、画像データのアップロードをキューに登録します。

コピーの詳細(ソースであるQImage または圧縮されたテクスチャデータ、領域、ターゲットレイヤーおよびレベル)については、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.