QVulkanWindow Class
QVulkanWindow クラスは、Vulkan レンダリングを実行するためのQWindow の便利なサブクラスです。詳細...
Header: | #include <QVulkanWindow> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake: | QT += gui |
Inherits: | QWindow |
パブリックタイプ
(since 6.7) | EnabledFeatures2Modifier |
EnabledFeaturesModifier | |
enum | Flag { PersistentResources } |
flags | Flags |
QueueCreateInfoModifier |
パブリック関数
QVulkanWindow(QWindow *parent = nullptr) | |
virtual | ~QVulkanWindow() |
QList<VkPhysicalDeviceProperties> | availablePhysicalDevices() |
QMatrix4x4 | clipCorrectionMatrix() |
VkFormat | colorFormat() const |
int | concurrentFrameCount() const |
virtual QVulkanWindowRenderer * | createRenderer() |
VkCommandBuffer | currentCommandBuffer() const |
int | currentFrame() const |
VkFramebuffer | currentFramebuffer() const |
int | currentSwapChainImageIndex() const |
VkRenderPass | defaultRenderPass() const |
VkFormat | depthStencilFormat() const |
VkImage | depthStencilImage() const |
VkImageView | depthStencilImageView() const |
VkDevice | device() const |
uint32_t | deviceLocalMemoryIndex() const |
QVulkanWindow::Flags | flags() const |
void | frameReady() |
QImage | grab() |
VkCommandPool | graphicsCommandPool() const |
VkQueue | graphicsQueue() const |
uint32_t | graphicsQueueFamilyIndex() const |
uint32_t | hostVisibleMemoryIndex() const |
bool | isValid() const |
VkImage | msaaColorImage(int idx) const |
VkImageView | msaaColorImageView(int idx) const |
VkPhysicalDevice | physicalDevice() const |
const VkPhysicalDeviceProperties * | physicalDeviceProperties() const |
VkSampleCountFlagBits | sampleCountFlagBits() const |
void | setDeviceExtensions(const QByteArrayList &extensions) |
(since 6.7) void | setEnabledFeaturesModifier(const QVulkanWindow::EnabledFeaturesModifier &modifier) |
(since 6.7) void | setEnabledFeaturesModifier(QVulkanWindow::EnabledFeatures2Modifier modifier) |
void | setFlags(QVulkanWindow::Flags flags) |
void | setPhysicalDeviceIndex(int idx) |
void | setPreferredColorFormats(const QList<VkFormat> &formats) |
void | setQueueCreateInfoModifier(const QVulkanWindow::QueueCreateInfoModifier &modifier) |
void | setSampleCount(int sampleCount) |
QVulkanInfoVector<QVulkanExtension> | supportedDeviceExtensions() |
QList<int> | supportedSampleCounts() |
bool | supportsGrab() const |
VkImage | swapChainImage(int idx) const |
int | swapChainImageCount() const |
QSize | swapChainImageSize() const |
VkImageView | swapChainImageView(int idx) const |
シグナル
void | frameGrabbed(const QImage &image) |
静的パブリックメンバー
const int | MAX_CONCURRENT_FRAME_COUNT |
詳細説明
QVulkanWindowは、Vulkanデバイス、グラフィックキュー、コマンドプールとバッファ、デプスステンシルイメージ、ダブルバッファFIFOスワップチェーンを管理するVulkan対応のQWindow 、リサイズのようなイベント、グラフィックとプレゼンテーションの両方をサポートするデバイスキューがないような特殊な状況、デバイスロストのシナリオ、レンダリングされたコンテンツの読み取りのような追加機能に関して正しい動作を行います。概念的には、Vulkanの世界におけるQOpenGLWindow 。
注意: QVulkanWindowは、高度なユースケースでは必ずしも十分ではないため、完全なカスタムQWindow サブクラスを実装する必要性を常に排除するわけではありません。
QVulkanWindowは、QWidget::createWindowContainer ()を介して、QWidget-ベースのユーザーインターフェイスに埋め込むことができます。しかし、この方法にはいくつかの制限があります。documentation 。
QVulkanWindowを使用した典型的なアプリケーションは以下のようになります:
class VulkanRenderer : public QVulkanWindowRenderer { public: VulkanRenderer(QVulkanWindow *w) : m_window(w), m_devFuncs(nullptr) { } void initResources() override { m_devFuncs = m_window->vulkanInstance()->deviceFunctions(m_window->device()); // .. } void initSwapChainResources() override { /* ... */ } void releaseSwapChainResources() override { /* ... */ } void releaseResources() override { /* ... */ } void startNextFrame() override { VkCommandBuffer cmdBuf = m_window->currentCommandBuffer(); // ... m_devFuncs->vkCmdBeginRenderPass(commandBuffer, renderPassBegin, contents); // ... m_window->frameReady(); } private: QVulkanWindow *m_window; QVulkanDeviceFunctions *m_devFuncs; }; class VulkanWindow : public QVulkanWindow { public: QVulkanWindowRenderer *createRenderer() override { return new VulkanRenderer(this); } }; int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QVulkanInstance inst; // enable the standard validation layers, when available inst.setLayers({ "VK_LAYER_KHRONOS_validation" }); if (!inst.create()) qFatal("Failed to create Vulkan instance: %d", inst.errorCode()); VulkanWindow w; w.setVulkanInstance(&inst); w.showMaximized(); return app.exec(); }
この例でわかるように、QVulkanWindowの主な使用パターンは次のとおりです:
- QVulkanInstance はQWindow::setVulkanInstance() を介して関連付けられます。QWindow::vulkanInstance は () を介して関連付けられ、 () を介してどのスレッドからでも取得できます。
- QVulkanInstance と同様に、デバイスの拡張機能は、実際の初期化の前にsupportedDeviceExtensions() で問い合わせることができます。拡張機能を有効にするリクエストは、setDeviceExtensions() を使って行う。このような呼び出しは、ウィンドウが表示される前、つまりshow() や同様の関数を呼び出す前に行う必要がある。サポートされていない拡張機能のリクエストは、潔く無視される。
- レンダラーはQVulkanWindowRenderer サブクラスで実装され、そのインスタンスはcreateRenderer() ファクトリー関数で作成されます。
- コアVulkanコマンドは、QVulkanFunctions オブジェクトを介して公開され、QVulkanInstance::functions() を呼び出すことで取得できます。デバイスレベルの関数は、QVulkanInstance::deviceFunctions ()を呼び出してVkDeviceを作成した後に使用できます。
- 次のフレームの描画コールのビルドはQVulkanWindowRenderer::startNextFrame() で行われます。実装では、currentCommandBuffer ()から返されたコマンドバッファにコマンドを追加することが期待されます。この関数から戻っても、コマンドを送信する準備ができたことにはなりません。むしろ、frameReady ()を明示的に呼び出す必要がある。これにより、複数のスレッドでコマンドを非同期に生成できる。単純な実装では、QVulkanWindowRenderer::startNextFrame ()の最後にframeReady ()を呼び出すだけです。
- 基本的なVulkanリソース(物理デバイス、グラフィックキュー、コマンドプール、ウィンドウのメインコマンドバッファ、画像フォーマットなど)は、QVulkanWindow上で軽量なゲッター関数を介して公開されます。これらのいくつかは便宜的なものであり、アプリケーションは常に自由にVulkan APIを介して直接追加リソースを照会、作成、管理できます。
- レンダラーは、ウィンドウ自体のように、gui/メインスレッドに住んでいます。このスレッドは、スワップ間隔が1のOpenGLがどのように動作するかと同様に、プレゼンテーションレートにスロットルされます。しかし、レンダラーの実装は、適切と思われる方法で自由に複数のスレッドを利用することができる。vulkanInstance ()、currentCommandBuffer ()などのアクセサは、どのスレッドからでも呼び出すことができる。メインコマンドバッファの送信、プレゼントのキューイング、次のフレームの構築は、gui/メインスレッドでframeReady ()が呼び出されるまで開始されない。
- ウィンドウが表示されると、内容は自動的に更新される。さらなる更新は、QWindow::requestUpdate ()を呼び出すことで要求できる。連続的にレンダリングするには、frameReady() の後にrequestUpdate() を呼び出す。
トラブルシューティングを行うには、ロギング・カテゴリqt.vulkan
を有効にします。重大なエラーは、qWarning() を介して自動的に出力されます。
OpenGLとVulkanの座標系の違い
注意すべき2つの顕著な違いがあります:まず、VulkanのY軸はクリップ空間でスクリーンの下を指しますが、OpenGLは上向きのY軸を使用します。第二に、標準的なOpenGLの投影行列は、-1と1の近・遠平面値を想定していますが、Vulkanは0と1を好みます。
頂点データでY座標を反転させることなく、アプリケーションがOpenGLベースのコードから移行できるようにするため、また、VulkanビューポートのminDepthとmaxDepthを0と1に設定したまま、QMatrix4x4::perspective ()のようなQMatrix4x4 関数を使用できるようにするため、QVulkanWindowは、clipCorrectionMatrix ()を呼び出すことで取得可能な補正行列を提供します。
マルチサンプリング
デフォルトでは無効になっていますが、QVulkanWindow ではマルチサンプル・アンチエイリアシングが完全にサポートされています。追加のカラーバッファとスワップチェーンの非マルチサンプルバッファへの解決はすべて自動的に管理されます。
サポートされているサンプル数を問い合わせるには、supportedSampleCounts()を呼び出します。返されたセットに4、8、...が含まれている場合、これらの値のいずれかをsetSampleCount() に渡すと、マルチサンプルレンダリングが要求されます。
注: QSurfaceFormat::setSamples ()とは異なり、サポートされるサンプル数のリストは事前にアプリケーションに公開されるため、setSampleCount ()で自動的に低いサンプル数にフォールバックすることはない。要求された値がサポートされていない場合、警告が表示され、マルチサンプリングは使用されません。
画像の読み戻し
supportsGrab() が true を返すと、QVulkanWindow はカラーバッファからQImage へのリードバックを実行できます。grab() は低速で非効率な処理なので、頻繁な使用は避けるべきです。とはいえ、アプリケーションでスクリーンショットを撮ったり、GPUレンダリングの出力を処理して検証するためのツールやテストができるので、貴重な機能です。
sRGBのサポート
スワップチェーンの画像フォーマットに関しては、多くのアプリケーションはQVulkanWindowのデフォルトの動作で問題ないでしょうが、setPreferredColorFormats ()では、事前に定義されたフォーマットを要求することができます。これは特にsRGB色空間で作業する場合に便利です。VK_FORMAT_B8G8R8A8_SRGB
のようなフォーマットを渡すと、利用可能な場合はsRGBフォーマットが選択されます。
検証レイヤー
アプリケーション開発中、Vulkan検証レイヤーを有効にすることは非常に有益です。上記のコード例に示すように、QVulkanInstance::create ()の前にQVulkanInstance ()でQVulkanInstance::setLayers ()を呼び出すと、システム内のVulkanドライバスタックが必要なレイヤーを含んでいると仮定して、検証が有効になります。
注: プラットフォーム固有の違いに注意してください。デスクトッププラットフォームでは、Vulkan SDKをインストールするだけで通常は十分です。しかし、例えばAndroidでは、アプリケーションと一緒に追加の共有ライブラリをデプロイする必要があり、また、検証レイヤ名の異なるリストが必要です。詳細については、Android Vulkan開発ページを参照してください。
注: QVulkanWindowはデバイスレイヤーを公開しません。この機能はVulkan APIのバージョン1.0.13以降、非推奨となっているからです。
レイヤー、デバイス機能、拡張機能
インスタンス レイヤーを有効にするには、QVulkanInstance を作成する前にQVulkanInstance::setLayers() を呼び出します。どのインスタンス レイヤーが使用可能かを問い合わせるには、QVulkanInstance::supportedLayers() を呼び出します。
デバイス拡張機能を有効にするには、QVulkanWindowのセットアップの初期段階でsetDeviceExtensions ()を呼び出します。どのデバイス拡張が使用可能か問い合わせるには、supportedDeviceExtensions() をコールしてください。
サポートされていないレイヤーや拡張機能を指定しても、インスタンスやデバイスの作成は失敗しませんが、レイヤーや拡張機能のリクエストは無視されます。
デバイス機能に関しては、QVulkanWindow は vkGetPhysicalDeviceFeatures() からサポートされていると報告されたすべての Vulkan 1.0 機能を有効にします。このルールの例外として、robustBufferAccess
は決して有効になりません。その機能を有効にしたい場合は、後述のコールバックメカニズムを使用してください。
これは常に望ましいとは限らず、Vulkan 1.1以降では不十分な場合があります。そのため、setEnabledFeaturesModifier() でコールバック関数を登録することで、デバイスの作成に使用される VkPhysicalDeviceFeatures を完全に制御することも可能です。設定されるとコールバック関数が呼び出され、VkPhysicalDeviceFeatures または VkPhysicalDeviceFeatures2 を変更できます。
QVulkanInstance およびQWindowも参照してください 。
メンバ型ドキュメント
[since 6.7]
QVulkanWindow::EnabledFeatures2Modifier
VkDeviceCreateInfo に変更された VkPhysicalDeviceFeatures2 を変更するためにグラフィックスの初期化中に呼び出される関数です。
デフォルトでは、QVulkanWindow 、特定の例外を除き、物理デバイスがサポートされていると報告するすべてのVulkan 1.0コア機能を有効にします。実際には、予期せぬパフォーマンスの低下を避けるため、robustBufferAccess
は常に無効になっています。
しかし、Vulkan 1.1、1.2、または1.3の機能や拡張機能を使用する場合、これは必ずしも十分ではありません。そのため、このコールバックメカニズムがあります。実行時にVulkan 1.0のみが関連する場合は、代わりにsetEnabledFeaturesModifier() を使用してください。
VkPhysicalDeviceFeatures2リファレンスは、sType
が設定されたコールバック関数に渡されますが、残りはゼロになります。メンバを true に変更したり、pNext
チェーンを設定したりするのは関数次第です。
注: pNext
チェーンを設定する場合、参照されるオブジェクトの寿命が十分長いことを確認してください。たとえば、QVulkanWindow サブクラスのメンバ変数として格納します。
この型定義はQt 6.7で導入された。
setEnabledFeaturesModifier()も参照してください 。
QVulkanWindow::EnabledFeaturesModifier
グラフィックスの初期化中に呼び出され、Vulkan デバイスオブジェクトの作成時に渡される VkPhysicalDeviceFeatures を変更する関数です。
デフォルトでは、QVulkanWindow 、特定の例外を除いて、物理デバイスがサポートされていると報告するすべてのVulkan 1.0コア機能を有効にします。実際には、予期しないパフォーマンスのヒットを避けるために、robustBufferAccess
は常に無効になっています。
渡された VkPhysicalDeviceFeatures リファレンスは、関数が呼び出された時点ですべてゼロになります。適切と思われるようにメンバを変更するかどうかは関数次第です。
注意: Vulkan 1.1、1.2、または1.3の機能を制御するには、代わりにEnabledFeatures2Modifier 。
setEnabledFeaturesModifier()も参照してください 。
enum QVulkanWindow::Flag
flags QVulkanWindow::Flags
この enum は、setFlags() に渡すことができるフラグを記述します。
定数 | 値 | 説明 |
---|---|---|
QVulkanWindow::PersistentResources | 0x01 | ウィンドウが非露出状態になったときに、グラフィックス リソースが解放されないようにします。デフォルトの動作は、すべてを解放し、再び見えるようになったときに後で再初期化することです。 |
Flags 型はQFlags<Flag> の typedef です。これはFlag値のORの組み合わせを格納します。
QVulkanWindow::QueueCreateInfoModifier
作成すべき追加キューを追加するために、グラフィックスの初期化中に呼び出される関数。
レンダラーがデフォルトのグラフィックスキュー以外に追加のキューを必要とする場合に設定します(転送キューなど)。提供されるキューファミリプロパティを使用して、追加キューのインデックスを選択することができます。その後、レンダラーは initResources() で実際のキューを要求することができます。
注意: 追加のグラフィックキューを要求する場合、Qt 自身は常にグラフィックキューを要求します。追加キューを取得するには、queueCreateInfoで適切なエントリを検索し、それを操作する必要があります。
setQueueCreateInfoModifier()も参照してください 。
メンバ関数ドキュメント
[explicit]
QVulkanWindow::QVulkanWindow(QWindow *parent = nullptr)
与えられたparent で新しい QVulkanWindow を構築します。
表面タイプはQSurface::VulkanSurface に設定されます。
[virtual noexcept]
QVulkanWindow::~QVulkanWindow()
デストラクタ。
QList<VkPhysicalDeviceProperties> QVulkanWindow::availablePhysicalDevices()
システムでサポートされている物理デバイスのプロパティのリストを返します。
注意: この関数はウィンドウを表示する前に呼び出すことができます。
QMatrix4x4 QVulkanWindow::clipCorrectionMatrix()
OpenGLとVulkan間の座標系の違いを補正するために使用できるQMatrix4x4 。
この行列で投影行列を事前乗算することで、アプリケーションは Y が上向きであると仮定し続けることができ、頂点 Z の位置をさらに補正することなく、ビューポートの minDepth と maxDepth をそれぞれ 0 と 1 に設定できます。OpenGLアプリケーションからのジオメトリは、OpenGLのカリングと前面設定に一致するラスタライズ状態を前提として、そのまま使用できます。
VkFormat QVulkanWindow::colorFormat() const
スワップチェーンが使用するカラーバッファ形式を返します。
注意: この関数の呼び出しは、QVulkanWindowRenderer::initResources() の呼び出しからQVulkanWindowRenderer::releaseResources() までの間のみ有効です。
setPreferredColorFormats()も参照 。
int QVulkanWindow::concurrentFrameCount() const
同時にアクティブになる可能性のあるフレーム数を返します。
注意: この値は、QVulkanWindow の有効期間中、一定である。
class Renderer { void startNextFrame(); // ... VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT]; QVulkanWindow *m_window = nullptr; }; void Renderer::startNextFrame() { const int count = m_window->concurrentFrameCount(); // for (int i = 0; i < count; ++i) // m_uniformBufInfo[i] = ... // ... }
currentFrame()も参照 。
[virtual]
QVulkanWindowRenderer *QVulkanWindow::createRenderer()
QVulkanWindowRenderer の新しいインスタンスを返す。
この仮想関数は、ウィンドウの有効期間中に一度だけ呼び出されます。
デフォルトの実装は null を返すため、バッファのクリア以外にレンダリングは行われません。
ウィンドウは返されたレンダラー オブジェクトの所有権を持ちます。
VkCommandBuffer QVulkanWindow::currentCommandBuffer() const
戻り値 現在のスワップチェーンイメージのアクティブなコマンドバッファ。QVulkanWindowRenderer::startNextFrame() の実装では、このコマンドバッファにコマンドが追加されます。
注意: この関数は startNextFrame() 内からのみ呼び出す必要があり、非同期コマンド生成の場合はframeReady() を呼び出すまで呼び出す必要があります。
int QVulkanWindow::currentFrame() const
現在のフレームインデックスを [0,concurrentFrameCount() - 1] の範囲で返します。
レンダラの実装では、フレーム N が、まだアクティブなフレーム N - 1、N - 2、...によって使用されるデータを変更するのを防ぐために、均一なデータやその他の動的リソースが複数のコピーで存在するようにする必要があります。N -concurrentFrameCount() + 1。
動的な配列サイズに依存することを避けるため、アプリケーションは配列を宣言する際にMAX_CONCURRENT_FRAME_COUNT を使用することができます。これは、concurrentFrameCount ()から返される値と常に等しいか、それ以上であることが保証されている。このような配列は、この関数から返される値でインデックスを付けることができる。
class Renderer { void startNextFrame(); // ... VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT]; QVulkanWindow *m_window = nullptr; }; void Renderer::startNextFrame() { VkDescriptorBufferInfo &uniformBufInfo(m_uniformBufInfo[m_window->currentFrame()]); // ... }
注意: この関数は、startNextFrame() 内からのみ呼び出す必要があり、非同期コマンド生成の場合は、frameReady() を呼び出すまで呼び出す必要があります。
concurrentFrameCount()も参照 。
VkFramebuffer QVulkanWindow::currentFramebuffer() const
デフォルトのレンダーパスを使用して、現在のスワップチェーン画像の VkFramebuffer を返します。
フレームバッファは、マルチサンプリングが使用されていない場合は2つのアタッチメント(カラー、デプス-ステンシル)を持ち、sampleCountFlagBits() がVK_SAMPLE_COUNT_1_BIT
より大きい場合は3つのアタッチメント(カラーリゾルブ、デプス-ステンシル、マルチサンプルカラー)を持ちます。 レンダラは、クリア値を提供する場合などに、これを考慮する必要があります。
注意 : アプリケーションは、defaultRenderPass() から返されるレンダーパスを使用する代わりに、独自のレンダーパスを提供する場合、このフレームバッファを使用する必要はありません。
注意: この関数は、startNextFrame() 内からのみ呼び出す必要があり、非同期コマンド生成の場合は、frameReady() を呼び出すまで呼び出す必要があります。
defaultRenderPass()も参照 。
int QVulkanWindow::currentSwapChainImageIndex() const
0,swapChainImageCount() - 1] の範囲で、現在のスワップチェイン画像のインデックスを返す。
注意: この関数は、startNextFrame() 内からのみ呼び出す必要があります。また、非同期コマンド生成の場合は、frameReady() を呼び出すまで呼び出す必要があります。
VkRenderPass QVulkanWindow::defaultRenderPass() const
1つのサブパスを持つ典型的なレンダーパスを返します。
注: アプリケーションは、このレンダーパスを使用する必要はありません。ただし、アプリケーションのカスタムレンダーパスまたはその他の手段によって、現在のスワップチェーンとデプスステンシルイメージがVK_IMAGE_LAYOUT_UNDEFINED
からVK_IMAGE_LAYOUT_PRESENT_SRC_KHR
とVK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
に確実に移行されるようにする責任があります。
注: このレンダーパスでは、ステンシルの読み取り/書き込みは有効になっていません。
注意 : この関数の呼び出しは、QVulkanWindowRenderer::initResources() の呼び出しからQVulkanWindowRenderer::releaseResources() までの間のみ有効である。
currentFramebuffer()も参照 。
VkFormat QVulkanWindow::depthStencilFormat() const
depth-stencilバッファで使用されているフォーマットを返します。
注意: この関数の呼び出しは、QVulkanWindowRenderer::initResources() の呼び出しからQVulkanWindowRenderer::releaseResources() までの間のみ有効である。
VkImage QVulkanWindow::depthStencilImage() const
depth-stencil 画像を返します。
注意: この関数の呼び出しは、QVulkanWindowRenderer::initSwapChainResources() の呼び出しからQVulkanWindowRenderer::releaseSwapChainResources() までの間のみ有効である。
VkImageView QVulkanWindow::depthStencilImageView() const
depth-stencil 画像ビューを返します。
注意: この関数の呼び出しは、QVulkanWindowRenderer::initSwapChainResources()の呼び出しからQVulkanWindowRenderer::releaseSwapChainResources()までの間のみ有効である。
VkDevice QVulkanWindow::device() const
アクティブな論理デバイスを返します。
注意: この関数の呼び出しは、QVulkanWindowRenderer::initResources() からQVulkanWindowRenderer::releaseResources() まで有効です。
uint32_t QVulkanWindow::deviceLocalMemoryIndex() const
一般的な使用に適したデバイス・ローカル・メモリ・タイプ・インデックスを返します。
注意: この関数の呼び出しは、QVulkanWindowRenderer::initResources ()からQVulkanWindowRenderer::releaseResources ()までの間のみ有効である。
注意 :このメモリー・タイプが常に適切であることは保証されない。特にデバイス・ローカル・イメージの場合、vkGetImageMemoryRequirements
から返されるマスクをチェックした後、手動でメモリ・タイプを選択するのが正しい、クロスインプリメンテーションのソリューションです。
QVulkanWindow::Flags QVulkanWindow::flags() const
要求されたフラグを返す。
setFlags()も参照 。
[signal]
void QVulkanWindow::frameGrabbed(const QImage &image)
このシグナルは、image の準備ができたときに発せられる。
void QVulkanWindow::frameReady()
この関数は、QVulkanWindowRenderer::startNextFrame ()実装を呼び出すたびに、1回だけ呼び出されなければならない。この関数が呼び出された時点で、currentCommandBuffer ()を介して公開されているメインコマンドバッファには、必要なすべてのレンダリングコマンドが追加されていなければなりません。
注意: この関数は、QVulkanWindowRenderer の関数が呼び出され、QVulkanWindow インスタンスが存在する、gui/main スレッドからのみ呼び出されなければならない。
QVulkanWindowRenderer::startNextFrame()も参照してください 。
QImage QVulkanWindow::grab()
次のフレームを表示せずにビルドしてレンダリングし、画像コンテンツのブロッキングリードバックを実行します。
レンダラーのstartNextFrame() 実装がframeReady() を直接コールバックする場合は、画像を返す。そうでない場合は、サイズは正しいが内容はまだない、不完全な画像を返します。後者の場合、コンテンツはframeGrabbed() シグナルで配信されます。
返されるQImage のフォーマットは常にQImage::Format_RGBA8888 です。colorFormat() がVK_FORMAT_B8G8R8A8_UNORM
の場合、赤と青のチャンネルは自動的に入れ替わります。このフォーマットは、スワップチェーンカラーバッファのデフォルトの選択として一般的に使用されているからです。その他のカラーバッファ形式では、この関数による変換は行われません。
注意 : この関数は、フレームが進行中(つまり、frameReady() がまだアプリケーションによってコールバックされていない)のときは呼び出されるべきではありません。
注意 :この関数は、追加のブロッキング・リードバックのため、コストが高くなる可能性があります。
注意: この関数は現在、swapchain が転送元 (VK_IMAGE_USAGE_TRANSFER_SRC_BIT
) としての使用をサポートしている必要があります。
VkCommandPool QVulkanWindow::graphicsCommandPool() const
アクティブなグラフィックス・コマンド・プールを返します。
注意: この関数の呼び出しは、QVulkanWindowRenderer::initResources() の呼び出しからQVulkanWindowRenderer::releaseResources() までの間のみ有効である。
VkQueue QVulkanWindow::graphicsQueue() const
アクティブなグラフィック・キューを返します。
注意: この関数の呼び出しは、QVulkanWindowRenderer::initResources() からQVulkanWindowRenderer::releaseResources() まで有効です。
uint32_t QVulkanWindow::graphicsQueueFamilyIndex() const
アクティブなグラフィック・キューのファミリ・インデックスを返します。
注意: この関数の呼び出しは、QVulkanWindowRenderer::initResources() からQVulkanWindowRenderer::releaseResources() まで有効です。QVulkanWindowRenderer::updateQueueCreateInfo()の実装もこの関数を呼び出すことができます。
uint32_t QVulkanWindow::hostVisibleMemoryIndex() const
一般的な使用に適したホスト可視メモリタイプのインデックスを返します。
返されるメモリ型は、ホスト可視であり、かつコヒーレントです。また、可能であればキャッシュされます。
注意: この関数の呼び出しは、QVulkanWindowRenderer::initResources() の呼び出しからQVulkanWindowRenderer::releaseResources() までの間のみ有効です。
bool QVulkanWindow::isValid() const
このウィンドウがスワップチェーンを含むすべてのVulkanリソースの初期化に成功した場合、trueを返します。
注意: 初期化は、ウィンドウが可視化された後の最初のexposeイベントで発生します。
VkImage QVulkanWindow::msaaColorImage(int idx) const
指定されたマルチサンプルカラーイメージ、またはマルチサンプリングが使用されていない場合はVK_NULL_HANDLE
を返します。
idx は [0, () - 1] の範囲でなければなりません。swapChainImageCount
注意: この関数の呼び出しは、QVulkanWindowRenderer::initSwapChainResources ()を呼び出してからQVulkanWindowRenderer::releaseSwapChainResources ()を呼び出すまでのみ有効である。
VkImageView QVulkanWindow::msaaColorImageView(int idx) const
指定されたマルチサンプリング・カラー画像ビューを返します。マルチサンプリングが使用されていない場合はVK_NULL_HANDLE
を返します。
idx は [0, () - 1] の範囲でなければならない。swapChainImageCount
注意: この関数の呼び出しは、QVulkanWindowRenderer::initSwapChainResources ()を呼び出してからQVulkanWindowRenderer::releaseSwapChainResources ()を呼び出すまでのみ有効である。
VkPhysicalDevice QVulkanWindow::physicalDevice() const
アクティブな物理デバイスを返します。
注意: この関数の呼び出しは、QVulkanWindowRenderer::preInitResources() の呼び出しからQVulkanWindowRenderer::releaseResources() までの間のみ有効である。
const VkPhysicalDeviceProperties *QVulkanWindow::physicalDeviceProperties() const
アクティブな物理デバイスのプロパティへのポインタを返します。
注意: この関数の呼び出しは、QVulkanWindowRenderer::preInitResources ()を呼び出してからQVulkanWindowRenderer::releaseResources ()を呼び出すまで有効である。
VkSampleCountFlagBits QVulkanWindow::sampleCountFlagBits() const
現在のサンプルカウントをVkSampleCountFlagBits
の値として返します。
デフォルトのレンダーターゲットをターゲットにする場合は、VkPipelineMultisampleStateCreateInfo
のrasterizationSamples
フィールドをこの値に設定する必要があります。
setSampleCount() およびsupportedSampleCounts()も参照 。
void QVulkanWindow::setDeviceExtensions(const QByteArrayList &extensions)
有効にするデバイスextensions のリストを設定する。
サポートされていない拡張機能は無視される。
swapchain 拡張は常に自動的に追加されるので、このリストに含める必要はない。
注意: この関数は、ウィンドウが表示される前か、遅くともQVulkanWindowRenderer::preInitResources() の中で呼び出す必要があります。
[since 6.7]
void QVulkanWindow::setEnabledFeaturesModifier(const QVulkanWindow::EnabledFeaturesModifier &modifier)
有効なデバイス機能変更関数modifier を設定します。
注: Vulkan 1.1、1.2、または 1.3 機能を制御するには、代わりにEnabledFeatures2Modifier を取るオーバーロードを使用します。
注: modifier は、すべてのメンバーが false に設定された状態でコールバック関数に渡されます。適切と思われるようにメンバーを変更するのは関数次第です。
この関数は Qt 6.7 で導入されました。
EnabledFeaturesModifierも参照して ください。
[since 6.7]
void QVulkanWindow::setEnabledFeaturesModifier(QVulkanWindow::EnabledFeatures2Modifier modifier)
有効なデバイス機能を設定する 修正関数modifier 。
これはオーバーロードされた関数です。
この関数は Qt 6.7 で導入されました。
EnabledFeatures2Modifierも参照して ください。
void QVulkanWindow::setFlags(QVulkanWindow::Flags flags)
提供されたflags に基づいて動作を設定します。
注意: この関数はウィンドウが表示される前か、遅くともQVulkanWindowRenderer::preInitResources() の中で呼ばれなければなりません。
flags()も参照 。
void QVulkanWindow::setPhysicalDeviceIndex(int idx)
インデックスidx を持つ物理デバイスの使用を要求する。このインデックスは、availablePhysicalDevices() から返されたリストに対応する。
デフォルトでは、最初の物理デバイスが使用される。
注意: この関数は、ウィンドウが表示される前、または遅くともQVulkanWindowRenderer::preInitResources() で呼び出されなければならない。
void QVulkanWindow::setPreferredColorFormats(const QList<VkFormat> &formats)
swapchainの優先formats 。
デフォルトでは、アプリケーション優先フォーマットは設定されません。この場合、サーフェスの優先書式が使用されるか、それがない場合はVK_FORMAT_B8G8R8A8_UNORM
が使用される。
formats のリストは順番に並んでいる。最初のフォーマットがサポートされていない場合、2番目のフォーマットが考慮され、以下同様となる。リストのどの書式もサポートしていない場合、動作はデフォルトの場合と同じである。
初期化後に実際のフォーマットを照会するには、colorFormat ()を呼び出します。
注意: この関数は、ウィンドウが表示される前か、遅くともQVulkanWindowRenderer::preInitResources() の中で呼び出す必要があります。
注: QVulkanWindowRenderer::preInitResources ()を再実装することで、サポートされているフォーマットのリストを動的に調べることができる。その場合、サーフェスはQVulkanInstace::surfaceForWindow()で取得可能ですが、この関数は初期化の後期に影響を与えるために安全に呼び出すことができます。
colorFormat()も参照してください 。
void QVulkanWindow::setQueueCreateInfoModifier(const QVulkanWindow::QueueCreateInfoModifier &modifier)
キュー作成情報変更関数modifier を設定します。
QueueCreateInfoModifier も参照 。
void QVulkanWindow::setSampleCount(int sampleCount)
マルチサンプル・アンチエイリアシングを、与えられたsampleCount で要求する。有効な値は 1, 2, 4, 8, ... で、物理デバイスがサポートする最大値までです。
サンプルカウントが1より大きい場合、QVulkanWindow 、単にスワップチェーンの画像をターゲットにするのではなく、マルチサンプルカラーバッファを作成します。マルチサンプルバッファのレンダリングは、各フレームの終了時に非マルチサンプルバッファに分解されます。
サポートされているサンプル数のリストを調べるには、supportedSampleCounts ()を呼び出します。
レンダリングパイプラインを設定する場合は、sampleCountFlagBits() を呼び出して、アクティブなサンプルカウントをVkSampleCountFlagBits
の値として取得します。
注意: この関数は、ウィンドウが表示される前、または遅くともQVulkanWindowRenderer::preInitResources() で呼び出す必要があります。
supportedSampleCounts() およびsampleCountFlagBits()も参照 。
QVulkanInfoVector<QVulkanExtension> QVulkanWindow::supportedDeviceExtensions()
setPhysicalDeviceIndex() で選択された物理デバイスから作成された論理デバイスでサポートされている拡張の リストを返す。
注意: この関数は、ウィンドウを表示する前に呼び出すことができます。
QList<int> QVulkanWindow::supportedSampleCounts()
setPhysicalDeviceIndex() によって選択された物理デバイスを使用するときにサポートされるサンプル数のセットを、ソートされたリストとして返します。
デフォルトでは、QVulkanWindow はサンプル数 1 を使用する。この関数が返すセットとは異なる値(2、4、8、...)を指定してsetSampleCount() を呼び出すことで、マルチサンプルのアンチエイリアシングを要求できる。
注意: この関数は、ウィンドウを表示する前に呼び出すことができる。
setSampleCount()も参照してください 。
bool QVulkanWindow::supportsGrab() const
swapchainが転送元としての使用をサポートしている場合、trueを返す。つまり、grab ()が機能する。
注意: この関数の呼び出しは、QVulkanWindowRenderer::initSwapChainResources() の呼び出しからQVulkanWindowRenderer::releaseSwapChainResources() までの間のみ有効である。
VkImage QVulkanWindow::swapChainImage(int idx) const
指定されたスワップチェーンイメージを返す。
idx は [0, () - 1] の範囲でなければならない。swapChainImageCount
注意: この関数の呼び出しは、QVulkanWindowRenderer::initSwapChainResources ()を呼び出してからQVulkanWindowRenderer::releaseSwapChainResources ()を呼び出すまでのみ有効である。
int QVulkanWindow::swapChainImageCount() const
スワップチェイン内の画像の数を返します。
注意: この関数へのアクセスは、カスタムレンダーパスとフレームバッファを提供する場合に必要です。フレームバッファは現在のスワップチェーンイメージに固有であるため、アプリケーションは複数のフレームバッファを提供する必要があります。
注意: この関数の呼び出しは、QVulkanWindowRenderer::initSwapChainResources ()の呼び出しからQVulkanWindowRenderer::releaseSwapChainResources ()までの間のみ有効です。
QSize QVulkanWindow::swapChainImageSize() const
スワップチェーンの画像サイズを返します。
これは通常ウィンドウのサイズと一致するが、vkGetPhysicalDeviceSurfaceCapabilitiesKHR
が固定サイズを報告している場合は異なることもある。
さらに、いくつかのプラットフォームで、Vulkan が報告するサーフェスサイズが、高 DPI スケーリングがアクティブな場合に異なることが確認されています。つまり、QWindow が報告するsize() とdevicePixelRatio() を乗算した値は、おそらく丸めの違いに起因して、ここから返される値と比較して、1 ピクセル小さいか大きいということです。レンダリングコードはこのことを認識し、関連するレンダリングロジックは、QWindow-報告されたサイズではなく、ここから返された値に基づいていなければなりません。どのピクセルサイズが理論的に正しいかにかかわらず、Vulkanレンダリングは、Vulkan APIが報告したサーフェスサイズにのみ依存しなければなりません。そうでなければ、例えばビューポートを設定するときに、アプリケーションが提供した値がVulkanの観点からアウトオブバウンズになる可能性があるため、検証エラーが発生する可能性があります。
注意: この関数の呼び出しは、QVulkanWindowRenderer::initSwapChainResources() の呼び出しからQVulkanWindowRenderer::releaseSwapChainResources() までの間のみ有効です。
VkImageView QVulkanWindow::swapChainImageView(int idx) const
指定されたスワップチェーンイメージビューを返します。
idx は [0, () - 1] の範囲でなければなりません。swapChainImageCount
注意: この関数の呼び出しは、QVulkanWindowRenderer::initSwapChainResources() からQVulkanWindowRenderer::releaseSwapChainResources() まで有効である。
メンバ変数ドキュメント
const int QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT
この変数は、常にconcurrentFrameCount() の最大値以上の定数値を保持します。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。