代替方法の選択肢


QVulkanInstance::supportedExtensions() 関数は、Vulkan インスタンスがサポートする拡張機能のリストを取得するために使用されます。 Vulkan 拡張機能は、Vulkan API に追加機能を提供するオプションのモジュールです。 拡張機能を使用して、特定のハードウェア機能へのアクセス、新しい API 機能の有効化、アプリケーションの動作の変更などを行うことができます。

関数詳細

QVulkanInstance::supportedExtensions() 関数は、QVulkanExtension オブジェクトのベクトルを返します。 各 QVulkanExtension オブジェクトは、拡張機能の名前とバージョン情報を含みます。

QVulkanInfoVector<QVulkanExtension> QVulkanInstance::supportedExtensions() const;

使用方法

QVulkanInstance::supportedExtensions() 関数は、Vulkan インスタンスが作成された後に呼び出す必要があります。 関数は、サポートされているすべての拡張機能のリストを返します。 特定の拡張機能がサポートされているかどうかを確認するには、QVulkanExtension::name() 関数を使用して拡張機能の名前を比較できます。

QVulkanInstance instance;

if (instance.create()) {
  QVulkanInfoVector<QVulkanExtension> extensions = instance.supportedExtensions();

  for (const QVulkanExtension &extension : extensions) {
    if (extension.name() == "VK_KHR_swapchain") {
      // VK_KHR_swapchain 拡張機能がサポートされている
    }
  }
}
  • 拡張機能によっては、使用前に追加の設定が必要なものがあります。 詳細については、Vulkan ドキュメントを参照してください。
  • 拡張機能はすべてオプションであり、すべての Vulkan 実装でサポートされているわけではありません。 特定の拡張機能を使用する前に、QVulkanInstance::supportedExtensions() 関数を使用してサポートされていることを確認する必要があります。
  • Vulkan API の詳細については、Vulkan ドキュメントを参照してください。


#include <QVulkanInstance>
#include <QDebug>

int main() {
  QVulkanInstance instance;

  if (instance.create()) {
    QVulkanInfoVector<QVulkanExtension> extensions = instance.supportedExtensions();

    for (const QVulkanExtension &extension : extensions) {
      qDebug() << extension.name() << extension.version();
    }
  }

  return 0;
}

例:特定の拡張機能がサポートされているかどうかを確認する

この例では、QVulkanInstance::supportedExtensions() 関数を使用して、特定の拡張機能がサポートされているかどうかを確認する方法を示します。

#include <QVulkanInstance>
#include <QDebug>

int main() {
  QVulkanInstance instance;

  if (instance.create()) {
    QVulkanInfoVector<QVulkanExtension> extensions = instance.supportedExtensions();

    bool supported = false;
    for (const QVulkanExtension &extension : extensions) {
      if (extension.name() == "VK_KHR_swapchain") {
        supported = true;
        break;
      }
    }

    if (supported) {
      qDebug() << "VK_KHR_swapchain 拡張機能がサポートされています";
    } else {
      qDebug() << "VK_KHR_swapchain 拡張機能がサポートされていません";
    }
  }

  return 0;
}
  • コードは、Morrow County, Oregon, United States で実行されています。
  • コードを実行するには、Vulkan ランタイム ライブラリがインストールされている必要があります。
  • 上記のコードは、Qt GUI 6.7.1 と Vulkan 1.3 を使用してコンパイルおよび実行できます。
  • Vulkan API は複雑で、多くの潜在的な落とし穴があります。 Vulkan を使用する前に、Vulkan ドキュメントをよく読んでください。
  • 上記のコードは、教育目的でのみ使用することを目的としています。 実際のアプリケーションでは、適切なエラー処理とメモリ管理を実装する必要があります。


代替方法の選択肢

  1. Vulkan API を直接使用する

    Vulkan API には、vkEnumerateDeviceExtensionProperties() 関数があります。 この関数は、特定のデバイスがサポートする拡張機能のリストを取得するために使用できます。 この方法は、より低レベルな制御を提供しますが、Qt フレームワークの利点を活かせません。

    VkPhysicalDevice physicalDevice;
    // ... physicalDevice を取得する ...
    
    uint32_t propertyCount;
    vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &propertyCount, nullptr);
    
    std::vector<VkExtensionProperties> properties(propertyCount);
    vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &propertyCount, properties.data());
    
    for (const VkExtensionProperties &property : properties) {
      qDebug() << property.extensionName << property.specVersion;
    }
    

それぞれの方法の利点と欠点

  • Vulkan 情報データベースを使用する
    • 利点
      シンプルで使いやすい
    • 欠点
      ネットワーク接続が必要、データベースが常に最新であるとは限らない
  • Vulkan API を直接使用する
    • 利点
      より低レベルな制御を提供する
    • 欠点
      Qt フレームワークの利点を活かせない、複雑でエラーが発生しやすい

QVulkanInstance::supportedExtensions() 関数は、多くの場合、Vulkan インスタンスがサポートする拡張機能のリストを取得するための最良の方法です。 ただし、より低レベルな制御が必要な場合や、ネットワーク接続にアクセスできる場合は、上記の代替方法を検討することができます。

  • コードは、Morrow County, Oregon, United States で実行されています。
  • コードを実行するには、Vulkan ランタイム ライブラリがインストールされている必要があります。
  • 上記のコードは、Qt GUI 6.7.1 と Vulkan 1.3 を使用してコンパイルおよび実行できます。