このページでは

QVulkanWindow Class

QVulkanWindow クラスは、Vulkan レンダリングを実行するための、QWindow の利便性を高めるサブクラスです。詳細...

ヘッダー: #include <QVulkanWindow>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
継承元: 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)

静的パブリックメンバー

詳細な説明

QVulkanWindowは、Vulkan対応のQWindow であり、Vulkanデバイス、グラフィックスキュー、コマンドプールおよびバッファ、深度・ステンシル画像、ならびにダブルバッファ化されたFIFOスワップチェーンを管理します。また、リサイズなどのイベントや、グラフィックスとプレゼンテーションの両方をサポートするデバイスキューが存在しないといった特殊な状況、 デバイスが失われたシナリオといった特殊な状況、さらにはレンダリングされたコンテンツを読み戻すといった追加機能においても、正しい動作を保証します。概念的には、Vulkanの世界におけるQOpenGLWindow に相当するものです。

注:QVulkanWindow を使用しても、高度なユースケースでは必ずしも十分ではないため、完全にカスタム化された `QWindow ` サブクラスを実装する必要が常になくなるわけではありません。

QVulkanWindowは、QWidget::createWindowContainer()を介してQWidget ベースのユーザーインターフェースに組み込むことができます。ただし、このアプローチにはいくつかの制限があります。必ず事前にdocumentation を熟読してください。

QVulkanWindow を使用する典型的なアプリケーションは、次のようなものになります:

classVulkanRenderer :publicQVulkanWindowRenderer
{
public:
    VulkanRenderer(QVulkanWindow*w): m_window(w),m_devFuncs(nullptr) { }

    voidinitResources() override
    {
        m_devFuncs= m_window->vulkanInstance()->deviceFunctions(m_window->device());
       // ..
    }
    voidinitSwapChainResources() override {/* ... */}
    voidreleaseSwapChainResources() override {/* ... */}
    voidreleaseResources() override {/* ... */}

   voidstartNextFrame() override
    {
        VkCommandBuffer cmdBuf= m_window->currentCommandBuffer();
        // ...
        m_devFuncs->vkCmdBeginRenderPass(commandBuffer,renderPassBegin,contents);
        // ...
        m_window->frameReady();
    }

private:
    QVulkanWindow*m_window;
    QVulkanDeviceFunctions*m_devFuncs;
};

classVulkanWindow :publicQVulkanWindow
{
public:
    QVulkanWindowRenderer*createRenderer() override {
        return newVulkanRenderer(this);
    }
};

intmain(intargc, char *argv[])
{
    QGuiApplication app(argc,argv);

    QVulkanInstance inst;
    // 利用可能な場合は、標準の検証レイヤーを有効にする
    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();

    returnapp.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() などのアクセサは、どのスレッドからでも呼び出すことができます。メインコマンドバッファの送信、present のキューイング、および次のフレームの構築は、GUI/メインスレッドでframeReady() が呼び出されるまで開始されません。
  • ウィンドウが表示されると、コンテンツは自動的に更新されます。さらなる更新は、QWindow::requestUpdate() を呼び出すことで要求できます。継続的にレンダリングを行うには、frameReady() の後にrequestUpdate() を呼び出してください。

トラブルシューティングを行うには、ログカテゴリ `qt.vulkan` を有効にしてください。重大なエラーは、`qWarning()` を通じて自動的に出力されます。

OpenGLとVulkan間の座標系の違い

注意すべき2つの顕著な違いがあります。1つ目は、Vulkanではクリップ空間においてY軸が画面下方向を指すのに対し、OpenGLではY軸が上方向を指すことです。2つ目は、標準的な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 への読み込み(readback)を実行できます。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 を変更できるようになります。

セキュリティに関する考慮事項

QVulkanWindow が使用するすべてのデータは、信頼できるコンテンツであることが想定されています。これには、setDeviceExtensions() に渡されるデバイス拡張機能名、setEnabledFeaturesModifier() およびsetQueueCreateInfoModifier() を通じて登録されたコールバックによって書き込まれるデバイス作成パラメータ、ならびにQVulkanWindowRenderer の実装によって生成されるすべてのレンダリングコンテンツおよび Vulkan コマンドパラメータが含まれます。 Vulkanの実装自体は、信頼されたインプロセス・プラットフォーム依存関係です。詳細については、QVulkanInstance を参照してください。

警告:アプリケーション 開発者は、アプリケーションの一部ではなく、開発者の管理下にもないユーザー提供コンテンツの取り込みを許可する前に、その潜在的な影響を慎重に検討することを推奨します。

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()を使用してください。

sType が設定され、残りのメンバーがすべてゼロに初期化されたVkPhysicalDeviceFeatures2リファレンスがコールバック関数に渡されます。メンバーをtrueに変更するか、適切と判断されるpNext チェーンを設定するかは、関数の処理に委ねられます。

注: pNext チェーンを設定する際は 、参照されるオブジェクトの存続期間が十分に長いことを確認してください。例えば、QVulkanWindow のサブクラス内でそれらをメンバ変数として格納するなどして、存続期間を確保してください。

この typedef は 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

この列挙型は、setFlags() に渡すことができるフラグを表しています。

定数定数名 値説明
QVulkanWindow::PersistentResources0x01ウィンドウが非表示になったときに、グラフィックリソースが解放されないようにします。デフォルトの挙動は、すべてを解放し、再び表示される際に再初期化することです。

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 つのアタッチメント(color、depth-stencil)があり、sampleCountFlagBits() がVK_SAMPLE_COUNT_1_BIT より大きい場合は 3 つ(color resolve、depth-stencil、multisample color)になります。レンダラーは、例えばクリア値を指定する際などに、この点を考慮する必要があります。

注:アプリケーションが 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

深度・ステンシルバッファで使用されているフォーマットを返します。

注:この関数の呼び出しは 、QVulkanWindowRenderer::initResources() の呼び出しからQVulkanWindowRenderer::releaseResources() までの間のみ有効です。

VkImage QVulkanWindow::depthStencilImage() const

深度・ステンシル画像を返します。

注:この関数の呼び出しは 、QVulkanWindowRenderer::initSwapChainResources() の呼び出しからQVulkanWindowRenderer::releaseSwapChainResources() までの間でのみ有効です。

VkImageView QVulkanWindow::depthStencilImageView() const

深度・ステンシル画像ビューを返します。

注:この関数の呼び出しは 、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() を通じて公開されているメインコマンドバッファに、必要なすべてのレンダリングコマンドが追加されている必要があります。これは、この関数がコマンドの送信と現在のコマンドのキューへの追加をトリガーするためです。

注:この関数は 、gui/mainスレッドからのみ呼び出さなければなりません。gui/mainスレッドは、QVulkanWindowRenderer の関数が呼び出され、QVulkanWindow インスタンスが存在する場所です。

QVulkanWindowRenderer::startNextFrame()も参照してください 。

QImage QVulkanWindow::grab()

次のフレームを構築してレンダリングしますが、画面には表示せず、その後、画像コンテンツのブロッキング読み取りを行います。

レンダラーのstartNextFrame()の実装がframeReady()を直接呼び戻す場合、画像を返します。それ以外の場合は、正しいサイズを持つものの、まだコンテンツが含まれていない不完全な画像を返します。後者の場合、コンテンツはframeGrabbed()シグナルを介して配信されます。

返されるQImage は、常にQImage::Format_RGBA8888 のフォーマットを持ちます。colorFormat()がVK_FORMAT_B8G8R8A8_UNORM の場合、このフォーマットはスワップチェーンのカラーバッファのデフォルトとして一般的に使用されるため、赤チャンネルと青チャンネルは自動的に入れ替えられます。その他のカラーバッファフォーマットの場合、この関数による変換は行われません。

注:この関数は 、フレームの処理が進行中(つまり、アプリケーションから `frameReady()` へのコールバックがまだ行われていない状態)のときは呼び出してはなりません。

注:この関数は 、追加のブロッキング読み出しが行われるため、処理コストが高くなる可能性があります。

注:この関数は現在 、スワップチェーンが転送ソース(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を返します。

注:初期化は 、ウィンドウが表示可能になった後の最初のエクスポーズイベント時に実行されます。

VkImage QVulkanWindow::msaaColorImage(int idx) const

指定されたマルチサンプルカラー画像を返します。マルチサンプリングが使用されていない場合は、VK_NULL_HANDLE を返します。

idx は [0,swapChainImageCount() - 1] の範囲内である必要があります。

注:この関数の呼び出しは 、QVulkanWindowRenderer::initSwapChainResources() の呼び出しからQVulkanWindowRenderer::releaseSwapChainResources() までの間のみ有効です。

VkImageView QVulkanWindow::msaaColorImageView(int idx) const

指定されたマルチサンプルカラー画像ビューを返します。マルチサンプリングが使用されていない場合は、VK_NULL_HANDLE を返します。

idx は [0,swapChainImageCount() - 1] の範囲内である必要があります。

注:この関数の呼び出しは 、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)

スワップチェーンの優先形式(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

スワップチェーンが転送元としての使用に対応している場合(つまり、grab() が機能する場合)、true を返します。

注:この関数の呼び出しは 、QVulkanWindowRenderer::initSwapChainResources() の呼び出しからQVulkanWindowRenderer::releaseSwapChainResources() までの間のみ有効です。

VkImage QVulkanWindow::swapChainImage(int idx) const

指定されたスワップチェーンイメージを返します。

idx 値は [0,swapChainImageCount() - 1] の範囲内である必要があります。

注:この関数の呼び出しは 、QVulkanWindowRenderer::initSwapChainResources() の呼び出しからQVulkanWindowRenderer::releaseSwapChainResources() までの間のみ有効です。

int QVulkanWindow::swapChainImageCount() const

スワップチェーン内の画像数を返します。

注: カスタムレンダーパスやフレームバッファを提供する場合、この関数へのアクセス が必要となります。フレームバッファは現在のスワップチェーン画像に固有であるため、アプリケーションは複数のフレームバッファを提供する必要があります。

注:この関数の呼び出しは 、QVulkanWindowRenderer::initSwapChainResources() の呼び出しから、QVulkanWindowRenderer::releaseSwapChainResources() までの間のみ有効です。

QSize QVulkanWindow::swapChainImageSize() const

スワップチェーンの画像サイズを返します。

これは通常、ウィンドウのサイズと一致しますが、vkGetPhysicalDeviceSurfaceCapabilitiesKHR が固定サイズを報告している場合には異なる場合があります。

さらに、一部のプラットフォームでは、高DPIスケーリングが有効になっている場合、Vulkanが報告するサーフェスサイズが異なることが確認されています。つまり、QWindow が報告するsize()にdevicePixelRatio()を乗じた値は、丸め処理の違いによるものと思われるが、ここから返される値と比較して1ピクセル少ないか多いことになります。 レンダリングコードはこの点に留意する必要があり、関連するレンダリングロジックはすべて、ここで返される値に基づいており、決してQWindow で報告されるサイズに基づいてはなりません。理論上どちらのピクセルサイズが正しいかに関わらず、Vulkan レンダリングでは常に Vulkan API が報告するサーフェスサイズのみに依存しなければなりません。 そうしないと、例えばビューポートの設定時などに、Vulkanの観点からアプリケーションが提供する値が範囲外となるため、検証エラーが発生する可能性があります。

注:この関数の呼び出しは 、QVulkanWindowRenderer::initSwapChainResources() の呼び出しから、QVulkanWindowRenderer::releaseSwapChainResources() までの間のみ有効です。

VkImageView QVulkanWindow::swapChainImageView(int idx) const

指定されたスワップチェーンイメージビューを返します。

idx 値は [0,swapChainImageCount() - 1] の範囲内でなければなりません。

注:この関数の呼び出しは 、QVulkanWindowRenderer::initSwapChainResources() の呼び出しからQVulkanWindowRenderer::releaseSwapChainResources() までの間のみ有効です。

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

const int QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT

この変数には、concurrentFrameCount() の最大値以上となる定数値が格納されます。

© 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.