QVulkanWindowRenderer Class
QVulkanWindowRendererクラスは、アプリケーション固有のレンダリングロジックを実装するために使用されます。QVulkanWindow... 続きを読む
Header: | #include <QVulkanWindowRenderer> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake: | QT += gui |
パブリック関数
virtual | ~QVulkanWindowRenderer() |
virtual void | initResources() |
virtual void | initSwapChainResources() |
virtual void | logicalDeviceLost() |
virtual void | physicalDeviceLost() |
virtual void | preInitResources() |
virtual void | releaseResources() |
virtual void | releaseSwapChainResources() |
virtual void | startNextFrame() = 0 |
詳細説明
アプリケーションは通常、QVulkanWindow と QVulkanWindowRenderer の両方をサブクラス化します。前者は入力などのイベントを処理し、後者はアプリケーションのレンダリングを構成するVulkanリソース管理とコマンドバッファの構築を実装します。
イベント処理に加えて、QVulkanWindow サブクラスは、QVulkanWindow::createRenderer() の実装も提供する責任があります。ここでウィンドウとレンダラーが接続される。一般的な実装では、QVulkanWindowRendererのサブクラスの新しいインスタンスを作成します。
メンバ関数の説明
[virtual noexcept]
QVulkanWindowRenderer::~QVulkanWindowRenderer()
仮想デストラクタです。
[virtual]
void QVulkanWindowRenderer::initResources()
この仮想関数は、レンダラーのグラフィックス リソースを作成するときに呼び出されます。
この関数は、QVulkanWindow::PersistentResources フラグやデバイスが失われた状況などによって、QVulkanWindow の有効期間中に複数回呼び出されることがあります。ただし、その後に呼び出される場合は、必ずreleaseResources() が呼び出されます。
device()、graphicsQueue()、graphicsCommandPool()などのアクセッサは、この関数の内部と、その後releaseResources()が呼び出されるまでの間のみ、有効な値を返すことが保証されます。
デフォルトの実装は空です。
[virtual]
void QVulkanWindowRenderer::initSwapChainResources()
この仮想関数は、スワップチェーン、フレームバッファ、またはレンダーパスに関連する初期化を実行できるときに呼び出されます。スワップチェーンと関連リソースは、ウィンドウのサイズ変更イベントに応答してリセットされ、その後再作成されます。したがって、initResources ()とreleaseResources ()の呼び出しのペアは、その間にinitSwapChainResources()とreleaseSwapChainResources ()の呼び出しの複数の呼び出しを持つことができます。
QVulkanWindow::swapChainImageSize() のようなアクセサは、この関数の内部でのみ有効な値を返すことが保証され、その後はreleaseSwapChainResources() が呼び出されるまで有効です。
また、この関数は事実上リサイズのたびに呼び出されるため、サイズに依存する計算(たとえば投影行列)を行うべき場所でもあります。
デフォルトの実装は空です。
[virtual]
void QVulkanWindowRenderer::logicalDeviceLost()
この仮想関数は、論理デバイス(VkDevice)が失われたとき、つまりVK_ERROR_DEVICE_LOST
で何らかの操作が失敗したときに呼び出されます。
デフォルトの実装は空です。
通常、この関数で特別な処理を行う必要はない。QVulkanWindow は自動的にすべてのリソースを解放し(必要に応じてreleaseSwapChainResources() とreleaseResources() を呼び出す)、新しいデバイスを取得して再初期化を試みる。物理デバイスも失われた場合、この再初期化の試みは、physicalDeviceLost()となる。
physicalDeviceLost()も参照のこと 。
[virtual]
void QVulkanWindowRenderer::physicalDeviceLost()
この仮想関数は、物理デバイスが失われたとき、つまり論理デバイスの作成が失敗したときに、VK_ERROR_DEVICE_LOST
で呼び出される。
デフォルトの実装は空である。
QVulkanWindow は一定時間後に自動的に初期化を再試行するため、通常、この関数で特別な処理を行う必要はない。
logicalDeviceLost()も参照 。
[virtual]
void QVulkanWindowRenderer::preInitResources()
この仮想関数は、initResources() を呼び出すことになるグラフィックスの初期化が始まる直前に呼び出されます。
通常、この関数を再実装する必要はない。しかし、物理的なデバイスとサーフェスの両方に基づいて判断するケースもある。Vulkanサーフェスはその段階では取得できないため、これらは通常、QVulkanWindow を可視化する前に実行することはできません。
代わりに、アプリケーションはこの関数を再実装できます。ここでは、QVulkanWindow::physicalDevice ()とQVulkanInstance::surfaceForWindow ()の両方が機能していますが、それ以上の論理デバイスの初期化はまだ行われていません。
デフォルトの実装は空である。
[virtual]
void QVulkanWindowRenderer::releaseResources()
この仮想関数は、レンダラーのグラフィックスリソースを解放する必要があるときに呼び出されます。
実装では、この関数の呼び出しの後に、initResources ()が呼び出される可能性があることを覚悟しなければならない。
QVulkanWindow は、この関数を呼び出す前後にデバイスがアイドルになるのを待つ処理を行います。
デフォルトの実装は空である。
[virtual]
void QVulkanWindowRenderer::releaseSwapChainResources()
この仮想関数は、スワップチェーン、フレームバッファ、またはレンダーパス関連のリソースを解放する必要があるときに呼び出されます。
実装では、この関数の呼び出しの後に、initSwapChainResources ()を新たに呼び出す可能性があることを覚悟しなければならない。
QVulkanWindow は、この関数を呼び出す前と呼び出した後にデバイスがアイドルになるのを待ちます。
デフォルトの実装は空である。
注意: この関数は、QVulkanWindow がリソースの解放を開始する前に、すべてのグラフィッ クス・リソースがそのままの状態で動作する最後の場所です。したがって、非同期でマルチスレッドの可能性があるstartNextFrame() を持つ実装では、保留中のフレーム送信がある場合に備えて、この関数から戻る前にブロッキング待機を実行し、QVulkanWindow::frameReady() を呼び出すことが不可欠です。
[pure virtual]
void QVulkanWindowRenderer::startNextFrame()
この仮想関数は、次のフレームの描画コールがコマンドバッファに追加されるときに呼び出されます。
この関数を呼び出すたびに、QVulkanWindow::frameReady ()を呼び出す必要があります。これを行わないと、描画ループが停止します。この呼び出しは、この関数から戻った後で行うこともできます。つまり、非同期作業を開始し、その作業が終了したときにのみコマンドバッファを更新してQVulkanWindow に通知することが可能です。
この関数が呼び出されたとき、すべてのVulkanリソースは初期化され、準備ができています。現在のフレームバッファとメインコマンドバッファは、QVulkanWindow::currentFramebuffer ()とQVulkanWindow::currentCommandBuffer ()を介して取得できます。論理デバイスとアクティブなグラフィックキューは、QVulkanWindow::device() とQVulkanWindow::graphicsQueue() を介して利用できます。実装は、QVulkanWindow::graphicsCommandPool() によって返されたプールから、追加のコマンド・バッファを作成することができる。便宜上、ホストの可視インデックスとデバイスのローカル・メモリ・タイプ・インデックスが、QVulkanWindow::hostVisibleMemoryIndex() とQVulkanWindow::deviceLocalMemoryIndex() を介して公開されている。これらのアクセサはすべて、どのスレッドからも安全に呼び出すことができる。
QVulkanWindow::frameReady() とQVulkanWindowも参照して ください。
本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。