QRhiVulkanInitParams 结构体

特定于 Vulkan 的初始化参数。 更多信息...

头文件 #include <QRhiVulkanInitParams>
CMakefind_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmakeQT += gui
Qt 6.6
继承 QRhiInitParams

公共变量

QByteArrayListdeviceExtensions
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()函数,因为不支持的扩展会被自动过滤。如果不进行此操作,某些功能,如QRhi::CustomInstanceStepRate,即使系统上的Vulkan实现支持相关功能,也可能报告为不受支持。

要实现全部功能,QVulkanInstance需要在可用的条件下启用API 1.1。这意味着在QVulkanInstance::supportedApiVersion()报告至少支持Vulkan 1.1时,每次调用QVulkanInstance::setApiVersion()都将1.1或更高版本。如果不执行此操作,某些功能,如QRhi::RenderTo3DTextureSlice,即使系统上的Vulkan实现支持Vulkan 1.1或更高版本,也可能报告为不受支持。

使用现有的Vulkan设备

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

物理设备必须始终设置为非空值。如果意图只是指定物理设备,其余的VkDevice和队列创建留由QRhi处理,则结构体中不需要填写其他成员。例如,这就是与OpenXR一起工作时的情况。

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

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

QRhi不会获取任何外部对象的所有权。

鼓励应用程序通过调用静态函数preferredExtensionsForImportedDevice()查询预期在创建基于Vulkan的QRhi时启用在VkDevice上的设备扩展列表,并在VkDevice上启用它们。否则,某些QRhi功能可能不可用。

成员函数文档

[静态] QByteArrayList QRhiVulkanInitParams::preferredExtensionsForImportedDevice()

返回在创建具有外部创建的VkDevice对象的Vulkan-based QRhi时,预期在VkDevice上启用的设备扩展列表。

[静态] QByteArrayList QRhiVulkanInitParams::preferredInstanceExtensions()

返回预期用于Vulkan-based QRhiQVulkanInstance上启用的实例扩展列表。

返回的列表可以直接安全地传递给QVulkanInstance::setExtensions(),因为不支持的功能会被自动过滤。

成员变量文档

QByteArrayList QRhiVulkanInitParams::deviceExtensions

可选的,默认为空。启用Vulkan设备功能的列表。不支持的功能会被优雅地忽略。

QVulkanInstance *QRhiVulkanInitParams::inst

已成功创建QVulkanInstance,必须提供。

QWindow *QRhiVulkanInitParams::window

可选的,但针对QWindow时推荐。

© 2024 The Qt Company Ltd. 包含在内的文档贡献者是各自版权的所有者。提供的文档是根据GNU自由文档许可证版本1.3(由自由软件基金会发布)的条款许可的。Qt及其相关标志是芬兰及全球其他国家的The Qt Company Ltd.的商标。所有其他商标均为其各自所有者的财产。