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 功能表面的窗口的特定平台支持由各种平台插件提供。但并非所有平台都支持 Vulkan。在此类平台上运行时,create() 将失效并始终返回false

注意: 由于在构建时没有必要的 Vulkan 头文件,特定 Qt 构建可能会自动禁用 Vulkan 支持。在这种情况下,如果configure 的输出显示 Vulkan 支持已禁用,QVulkan* 类将不可用。

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

初始化

QOpenGLContext 类似,只有在调用create() 时才会创建任何实际的 Vulkan 实例。这样就可以将 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 VK_KHR_*_surface 在需要 QVulkanInstance 的调试输出重定向时,可使用VK_EXT_debug_utils

访问核心 Vulkan 命令

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

注意: QVulkanFunctionsQVulkanDeviceFunctions 是在构建 Qt 库时从 Vulkan API XML 规范生成的。因此没有为它们提供文档。它们包含与Vulkan API 文档中描述的签名相同的 Vulkan 1.2 函数。

为窗口获取本地 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} }boolevent(*e) { if (e->type(== :UpdateRequest)::event(e); }voidrender() {// ...requestUpdate();//render continuously }private:boolm_initialized= false; };intmain(intargc, char **argv) { QGuiApplicationapp(argc,argv);    QVulkanInstanceinst;if(!inst.create()) {        qWarning("Vulkan not available");
       return 1; } VulkanWindow window; window.showMaximized();returnapp.exec(); }

注: 除了曝光之外,行为良好的窗口实现还必须处理调整大小和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_PROTOTYPESvulkan.h 。这会导致依赖原型的 C++ 封装头文件出现问题。因此,在应用程序代码中,可能有必要在任何 QVulkan 头文件之前包含vulkan.hpp 或类似内容。

另请参阅 QVulkanFunctionsQSurface::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。因此,并非所有参数都有效。请避免依赖pMessagemessageCodeobject 以外的参数。希望访问 VK_EXT_debug_utils 中指定的所有回调数据的应用程序应迁移到DebugUtilsFilter

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

[since 6.5] 枚举 QVulkanInstance::DebugMessageSeverityFlag
flags QVulkanInstance::DebugMessageSeverityFlags

常量
QVulkanInstance::VerboseSeverity0x01
QVulkanInstance::InfoSeverity0x02
QVulkanInstance::WarningSeverity0x04
QVulkanInstance::ErrorSeverity0x08

此枚举在 Qt 6.5 中引入。

DebugMessageSeverityFlags 类型是QFlags<DebugMessageSeverityFlag> 的类型定义。它存储 DebugMessageSeverityFlag 值的 OR 组合。

[since 6.5] 枚举 QVulkanInstance::DebugMessageTypeFlag
flags QVulkanInstance::DebugMessageTypeFlags

常量
QVulkanInstance::GeneralMessage0x01
QVulkanInstance::ValidationMessage0x02
QVulkanInstance::PerformanceMessage0x04

此枚举在 Qt 6.5 中引入。

DebugMessageTypeFlags 类型是QFlags<DebugMessageTypeFlag> 的类型定义。它存储 DebugMessageTypeFlag 值的 OR 组合。

[alias, since 6.5] QVulkanInstance::DebugUtilsFilter

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

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

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

返回true 会抑制消息的打印。

该类型定义在 Qt 6.5 中引入。

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

枚举 QVulkanInstance::Flag
flags QVulkanInstance::Flags

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

常量说明
QVulkanInstance::NoDebugOutputRedirect0x01禁用 Vulkan 调试输出 (VK_EXT_debug_utils) 重定向到qDebug
QVulkanInstance::NoPortabilityDrivers (since Qt 6.5)0x02禁用枚举标记为 Vulkan 可移植性的物理设备。

Flags 类型是QFlags<Flag> 的类型定义。它存储 Flag 值的 OR 组合。

成员函数文档

QVulkanInstance::QVulkanInstance()

构造一个新实例。

注意: 构造函数中不执行 Vulkan 初始化。

[noexcept] QVulkanInstance::~QVulkanInstance()

销毁器。

注意: 一旦实例被销毁,vkInstance() 将返回nullptr

QVersionNumber QVulkanInstance::apiVersion() const

返回请求的 Vulkan API 版本,如果setApiVersion() 在create() 之前未被调用,则返回空版本号。

另请参阅 setApiVersion()。

[since 6.5] void QVulkanInstance::clearDebugOutputFilters()

删除之前通过installDebugOutputFilter() 安装的所有过滤器功能。

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

此函数在 Qt 6.5 中引入。

另请参阅 installDebugOutputFilter()。

bool QVulkanInstance::create()

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

成功时返回 true,出错或不支持 Vulkan 时返回 false。

成功后,可通过vkInstance() 检索指向QVulkanInstance 的指针。

只要该QVulkanInstance 存在,或在调用destroy() 之前,Vulkan 实例和库都是可用的。

默认情况下,创建VkInstance时会设置VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR标志。这意味着 Vulkan Portability 物理设备也会被枚举出来。如果不希望这样,请设置NoPortabilityDrivers 标志。

void QVulkanInstance::destroy()

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

QVulkanDeviceFunctions *QVulkanInstance::deviceFunctions(VkDevice device)

返回QVulkanDeviceFunctions 对象,该对象公开了设备级核心 Vulkan 命令集,并保证跨平台运行。

注意: 在调用返回对象中的 Vulkan 函数时,必须将devicedevice 的子对象(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)

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

当调用了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 )将始终自动添加,无需将其包含在此列表中。

注: VK_KHR_portability_enumeration 会自动添加,除非设置了NoPortabilityDrivers 标志。该值在 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

注意: 该函数只能在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)

如果physicalDevicequeueFamilyIndex 的队列族支持向window 呈现,则返回 true。

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

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

为给定的window 创建或检索已有的VkSurfaceKHR 句柄。

如果失败,则返回 Vulkan 表面句柄或 0。

VkInstance QVulkanInstance::vkInstance() const

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

另请参阅 setVkInstance()。

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