QRhiResourceUpdateBatch Class
アップロードとコピーの操作を記録する。さらに...
ヘッダ | #include <rhi/qrhi.h> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) 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) |
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 へのテクスチャ間コピー操作をエンキューします。
注記: ソーステクスチャsrc はQRhiTexture::UsedAsTransferSource で作成する必要があります。
注: テクスチャのフォーマットは一致していなければなりません。ほとんどのグラフィックスAPIでは、データはフォーマット変換なしでそのままコピーされます。dst とsrc が異なるフォーマットで作成された場合、特定できない問題が発生する可能性があります。
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 batch 、starting a new one 。
void QRhiResourceUpdateBatch::merge(QRhiResourceUpdateBatch *other)
キューに入れられたすべての操作を、other バッチからこのバッチにコピーする。
release注意: other は、マージ操作の後、もはや有効なデータを含んでいない可能性がある。
これによって、初期化ステップですでに判明しているリソースの更新をバッチに集め、後で最初のレンダーパスを開始するときに別のバッチにマージするという便利なパターンが可能になる:
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つのレイヤー(キューブマップ面または3Dスライスまたはテクスチャ配列要素)の1つのmipレベルがコピーされます。レベルとレイヤはrb の各フィールドで指定します。
readBackBuffer() およびQRhi::resourceLimit()も参照してください 。
void QRhiResourceUpdateBatch::release()
バッチをプールに戻す。これは、バッチがQRhiCommandBuffer::beginPass()、QRhiCommandBuffer::endPass()、QRhiCommandBuffer::resourceUpdate() のいずれにも渡されない場合にのみ使用する。
注意: QRhiResourceUpdateBatch インスタンスは、アプリケーションによって決してdeleted
してはならない。
void QRhiResourceUpdateBatch::updateDynamicBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data)
QRhiBuffer::Dynamic 型で作成されたQRhiBuffer buf の領域の更新をエンキューする。
領域はoffset とsize で指定される。実際に書き込むバイトは、data で指定される。 は、少なくともsize バイトが利用可能でなければならない。data は、この関数が返ると安全に破棄または変更できる。
注意: ホストからの書き込みが含まれる場合(updateDynamicBuffer()の場合)、そのようなバッファはほとんどのバックエンドでホストの可視メモリによってバックアップされるのが一般的であるため、フレーム内に蓄積される可能性があります。そのため、パス 2 に渡されたバッチによって変更された領域を読むパス 1 は、パス 2 の更新バッチで指定された変更を見る可能性があります。
注: QRhi は、グラフィックス・パイプラインのストールを防ぐために、二重バッファリングを透過的に管理します。QRhiBuffer の下に複数のネイティブバッファオブジェクトがあっても、QRhi とQRhiResourceUpdateBatch を使用すれば、安全に無視することができます。
void QRhiResourceUpdateBatch::uploadStaticBuffer(QRhiBuffer *buf, quint32 offset, quint32 size, const void *data)
QRhiBuffer::Immutable またはQRhiBuffer::Static タイプで作成されたQRhiBuffer buf の領域を更新するエンキュー。
領域はoffset とsize で指定される。書き込む実際のバイトは、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 に記載されています。
© 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.