QRhiVulkanInitParams Struct

Vulkan 专用初始化参数。更多

头文件: #include <rhi/qrhi.h>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::GuiPrivate)
qmake: QT += gui-private
Qt 6.6
继承: QRhiInitParams

公共变量

QByteArrayList deviceExtensions
QVulkanInstance *inst
QWindow *window

静态公共成员

详细说明

注: 这是一个 RHI API,兼容性保障有限,详情请参见QRhi

基于 Vulkan 的QRhi 至少需要一个有效的QVulkanInstance 。用户可自行确保其可用性和初始化。这通常在 main() 中完成,类似于下面的示例:

int main(int argc, char **argv)
{
    ...

    QVulkanInstance inst;
    inst.setLayers({ "VK_LAYER_KHRONOS_validation" }); // for debugging only, not for release builds
    inst.setExtensions(QRhiVulkanInitParams::preferredInstanceExtensions());
    if (!inst.create())
        qFatal("Vulkan not available");

    ...
}

本示例启用了可用的Vulkan 验证层,还启用了理想的实例级扩展QRhi 报告(如 VK_KHR_get_physical_device_properties2),只要它们在运行时受 Vulkan 实现的支持。

前者是可选的,在开发阶段非常有用QVulkanInstance ,可方便地将消息和警告重定向到qDebug 。但请避免在生产构建中启用。强烈建议启用后者,这对实现某些功能非常重要(例如,QRhi::CustomInstanceStepRate )。

完成上述操作后,通过传递实例和表面类型设置为QSurface::VulkanSurfaceQWindow ,即可创建基于 Vulkan 的QRhi

QRhiVulkanInitParams params;
params.inst = vulkanInstance;
params.window = window;
rhi = QRhi::create(QRhi::Vulkan, &params);

窗口是可选项,可以省略。但不建议这样做,因为这样就无法确保在选择图形队列时支持呈现。

注意: 即使指定了窗口,也可以为其他窗口创建QRhiSwapChain 对象,只要它们的QWindow::surfaceType() 都设置为QSurface::VulkanSurface

要要求在 Vulkan 设备上启用其他扩展,请在deviceExtensions 中列出它们。在与本地 Vulkan 渲染代码集成时,这一点可能很重要。

预计在初始化QVulkanInstance 之前,将通过调用静态函数preferredInstanceExtensions() 来查询后端所需的实例扩展列表。返回的列表可以安全地原样传给QVulkanInstance::setExtensions(),因为不支持的扩展会被自动过滤掉。如果不这样做,即使系统上的 Vulkan 实现支持相关功能,某些功能(如QRhi::CustomInstanceStepRate )也可能被报告为不支持。

要实现全部功能,QVulkanInstance 需要启用 API 1.1(如果可用)。这意味着,只要QVulkanInstance::supportedApiVersion() 报告至少支持 Vulkan 1.1,就必须调用 1.1 或更高版本的QVulkanInstance::setApiVersion()。如果不这样做,即使系统上的 Vulkan 实现支持 Vulkan 1.1 或更新版本,某些功能(如QRhi::RenderTo3DTextureSlice )也可能被报告为不支持。

与现有 Vulkan 设备协同工作

与其他图形引擎互操作时,可能需要获取使用相同 Vulkan 设备的QRhi 实例。这可以通过向QRhi::create() 传递指向QRhiVulkanNativeHandles 的指针来实现。

物理设备必须始终设置为非空值。如果只想指定一个物理设备,而将 VkDevice 和队列创建的其余部分留给QRhi ,则无需在结构体中填写其他成员。例如,在使用 OpenXR 时就是这种情况。

要采用现有的VkDevice ,设备字段也必须设置为非空值。此外,还需要图形队列族索引。队列索引是可选项,因为默认值 0 通常是合适的。

也可选择指定一个现有的命令池对象。还可选择使用 vmemAllocator 在两个QRhi 实例之间共享同一个Vulkan 内存分配器

QRhi 不拥有任何外部对象的所有权。

我们鼓励应用程序通过调用静态函数preferredExtensionsForImportedDevice() 来查询所需的设备扩展列表,并在 VkDevice 上启用它们。否则,某些QRhi 功能可能无法使用。

成员函数文档

[static] QByteArrayList QRhiVulkanInitParams::preferredExtensionsForImportedDevice()

使用外部创建的VkDevice 对象创建基于 Vulkan 的QRhi 时,返回预计在VkDevice 上启用的设备扩展名列表。

[static] QByteArrayList QRhiVulkanInitParams::preferredInstanceExtensions()

返回预计将在QVulkanInstance 上启用的实例扩展列表,该 用于基于 Vulkan 的QRhi

返回的列表可以原样安全地传给QVulkanInstance::setExtensions() ,因为不支持的扩展会被自动过滤掉。

成员变量文档

QByteArrayList QRhiVulkanInitParams::deviceExtensions

可选项,默认为空。要启用的 Vulkan 设备扩展列表。不支持的扩展会被自动忽略。

QVulkanInstance *QRhiVulkanInitParams::inst

已成功createdQVulkanInstance ,需要。

QWindow *QRhiVulkanInitParams::window

可选项,但建议使用QWindow

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