QVulkanInstance 类

QVulkanInstance 类表示一个原生 Vulkan 实例,允许在 QSurface 上进行 Vulkan 渲染。 更多...

头文件 #include <QVulkanInstance>
CMakefind_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmakeQT += gui

公共类型

DebugFilter
(自 6.5) 枚举DebugMessageSeverityFlag { VerboseSeverity, InfoSeverity, WarningSeverity, ErrorSeverity }
标志DebugMessageSeverityFlags
(自 6.5) 枚举DebugMessageTypeFlag { GeneralMessage, ValidationMessage, PerformanceMessage }
标志DebugMessageTypeFlags
(自 6.5) DebugUtilsFilter
枚举Flag { NoDebugOutputRedirect, NoPortabilityDrivers }
标志标志

公共函数

QVulkanInstance()
~QVulkanInstance()
QVersionNumberapiVersion() const
(自 6.5) voidclearDebugOutputFilters()
boolcreate()
voiddestroy()
QVulkanDeviceFunctions *deviceFunctions(VkDevice device)
VkResulterrorCode() const
QByteArrayListextensions() const
QVulkanInstance::Flagsflags() const
QVulkanFunctions *functions() const
PFN_vkVoidFunctiongetInstanceProcAddr(const char *name)
(自 6.5) voidinstallDebugOutputFilter(QVulkanInstance::DebugUtilsFilter filter)
voidinstallDebugOutputFilter(QVulkanInstance::DebugFilter filter)
boolisValid() const
QByteArrayListlayers() const
voidpresentAboutToBeQueued(QWindow *window)
voidpresentQueued(QWindow *window)
voidremoveDebugOutputFilter(QVulkanInstance::DebugFilter filter)
voidresetDeviceFunctions(VkDevice device)
voidsetApiVersion(const QVersionNumber &vulkanVersion)
voidsetExtensions(const QByteArrayList &extensions)
voidsetFlags(QVulkanInstance::Flags flags)
voidsetLayers(const QByteArrayList &layers)
voidsetVkInstance(VkInstance existingVkInstance)
QVersionNumbersupportedApiVersion() const
QVulkanInfoVector<QVulkanExtension>supportedExtensions() const
QVulkanInfoVector<QVulkanLayer>supportedLayers() const
boolsupportsPresent(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, QWindow *window)
VkInstancevkInstance() const

静态公有成员

VkSurfaceKHRsurfaceForWindow(QWindow *window)

详细描述

Vulkan是一种跨平台的显式图形和计算API。这个类提供支持以跨平台的方式加载Vulkan库和创建一个实例。有关Vulkan实例的介绍,请参阅规范章节3.2

注意: 不同平台插件提供了对Vulkan实例和具有Vulkan功能表面的窗口的支持。不过,并非所有插件都支持Vulkan。在这样的平台上运行时,create()将失败并总是返回false

注意: 由于构建时没有提供必要的Vulkan头文件,某些Qt构建可能自动禁用Vulkan支持。当这种情况发生时,如果configure的输出表明Vulkan支持已被禁用,则QVulkan*类将不可用。

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

初始化

类似于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()。这可以通过将NoDebugOutputRedirect标志传递给setFlags()在调用create()之前的before来禁用。

要启用额外的层和扩展,通过setLayers()和setExtensions()提供列表,然后在调用create()之前之前进行。当给定的层或扩展未在实例中报告为可用时,请求将被忽略。成功调用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命令,手动解析是不必要的,因为它们是通过QVulkanFunctionsQVulkanDeviceFunctions对象提供的,这些对象可以通过functions()和deviceFunctions()获得。

注意: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的基本大纲

class VulkanWindow : public QWindow
{
public:
    VulkanWindow() {
        setSurfaceType(VulkanSurface);
    }

    void exposeEvent(QExposeEvent *) {
        if (isExposed()) {
            if (!m_initialized) {
                m_initialized = true;
                // initialize device, swapchain, etc.
                QVulkanInstance *inst = vulkanInstance();
                QVulkanFunctions *f = inst->functions();
                uint32_t devCount = 0;
                f->vkEnumeratePhysicalDevices(inst->vkInstance(), &devCount, nullptr);
                // ...
                // build the first frame
                render();
            }
        }
    }

    bool event(QEvent *e) {
        if (e->type() == QEvent::UpdateRequest)
            render();
        return QWindow::event(e);
    }

    void render() {
       // ...
       requestUpdate(); // render continuously
    }

private:
    bool m_initialized = false;
};

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

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

    VulkanWindow window;
    window.showMaximized();

    return app.exec();

}

注意:除了公开(Expose)之外,行为良好的窗口实现还必须注意诸如调整大小和QPlatformSurfaceEvent等额外事件,以确保正确管理双缓冲区链。此外,某些平台可能需要在不再公开时释放资源。

使用C++绑定Vulkan

可以将Qt的Vulkan启用器与C++ Vulkan包装器(例如Vulkan-Hpp)结合使用。这里的先决条件是C++层必须能够在它的类中采用本地句柄(VkInstance、VkSurfaceKHR)而不采取所有权(因为所有权保留在QVulkanInstance和QWindow上)。还要考虑以下因素

  • 某些包装器需要启用异常支持。Qt不使用异常。要为应用程序启用异常,请将CONFIG += exceptions添加到.pro文件中。
  • 某些包装器会直接调用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之外的参数。希望访问在本清单中指定的所有回调数据的应用程序应迁移到DebugUtilsFilter

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

[since 6.5] 枚举 QVulkanInstance::DebugMessageSeverityFlag
标志 QVulkanInstance::DebugMessageSeverityFlags

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

此枚举是Qt 6.5中引入的。

DebugMessageSeverityFlags类型是QFlags的typedef。它存储了DebugMessageSeverityFlag值的按OR组合。

[since 6.5] 枚举 QVulkanInstance::DebugMessageTypeFlag
标志 QVulkanInstance::DebugMessageTypeFlags

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

此枚举是Qt 6.5中引入的。

DebugMessageTypeFlags类型是QFlags的typedef。它存储了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将抑制消息的打印。

此typedef是Qt 6.5中引入的。

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

枚举 QVulkanInstance::Flag
标志 QVulkanInstance::Flags

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

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

Flag类型是QFlags的typedef。它存储了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 的指针。

Vulkan 实例和库在 QVulkanInstance 存在期间或直到调用 destroy() 时都可用。

默认情况下,VkInstance 使用具有 VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR 标志创建。这意味着还将枚举 Vulkan 可移植物理设备。如果不希望这样,请设置 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 物理设备不支持这些功能,则调用任何此类不受支持的功能将导致未指定行为。要正确启用对高于 1.0 的 Vulkan 版本的支持,可能需要通过在 setApiVersion() 调用之前设置合适的实例 API 版本来调用 create()。此外,应用程序应检查 VkPhysicalDeviceProperties 中的物理设备的 apiVersion

另外参见 functions() 和 resetDeviceFunctions

VkResult QVulkanInstance::errorCode() const

在不成功调用 create() 后返回 Vulkan 错误代码;否则返回 VK_SUCCESS

该值通常是创建新 Vulkan 实例时从 vkCreateInstance() 返回的值(而不是采用现有实例),但如果平台插件不支持 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 实现不支持这些功能,则调用任何此类不受支持的功能将导致未指定行为。此外,要正确启用对高于 1.0 的 Vulkan 版本的支持,可能需要通过在 setApiVersion() 调用之前设置合适的实例 API 版本来调用 create()。为了查询 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)

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

注意:当未设置 NoDebugOutputRedirect 时,过滤才是有效的。否则安装过滤器没有效果。

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

此功能是在 Qt 6.5 中引入的。

另请参阅clearDebugOutputFilters

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

这是一个重载函数。

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

注意:当未设置 NoDebugOutputRedirect 时,过滤才是有效的。否则安装过滤器没有效果。

注意: 此函数可以在 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)

使给定 deviceQVulkanDeviceFunctions 对象失效并销毁。

当在应用程序打算继续运行的情况下销毁一个 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 会导致带有错误码 VK_ERROR_INCOMPATIBLE_DRIVERcreate() 失败,这是规范所要求的。从 Vulkan 1.1 开始,规范禁止这种行为,驱动程序必须接受任何版本而不会导致实例创建失败。

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

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

void QVulkanInstance::setExtensions(const QByteArrayList &extensions)

指定启用额外的实例 扩展 的列表。也可以安全地指定不支持扩展,因为这些在运行时不受支持时会被忽略。

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

注意:除非设置了 NoPortabilityDrivers 标志,否则会自动添加 VK_KHR_portability_enumeration。此值是在 Qt 6.5 中引入的。

注意:此函数必须在使用 create() 之前调用,否则将不会有任何效果。

另请参阅:extensions()。

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

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

注意:此函数必须在使用 create() 之前调用,否则将不会有任何效果。

另请参阅:flags()。

void QVulkanInstance::setLayers(const QByteArrayList &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 实现支持的实例级功能版本。

实际上,这可能是如果该函数可用(对于 Vulkan 1.1 及更高版本)的情况下从 vkEnumerateInstanceVersion 返回的值,或者为 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)

如果 queueFamilyIndexphysicalDevice 中的队列家族支持向 window 展示,返回 true。

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

[静态] VkSurfaceKHR QVulkanInstance::surfaceForWindow(QWindow *window)

创建或检索给定 window 的已存在的 VkSurfaceKHR 处理句柄。

返回 Vulkan 表面处理句柄或失败时返回 0。

VkInstance QVulkanInstance::vkInstance() const

返回此 QVulkanInstance 所封装的 VkInstance 处理句柄,或在 create() 尚未成功调用且未通过 setVkInstance() 提供现有实例时返回 nullptr

另请参阅 setVkInstance

© 2024 The Qt Company Ltd. 本文档中的所有文档贡献均为其各自所有者的版权。本文档受自由软件基金会发布的 GNU 自由文档许可证版本 1.3 条件的许可。Qt 及其相关标志是芬兰 The Qt Company Ltd. 和/或世界上其他国家的商标。所有其他商标均为其各自所有者的财产。