QRhiVulkanInitParams 结构体
特定于 Vulkan 的初始化参数。 更多信息...
头文件 | #include <QRhiVulkanInitParams> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake | QT += gui |
自 | Qt 6.6 |
继承 | QRhiInitParams |
公共变量
QByteArrayList | deviceExtensions |
QVulkanInstance * | inst |
QWindow * | window |
静态公共成员
QByteArrayList | preferredExtensionsForImportedDevice() |
QByteArrayList | preferredInstanceExtensions() |
详细说明
注意: 这是一个 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::VulkanSurface 的 QWindow 来创建基于 Vulkan 的 QRhi
QRhiVulkanInitParams params; params.inst = vulkanInstance; params.window = window; rhi = QRhi::create(QRhi::Vulkan, ¶ms);
窗口是可选的,可以省略。但是,这不推荐,因为没有确保在选择图形队列时支持呈现的方式。
注意: 即使指定了窗口,也可以为其他窗口创建 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 QRhi的QVulkanInstance上启用的实例扩展列表。
返回的列表可以直接安全地传递给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.的商标。所有其他商标均为其各自所有者的财产。