QVulkanWindowRenderer 类

QVulkanWindowRenderer 类用于实现针对 QVulkanWindow 的应用程序特定渲染逻辑。 更多信息...

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

公共函数

虚拟~QVulkanWindowRenderer()
虚拟 voidinitResources()
虚拟 voidinitSwapChainResources()
虚拟 voidlogicalDeviceLost()
虚拟 voidphysicalDeviceLost()
虚拟 voidpreInitResources()
虚拟 voidreleaseResources()
虚拟 voidreleaseSwapChainResources()
虚拟 voidstartNextFrame() = 0

详细说明

应用程序通常都会继承 QVulkanWindow 和 QVulkanWindowRenderer。前者允许处理事件,例如输入,而后者允许实现应用程序渲染的 Vulkan 资源管理和命令缓冲区构建。

除了事件处理,QVulkanWindow 子类还负责提供 QVulkanWindow::createRenderer() 的实现。这是窗口和渲染器连接的地方。典型的实现将简单创建 QVulkanWindowRenderer 的子类的一个新实例。

成员函数文档

[虚拟 noexcept] QVulkanWindowRenderer::~QVulkanWindowRenderer()

虚析构函数。

[虚拟] void QVulkanWindowRenderer::initResources()

当需要创建渲染器的图形资源时,将调用此虚拟函数。

根据 QVulkanWindow::PersistentResources 标志、设备丢失等情况,此函数在 QVulkanWindow 的生命周期中可能被调用多次。然而,后续调用总是在调用 releaseResources() 之后。

device()、graphicsQueue() 和 graphicsCommandPool() 等访问器只能在函数内部及其之后,直到调用 releaseResources() 时保证返回有效的值。

默认实现为空。

[虚拟] void QVulkanWindowRenderer::initSwapChainResources()

当可以进行swapchain、framebuffer或renderpass相关初始化时,将调用此虚函数。当响应窗口调整大小时会重置并重新创建swapchain及相关的资源,因此可能在调用initResources() 和 releaseResources()之间有多个对initSwapChainResources() 和 releaseSwapChainResources() 的调用。

QVulkanWindow::swapChainImageSize()这样的访问器仅保证在此函数之后及之后的调用中返回有效的值,直到releaseSwapChainResources() 被调用。

由于这个函数在每次调整大小时都会被调用,这也是执行与尺寸相关的计算(例如,投影矩阵)的地方。

默认实现为空。

[虚函数] void QVulkanWindowRenderer::logicalDeviceLost()

当逻辑设备(VkDevice)丢失时,将调用此虚函数,意味着某些操作因错误码VK_ERROR_DEVICE_LOST失败。

默认实现为空。

通常不需要在此函数中执行任何特殊操作,QVulkanWindow会自动释放所有资源(根据需要调用releaseSwapChainResources() 和 releaseResources()),并尝试重新初始化,获取新的设备。当物理设备也丢失时,这种重新初始化尝试可能会导致physicalDeviceLost()。

另请参阅physicalDeviceLost

[虚函数] void QVulkanWindowRenderer::physicalDeviceLost()

当物理设备丢失时,将调用此虚函数,意味着创建逻辑设备失败,错误码为VK_ERROR_DEVICE_LOST

默认实现为空。

通常不需要在此函数中执行任何特殊操作,因为QVulkanWindow会在一定时间后自动重试初始化。

另请参阅logicalDeviceLost

[虚函数] void QVulkanWindowRenderer::preInitResources()

在图形初始化之前,即即将调用initResources()之前,将调用此虚函数。

通常不需要重新实现此函数。但是,有些情况需要根据物理设备和表面做出决定。由于在此阶段无法获取Vulkan表面,这些操作通常无法进行。

应用程序可以重新实现此函数。此时,QVulkanWindow::physicalDevice() 和 QVulkanInstance::surfaceForWindow() 都是可用的,但尚未进行更进一步的逻辑设备初始化。

默认实现为空。

[虚函数] void QVulkanWindowRenderer::releaseResources()

当需要在渲染器上释放图形资源时,将调用此虚函数。

实现必须准备在此函数的调用后面可能还会有一个initResources()调用。

QVulkanWindow 在调用此函数前和后负责等待设备空闲。

默认实现为空。

[virtual] void QVulkanWindowRenderer::releaseSwapChainResources()

当需要释放与swapchain、framebuffer或renderpass相关资源时,将调用此虚函数。

实现此函数时必须准备后续可能在新点调用 initSwapChainResources()。

QVulkanWindow 在调用此函数前和后负责等待设备空闲。

默认实现为空。

注意:这是在 QVulkanWindow 开始释放所有图形资源之前,保持所有图形资源完整操作的最后位置。因此,对于具有异步、潜在的、多线程startNextFrame()的实现,必须在从该函数返回之前执行阻塞等待并调用QVulkanWindow::frameReady(),以防出现待提交的帧。

[pure virtual] void QVulkanWindowRenderer::startNextFrame()

当需要将下一帧绘制调用添加到命令缓冲区时,将调用此虚函数。

对这种函数的每次调用都必须跟随一个对QVulkanWindow::frameReady()的调用。未能这样做将导致渲染循环停滞。也可以在返回该函数后稍后进行调用。这意味着可以启动异步工作,只有当该工作完成时才更新命令缓冲区并通知 QVulkanWindow

调用此函数时,所有Vulkan资源都初始化并准备好。当前framebuffer和主命令缓冲区可以通过QVulkanWindow::currentFramebuffer()和QVulkanWindow::currentCommandBuffer()检索。逻辑设备和活动图形队列可以通过QVulkanWindow::device()和QVulkanWindow::graphicsQueue()获取。实现可以创建额外的命令缓冲区,这些缓冲区来自QVulkanWindow::graphicsCommandPool()返回的池。为了方便,通过QVulkanWindow::hostVisibleMemoryIndex()和QVulkanWindow::deviceLocalMemoryIndex()公开了主机可见内存类型索引和设备本地内存类型索引。所有这些访问器都可在任何线程中安全调用。

另请参阅QVulkanWindow::frameReady()和QVulkanWindow

© 2024 Qt公司 Ltd。其中包含的文档贡献是各自所有者的版权。在此提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款许可的。Qt及其标志是芬兰和/或其他国家/地区的 Qt 公司的商标。所有其他商标均为其各自所有者的财产。