本页内容

QVulkanInstance Class

QVulkanInstance 类表示一个本机 Vulkan 实例,支持在QSurface 上进行 Vulkan 渲染。更多内容...

头文件: #include <QVulkanInstance>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui

公共类型

DebugFilter
(since 6.5) enum DebugMessageSeverityFlag { VerboseSeverity, InfoSeverity, WarningSeverity, ErrorSeverity }
flags DebugMessageSeverityFlags
(since 6.5) enum DebugMessageTypeFlag { GeneralMessage, ValidationMessage, PerformanceMessage }
flags DebugMessageTypeFlags
(since 6.5) DebugUtilsFilter
enum Flag { NoDebugOutputRedirect, NoPortabilityDrivers }
flags Flags

公共函数

QVulkanInstance()
~QVulkanInstance()
QVersionNumber apiVersion() const
(since 6.5) void clearDebugOutputFilters()
bool create()
void destroy()
QVulkanDeviceFunctions *deviceFunctions(VkDevice device)
VkResult errorCode() const
QByteArrayList extensions() const
QVulkanInstance::Flags flags() const
QVulkanFunctions *functions() const
PFN_vkVoidFunction getInstanceProcAddr(const char *name)
(since 6.5) void installDebugOutputFilter(QVulkanInstance::DebugUtilsFilter filter)
void installDebugOutputFilter(QVulkanInstance::DebugFilter filter)
bool isValid() const
QByteArrayList layers() const
void presentAboutToBeQueued(QWindow *window)
void presentQueued(QWindow *window)
void removeDebugOutputFilter(QVulkanInstance::DebugFilter filter)
void resetDeviceFunctions(VkDevice device)
void setApiVersion(const QVersionNumber &vulkanVersion)
void setExtensions(const QByteArrayList &extensions)
void setFlags(QVulkanInstance::Flags flags)
void setLayers(const QByteArrayList &layers)
void setVkInstance(VkInstance existingVkInstance)
QVersionNumber supportedApiVersion() const
QVulkanInfoVector<QVulkanExtension> supportedExtensions() const
QVulkanInfoVector<QVulkanLayer> supportedLayers() const
bool supportsPresent(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, QWindow *window)
VkInstance vkInstance() const

静态公共成员

VkSurfaceKHR surfaceForWindow(QWindow *window)

详细说明

Vulkan是一个跨平台的、显式图形和计算 API。本类以跨平台的方式支持加载 Vulkan 库并创建一个 `instance `。有关 Vulkan 实例的介绍,请参阅规范的第 3.2 节。

注意: 针对 Vulkan 实例以及具有支持 Vulkan 表面(surfaces)的窗口,各平台插件提供了相应的平台特定 支持。但并非所有平台都支持 Vulkan。在这样的平台上运行时,create() 将失败,并始终返回false 。

注意: 由于构建时缺少必要的 Vulkan 头文件,特定 Qt 构建的Vulkan 支持可能会被自动禁用。在此情况下,若configure 的输出表明 Vulkan 支持已被禁用,则 QVulkan* 类将不可用。

注意:某些 函数在不同的 Vulkan 头文件版本之间更改了其签名。在构建 Qt 时,如果系统中仅存在具有旧版且存在冲突签名的头文件,Vulkan 支持将被禁用。建议使用 Vulkan 1.0.39 或更高版本的头文件。

初始化

与QOpenGLContext 类似,任何实际的Vulkan实例创建仅在调用create()时才会发生。这使得可以将QVulkanInstance作为普通成员变量使用,同时仍能控制何时执行初始化。

可以通过调用supportedLayers()和supportedExtensions()来查询支持的实例级图层和扩展。这些函数可确保Vulkan库已加载,因此即使在create()之前调用也是安全的。

实例用于存储应用程序级别的 Vulkan 状态,创建VkInstance 对象会初始化 Vulkan 库。实际应用中,通常会在 main() 函数的早期阶段构建一个实例。该对象将一直保持活动状态,直至应用程序退出。

每个基于 Vulkan 的QWindow 都必须通过调用QWindow::setVulkanInstance() 与一个 QVulkanInstance 建立关联。因此,典型的应用程序模式如下:

    int main(int argc, char **argv)
    {
        QGuiApplication app(argc, argv);

        QVulkanInstance inst;
        if (!inst.create())
            return 1;

        // ...
        window->setVulkanInstance(&inst);
        window->show();

        return app.exec();
    }

配置

QVulkanInstance 会自动在新创建的实例上启用其所需的最小扩展集。实际上,这意味着会启用VK_KHR_*_surface 扩展系列。

默认情况下,Vulkan 调试输出(例如来自验证层的消息)会路由到 `qDebug()`。可以通过在调用 `create()`之前,向 `setFlags()` 传递标志 `NoDebugOutputRedirect ` 来禁用此功能。

要启用其他层和扩展,请在调用create()之前,通过setLayers() 和setExtensions() 提供列表。当实例报告某个层或扩展不可用时,该请求将被忽略。 成功调用create() 后,layers() 和extensions() 等函数返回的值将反映实际启用的层和扩展。如有必要(例如,为避免请求会发生冲突并导致 Vulkan 实例创建失败的扩展),可在调用create() 之前,通过supportedLayers() 和supportedExtensions() 检查实际支持的层和扩展列表。

例如,要启用标准验证层,可以执行以下操作:

    QVulkanInstance inst;

    // Enable validation layer, if supported. Messages go to qDebug by default.
    inst.setLayers({ "VK_LAYER_KHRONOS_validation" });

    bool ok = inst.create();
    if (!ok) {
        // ... Vulkan not available
    }

    if (!inst.layers().contains("VK_LAYER_KHRONOS_validation")) {
        // ... validation layer not available
    }

或者,也可以在尝试创建 Vulkan 实例之前先进行决策:

    QVulkanInstance inst;

    if (inst.supportedLayers().contains("VK_LAYER_KHRONOS_validation")) {
        // ...
    }
    bool ok = inst.create();
    // ...

采用现有实例

默认情况下,QVulkanInstance 会创建一个新的 Vulkan 实例。在与外部引擎和渲染器配合使用时,这有时可能并不理想。如果已有可用的VkInstance 句柄,请在调用create() 之前先调用setVkInstance()。这样就不会创建额外的实例,且 QVulkanInstance 也不会拥有该句柄。

注意:应由 创建外部实例的组件确保在该实例上启用了必要的扩展。这些扩展包括:VK_KHR_surface 、适用于特定平台的 WSI 专用VK_KHR_*_surface ,以及在需要重定向 QVulkanInstance 调试输出时使用的VK_EXT_debug_utils 。

访问核心 Vulkan 命令

要访问 QVulkanInstance 所封装的VkInstance 句柄,请调用vkInstance()。要解析 Vulkan 函数,请调用getInstanceProcAddr()。对于核心 Vulkan 命令,无需手动解析,因为它们是通过QVulkanFunctions 和QVulkanDeviceFunctions 对象提供的,可通过functions() 和deviceFunctions() 访问。

注意: QVulkanFunctions 和QVulkanDeviceFunctions 是构建 Qt 库时根据 Vulkan API XML 规范生成的。因此,未为此提供相关文档。它们包含 Vulkan 1.2 函数,其签名与Vulkan API 文档中描述的一致。

为窗口获取原生 Vulkan 表面

两种常见的窗口系统特定操作是:为窗口获取一个表面(一个VkSurfaceKHR 句柄),以及查询给定的队列族是否支持向给定的表面进行呈现。为了避免应用程序中出现 WSI 特定的代码,这些操作由 QVulkanInstance 及其底层的 QPA 层进行了抽象处理。

要为窗口创建 Vulkan 表面或检索现有表面,请调用surfaceForWindow()。 大多数平台仅在首次调用 `surfaceForWindow()` 时才会通过 `VK_KHR_*_surface ` 创建表面,但内部行为可能因平台而异。一旦创建,后续对 `surfaceForWindow()` 的调用将返回相同的句柄。这与典型的支持 Vulkan 的 `QWindow ` 子类的结构非常契合。

若要查询物理设备中的某个队列族是否可用于向指定表面进行呈现,请调用supportsPresent()。该函数封装了通用vkGetPhysicalDeviceSurfaceSupportKHR 检查和WSI特有的vkGetPhysicalDevice*PresentationSupportKHR 检查。

故障排除

除了从create() 返回false 或从surfaceForWindow() 返回0 之外,严重错误还会通过qWarning() 打印到调试输出中。可以通过启用日志类别qt.vulkan 的调试输出,请求额外的日志记录。在create() 失败后,通过调用errorCode() 可以获取实例创建时的实际 Vulkan 错误代码。

在某些特殊情况下,可能需要覆盖 Vulkan 库名称。这可以通过设置环境变量QT_VULKAN_LIB 来实现。

示例

以下是创建支持 Vulkan 的QWindow 的基本步骤:

classVulkanWindow :publicQWindow
{
public:
    VulkanWindow() {
        setSurfaceType(VulkanSurface);
    }

    voidexposeEvent(QExposeEvent*) {
        if(isExposed()) {
            if(!m_initialized) {
                m_initialized= true;
                // 初始化设备、交换链等。
                QVulkanInstance*inst =vulkanInstance();
                QVulkanFunctions*f = inst->functions();
                uint32_t devCount= 0;
                f->vkEnumeratePhysicalDevices(inst->vkInstance(), &devCount,nullptr);
                // ...
               // 构建第一帧
                render();
            }
        }
    }

    boolevent(QEvent*e) {
        if(e->type()==QEvent::UpdateRequest)
            render();
        returnQWindow::event(e);
    }

   voidrender() {
       // ...
       requestUpdate();// 持续渲染
    }

private:
    boolm_initialized= false;
};

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

    QVulkanInstance inst;
    if(!inst.create()) {
        qWarning("Vulkan not available");
       return 1;
    }

    VulkanWindow window;
    window.showMaximized();

    returnapp.exec();

}

注意:除了` expose`方法外, 一个行为规范的窗口实现还必须处理诸如`resize`和`QPlatformSurfaceEvent `等额外事件,以确保对交换链进行正确的管理。此外,某些平台可能要求在窗口不再处于暴露状态时释放资源。

使用 Vulkan 的 C++ 绑定

将 Qt 的 Vulkan 启用组件与 C++ Vulkan 封装库(例如Vulkan-Hpp)结合使用也是可行的。 此处的先决条件是,C++ 层必须能够在类中采用本机句柄(VkInstance、VkSurfaceKHR),同时不获取所有权(因为所有权仍归属于 QVulkanInstance 和QWindow )。还请考虑以下内容:

  • 某些封装库要求启用异常支持。Qt 不使用异常。若要为应用程序启用异常,请在 `.pro ` 文件中添加 `CONFIG += exceptions `。
  • 某些封装类会直接调用 Vulkan 函数,这假设 `vulkan.h ` 提供了函数原型,且应用程序链接到了导出所有必要符号的 Vulkan 库。Qt 可能不会直接链接到 Vulkan 库。因此,在某些平台上,可能需要在应用程序的 `.pro ` 文件中添加 `LIBS += -lvulkan ` 或类似内容。
  • QVulkan 类的头文件可能包含启用了VK_NO_PROTOTYPES 的vulkan.h 。这可能会导致依赖这些原型的 C++ 封装头文件出现问题。因此,在应用程序代码中,可能需要在任何 QVulkan 头文件之前包含vulkan.hpp 或类似文件。

安全注意事项

Vulkan 实现(即 Vulkan 加载器、驱动程序以及任何已启用的层)是一个可信的、进程内的平台依赖项。Qt 会加载它并直接调用其函数,不进行任何沙箱隔离或验证,其处理方式与对待 OpenGL 实现的方式相同。

QVulkanInstance 及其基于该类的所有类(例如QVulkanWindow 以及带有 Vulkan 后端的QRhi )所使用的所有数据,均应被视为可信内容。这包括传递给setLayers() 和setExtensions() 的层和扩展名称、通过setVkInstance() 获取的原生VkInstance 句柄,以及应用程序生成的所有渲染内容和 Vulkan 命令参数。

警告: 建议应用程序开发 人员在允许引入不属于应用程序且不受开发者控制的用户提供内容之前,仔细考虑其潜在影响。

另请参阅 QVulkanFunctions 和QSurface::SurfaceType 。

成员类型文档

QVulkanInstance::DebugFilter

用于调试过滤回调函数的类型定义,其签名如下:

bool myDebugFilter(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object,
                   size_t location, int32_t messageCode, const char *pLayerPrefix, const char *pMessage)

返回true 将抑制该消息的输出。

注意:从 Qt 6.5开始, VK_EXT_debug_utils 已取代已弃用的VK_EXT_debug_report 。该回调函数签名基于 VK_EXT_debug_report。因此,并非所有参数都能保证有效。 请避免依赖除pMessage 、messageCode 和object 以外的参数。希望访问 VK_EXT_debug_utils 中规定的所有回调数据的应用程序,应迁移至DebugUtilsFilter 。

另请参阅 installDebugOutputFilter() 和removeDebugOutputFilter()。

[since 6.5] enum QVulkanInstance::DebugMessageSeverityFlag
flags QVulkanInstance::DebugMessageSeverityFlags

常数值
QVulkanInstance::VerboseSeverity0x01
QVulkanInstance::InfoSeverity0x02
QVulkanInstance::WarningSeverity0x04
QVulkanInstance::ErrorSeverity0x08

该枚举类型在 Qt 6.5 中引入。

DebugMessageSeverityFlags 类型是QFlags<DebugMessageSeverityFlag> 的 typedef。它存储了 DebugMessageSeverityFlag 值的按“或”(OR)组合。

[since 6.5] enum QVulkanInstance::DebugMessageTypeFlag
flags QVulkanInstance::DebugMessageTypeFlags

常数值
QVulkanInstance::GeneralMessage0x01
QVulkanInstance::ValidationMessage0x02
QVulkanInstance::PerformanceMessage0x04

该枚举类型在 Qt 6.5 中引入。

DebugMessageTypeFlags 类型是QFlags<DebugMessageTypeFlag> 的 typedef 定义。它存储了 DebugMessageTypeFlag 值的按“或”运算组合。

[alias, since 6.5] QVulkanInstance::DebugUtilsFilter

用于调试过滤回调函数的类型别名,其签名如下:

std::function<bool(DebugMessageSeverityFlags severity, DebugMessageTypeFlags type, const void *message)>;

参数 `message ` 是指向 `VkDebugUtilsMessengerCallbackDataEXT` 结构体的指针。详情请参阅VK_EXT_debug_utils 的文档。Qt 头文件未使用该实际类型,以避免引入对 Vulkan 1.0 之后头文件的依赖。

返回true 将抑制该消息的输出。

此 typedef 于 Qt 6.5 中引入。

另请参阅 installDebugOutputFilter() 和removeDebugOutputFilter()。

enum QVulkanInstance::Flag
flags QVulkanInstance::Flags

此枚举描述了可传递给setFlags()的标志。这些标志控制create()的行为。

常量值描述
QVulkanInstance::NoDebugOutputRedirect0x01禁用将 Vulkan 调试输出(VK_EXT_debug_utils )重定向至qDebug 。
QVulkanInstance::NoPortabilityDrivers (since Qt 6.5)0x02禁用对标记为“Vulkan Portability”的物理设备的枚举。

Flags 类型是QFlags<Flag> 的 typedef 定义。它存储 Flag 值的按“或”运算组合。

成员函数文档

QVulkanInstance::QVulkanInstance()

创建一个新实例。

注意: 构造函数中不会 执行任何 Vulkan 初始化操作。

[noexcept] QVulkanInstance::~QVulkanInstance()

析构函数。

注意: 当实例被销毁后,vkInstance() 将返回nullptr 。

QVersionNumber QVulkanInstance::apiVersion() const

返回应用程序预期运行的请求的 Vulkan API 版本;如果在调用create() 之前未调用setApiVersion(),则返回空版本号。

另请参阅 setApiVersion()。

[since 6.5] void QVulkanInstance::clearDebugOutputFilters()

删除此前由installDebugOutputFilter()安装的所有过滤器函数。

注意:该 函数可在调用create() 之前调用。

该函数在 Qt 6.5 中引入。

另请参阅 installDebugOutputFilter()。

bool QVulkanInstance::create()

初始化 Vulkan 库,并创建一个新的 Vulkan 实例或采用现有的 Vulkan 实例。

若操作成功则返回 true,若发生错误或不支持 Vulkan 则返回 false。

成功时,可通过 `vkInstance()` 获取该 `QVulkanInstance ` 的指针。

只要该 `QVulkanInstance ` 存在,或者在调用 `destroy()` 之前,Vulkan 实例和库均可使用。

默认情况下,创建 VkInstance 时会设置VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR标志。这意味着 Vulkan 可移植性(Vulkan Portability)的物理设备也会被枚举。如果不需要此功能,请设置NoPortabilityDrivers 标志。

void QVulkanInstance::destroy()

销毁底层平台实例,从而销毁 VkInstance(当其被拥有时)。通过再次调用create(),QVulkanInstance 对象仍可被重复使用。

QVulkanDeviceFunctions *QVulkanInstance::deviceFunctions(VkDevice device)

返回一个QVulkanDeviceFunctions 对象,该对象提供了设备级核心Vulkan命令集,并保证在跨平台环境下均可正常运行。

注意: 返回对象中的 Vulkan函数必须 仅以device 或device 的子对象(如 VkQueue、VkCommandBuffer)作为其第一个参数来调用。这是因为这些函数是通过vkGetDeviceProcAddr解析的,以避免内部分发的潜在开销。

注意: 返回的对象 由QVulkanInstance 拥有和管理。请勿销毁或修改它。

注意:该 对象会被缓存,因此再次使用相同的device 调用此函数是一项低开销的操作。但是,当设备被销毁时,应用程序需要通过调用resetDeviceFunctions() 来通知QVulkanInstance 。

Vulkan 1.0 核心 API 中的函数将始终可用。 对于更高版本的 Vulkan(例如 1.1 和 1.2),QVulkanDeviceFunctions 对象也会尝试解析这些版本的核心 API 函数,但如果运行时的 Vulkan 物理设备不支持这些函数,调用任何此类不受支持的函数都将导致未定义的行为。 要正确启用对 Vulkan 1.0 以上版本的支持,可能需要在调用create() 之前,通过调用setApiVersion() 设置适当的实例 API 版本。此外,应用程序应检查 VkPhysicalDeviceProperties 中物理设备的apiVersion 属性。

另请参阅 functions() 和resetDeviceFunctions()。

VkResult QVulkanInstance::errorCode() const

在create()调用失败后返回Vulkan错误代码,否则返回VK_SUCCESS 。

该值通常是 vkCreateInstance() 的返回值(当创建新的 Vulkan 实例而非采用现有实例时),但如果平台插件不支持 Vulkan,则该值也可能是VK_NOT_READY 。

QByteArrayList QVulkanInstance::extensions() const

如果已调用 `create()` 且调用成功,则返回已启用的实例扩展;否则返回请求的扩展。

另请参阅 setExtensions()。

QVulkanInstance::Flags QVulkanInstance::flags() const

返回请求的标志。

另请参阅 setFlags()。

QVulkanFunctions *QVulkanInstance::functions() const

返回相应的QVulkanFunctions 对象,该对象提供了Vulkan的核心命令集(不包括设备级函数),并保证在跨平台环境下正常工作。

注意: 返回的对象 由QVulkanInstance 拥有并管理。请勿销毁或修改该对象 。

Vulkan 1.0 核心 API 中的函数将始终可用。 对于更高的 Vulkan 版本(例如 1.1 和 1.2),QVulkanFunctions 对象也会尝试解析这些版本的核心 API 函数,但如果运行时的 Vulkan 实例实现不支持这些函数,调用任何此类不受支持的函数都将导致未定义的行为。 此外,为了正确启用对 Vulkan 1.0 以上版本的支持,可能需要在调用 `create()` 之前,通过调用 `setApiVersion()` 来设置适当的实例 API 版本。要查询 Vulkan 实现的实例级版本,请调用 `supportedApiVersion()`。

另请参阅 deviceFunctions() 和supportedApiVersion()。

PFN_vkVoidFunction QVulkanInstance::getInstanceProcAddr(const char *name)

根据给定的name 解析Vulkan函数。

对于核心的Vulkan命令,建议改用可通过functions()和deviceFunctions()获取的函数封装类。

[since 6.5] void QVulkanInstance::installDebugOutputFilter(QVulkanInstance::DebugUtilsFilter filter)

安装一个filter 函数,该函数会在每次输出Vulkan调试消息时被调用。当回调函数返回true 时,该消息将被阻止(过滤掉),且不会出现在调试输出中。

注意:过滤 仅在NoDebugOutputRedirect 不为set 时才有效。否则,安装过滤器将不会产生任何效果。

注意:该 函数可在调用create() 之前调用。

该函数在 Qt 6.5 中引入。

另请参阅 clearDebugOutputFilters()。

void QVulkanInstance::installDebugOutputFilter(QVulkanInstance::DebugFilter filter)

安装一个filter 函数,该函数会在每次输出Vulkan调试消息时被调用。当回调函数返回true 时,该消息将被阻止(过滤掉),且不会出现在调试输出中。

注意:过滤 仅在NoDebugOutputRedirect 不为set 时才有效。否则,安装过滤器将不起作用。

注意:该 函数可在调用 `create()` 之前调用。

这是一个重载函数。

另请参阅 removeDebugOutputFilter()。

bool QVulkanInstance::isValid() const

如果 `create()` 调用成功且实例有效,则返回 `true`。

QByteArrayList QVulkanInstance::layers() const

如果已调用 `create()` 且调用成功,则返回已启用的实例图层;否则返回请求的图层。

另请参阅 setLayers()。

void QVulkanInstance::presentAboutToBeQueued(QWindow *window)

该函数应由应用程序的渲染器在将呈现操作加入window 的队列之前调用。

虽然在某些平台上此函数不会执行任何操作,但在某些平台上可能会执行依赖于窗口系统的同步操作。例如,在 Wayland 上,此函数会发送一个 wl_surface.frame 请求,以防止驱动程序因最小化窗口而阻塞。

void QVulkanInstance::presentQueued(QWindow *window)

该函数应由应用程序的渲染器在将window 的呈现操作加入队列后调用。

虽然在某些平台上此操作无实际效果,但在某些平台上可能会执行依赖于窗口系统的同步操作。例如,在 X11 环境中,此操作将更新_NET_WM_SYNC_REQUEST_COUNTER 。

void QVulkanInstance::removeDebugOutputFilter(QVulkanInstance::DebugFilter filter)

删除先前由installDebugOutputFilter() 安装的filter 函数。

注意:该 函数可在调用create() 之前调用。

另请参阅 installDebugOutputFilter()。

void QVulkanInstance::resetDeviceFunctions(VkDevice device)

使给定device 的QVulkanDeviceFunctions 对象失效并销毁该对象。

当某个已调用过 `deviceFunctions()` 的 `VkDevice` 被销毁,而应用程序仍打算继续运行(且可能在后续创建新的逻辑 Vulkan 设备)时,必须调用此函数。

在销毁QVulkanInstance 之前无需调用此函数,因为此时清理工作会自动执行。

另请参阅 deviceFunctions()。

void QVulkanInstance::setApiVersion(const QVersionNumber &vulkanVersion)

指定应用程序设计中支持的最高 Vulkan API 版本。

默认情况下,vulkanVersion 的值为 0,对应 Vulkan 1.0。

注意:此 函数只能在调用create() 之前调用,若在之后调用则无效。

注意:请 注意,Vulkan 1.1 更改了与 Vulkan API 版本字段相关的工作方式。 在 Vulkan 1.0 中,根据规范要求,如果指定了不受支持的vulkanVersion ,会导致create() 调用失败并返回VK_ERROR_INCOMPATIBLE_DRIVER 。从 Vulkan 1.1 开始,规范不再允许这种情况,驱动程序必须接受任何版本,且不得导致实例创建失败。

建议应用程序开发人员熟悉Vulkan 规范中关于 `apiVersion ` 的说明。

另请参阅 apiVersion() 和supportedApiVersion()。

void QVulkanInstance::setExtensions(const QByteArrayList &extensions)

指定要启用的额外实例extensions 列表。即使指定了不受支持的扩展也完全安全,因为在运行时若不支持,这些扩展会被忽略。

注意: Qt 所需的与表面相关的扩展 (例如VK_KHR_win32_surface )将始终自动添加,无需将其包含在此列表中。

注意: 除非设置了NoPortabilityDrivers 标志,否则VK_KHR_portability_enumeration 会自动添加。该值自Qt 6.5起引入。

注意:此 函数只能在调用create() 之前调用,若在之后调用则无效。

另请参阅 extensions()。

void QVulkanInstance::setFlags(QVulkanInstance::Flags flags)

根据提供的flags 配置create()的行为。

注意:此 函数只能在调用create() 之前调用,若在之后调用则无效。

另请参阅 flags()。

void QVulkanInstance::setLayers(const QByteArrayList &layers)

指定要启用的实例layers 列表。即使指定了不受支持的图层也无妨,因为在运行时若不支持,这些图层会被忽略。

注意:此 函数只能在调用create() 之前调用,若在之后调用则无效。

另请参阅 layers()。

void QVulkanInstance::setVkInstance(VkInstance existingVkInstance)

使QVulkanInstance 采用现有的VkInstance句柄,而不是创建一个新的。

注意: existingVkInstance 必须至少启用了VK_KHR_surface 以及相应的 WSI 特定VK_KHR_*_surface 扩展。为确保调试输出重定向功能正常,还需启用VK_EXT_debug_utils 。

Qt 无法在已创建的 VkInstance 上启用图层和扩展。 因此,调用方有责任确保existingVkInstance 适合与 Qt 配合使用。如果涉及基于QRhi 的渲染,请调用QRhiVulkanInitParams::preferredInstanceExtensions() 来查询一组额外的实例扩展列表——这些扩展应由existingVkInstance 的创建者启用,作为上述扩展的补充,前提是运行时系统可提供并支持这些扩展。

注意:此 函数只能在调用create() 之前调用,若在之后调用则无效。

另请参阅 vkInstance()。

QVersionNumber QVulkanInstance::supportedApiVersion() const

返回 Vulkan 实现所支持的实例级功能的版本号。

实际上,该值要么是 vkEnumerateInstanceVersion 函数返回的值(如果该函数可用,即在 Vulkan 1.1 及更高版本中),要么就是 1.0。

如果应用程序希望根据运行时可用的 Vulkan 版本,对 Vulkan 功能和 API 的使用进行分支处理,可以在调用 `create()` 之前,使用此函数来确定应向 `setApiVersion()` 传递哪个版本。

注意:该 函数可在调用create() 之前调用。

另请参阅 setApiVersion()。

QVulkanInfoVector<QVulkanExtension> QVulkanInstance::supportedExtensions() const

返回支持的实例级扩展列表。

注意:该 函数可在调用 `create()` 之前调用。

QVulkanInfoVector<QVulkanLayer> QVulkanInstance::supportedLayers() const

返回支持的实例级图层列表。

注意:此 函数可在调用 `create()` 之前调用。

bool QVulkanInstance::supportsPresent(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, QWindow *window)

如果physicalDevice 中包含queueFamilyIndex 的队列族支持向window 呈现,则返回true。

在检查给定 Vulkan 设备的队列时,调用此函数以确定哪个队列可用于执行渲染。

[static] VkSurfaceKHR QVulkanInstance::surfaceForWindow(QWindow *window)

为给定的window 创建或获取已存在的VkSurfaceKHR 句柄。

返回 Vulkan 表面句柄;若操作失败,则返回 0。

VkInstance QVulkanInstance::vkInstance() const

返回该QVulkanInstance 所封装的VkInstance句柄;如果尚未成功调用create(),且未通过setVkInstance()提供现有实例,则返回nullptr 。

另请参阅 setVkInstance()。

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