Класс QVulkanWindowRenderer
Класс QVulkanWindowRenderer используется для реализации логики рендеринга, специфичной для приложения, для QVulkanWindow. Подробнее...
| Заголовок: | #include <QVulkanWindowRenderer> |
| CMake: | find_package(Qt6 COMPONENTS Gui REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
| qmake: | QT += gui |
| С момента: | Qt 5.10 |
Открытые функции
| виртуальный | ~QVulkanWindowRenderer() |
| виртуальный void | initResources() |
| виртуальный void | initSwapChainResources() |
| виртуальный void | logicalDeviceLost() |
| виртуальный void | physicalDeviceLost() |
| виртуальный void | preInitResources() |
| виртуальный void | releaseResources() |
| виртуальный void | releaseSwapChainResources() |
| виртуальный void | startNextFrame() = 0 |
Подробное описание
Приложения обычно наследуют классы QVulkanWindow и QVulkanWindowRenderer. Первый позволяет обрабатывать события, например, ввод, а второй позволяет реализовать управление ресурсами Vulkan и создание командных буферов, составляющих рендеринг приложения.
Помимо обработки событий, подкласс QVulkanWindow отвечает также за предоставление реализации QVulkanWindow::createRenderer(). Именно здесь происходит подключение окна и рендерера. Типичная реализация просто создает новый экземпляр подкласса QVulkanWindowRenderer.
Документация по членам-функциям
[virtual] QVulkanWindowRenderer::~QVulkanWindowRenderer()
Виртуальный деструктор.
[virtual] void QVulkanWindowRenderer::initResources()
Эта виртуальная функция вызывается, когда требуется создать графические ресурсы рендерера.
В зависимости от флага QVulkanWindow::PersistentResources, ситуаций потери устройства и т.д. эта функция может быть вызвана более одного раза в течение жизненного цикла QVulkanWindow. Однако последующие вызовы всегда предваряются вызовом releaseResources().
Доступ к методам, таким как device(), graphicsQueue() и graphicsCommandPool(), гарантированно возвращает допустимые значения только внутри этой функции и после нее, вплоть до вызова releaseResources().
Реализация по умолчанию пуста.
[virtual] void QVulkanWindowRenderer::initSwapChainResources()
Эта виртуальная функция вызывается, когда можно выполнить инициализацию, связанную с swapchain, framebuffer или renderpass. Swapchain и связанные ресурсы сбрасываются и затем пересоздаются в ответ на события изменения размера окна, поэтому пара вызовов initResources() и releaseResources() может содержать несколько вызовов initSwapChainResources() и releaseSwapChainResources() между ними.
Доступ к методам, таким как QVulkanWindow::swapChainImageSize(), гарантированно возвращает допустимые значения только внутри этой функции и после нее, вплоть до вызова releaseSwapChainResources().
Это также место, где должны выполняться вычисления, зависящие от размера (например, матрица проекции), поскольку эта функция вызывается при каждом изменении размера.
Реализация по умолчанию пуста.
[virtual] void QVulkanWindowRenderer::logicalDeviceLost()
Эта виртуальная функция вызывается, когда логическое устройство (VkDevice) потеряно, что означает, что какая-то операция завершилась с VK_ERROR_DEVICE_LOST.
Реализация по умолчанию пуста.
Обычно нет необходимости выполнять какие-либо специальные действия в этой функции. QVulkanWindow автоматически освободит все ресурсы (вызовет releaseSwapChainResources() и releaseResources() по необходимости) и попытается повторно инициализировать, получив новое устройство. Если физическое устройство также было потеряно, эта попытка повторной инициализации может привести к вызову physicalDeviceLost().
См. также physicalDeviceLost().
[virtual] void QVulkanWindowRenderer::physicalDeviceLost()
Эта виртуальная функция вызывается, когда физическое устройство потеряно, что означает, что создание логического устройства завершилось ошибкой с VK_ERROR_DEVICE_LOST.
Реализация по умолчанию пуста.
Обычно нет необходимости выполнять какие-либо специальные действия в этой функции, поскольку QVulkanWindow автоматически повторит попытку инициализации через определенное время.
См. также logicalDeviceLost().
[virtual] void QVulkanWindowRenderer::preInitResources()
Эта виртуальная функция вызывается непосредственно перед началом графической инициализации, которая приводит к вызову initResources().
Обычно нет необходимости переопределять эту функцию. Однако существуют случаи, которые включают решения, основанные как на физическом устройстве, так и на поверхности. Обычно это невозможно сделать до того, как QVulkanWindow станет видимым, так как поверхность Vulkan недоступна на этом этапе.
Вместо этого приложения могут переопределять эту функцию. Здесь и QVulkanWindow::physicalDevice(), и QVulkanInstance::surfaceForWindow() функциональны, но дальнейшая инициализация логического устройства еще не произошла.
Реализация по умолчанию пуста.
[virtual] 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, когда эта работа завершится.
END_OF_DOCUMENT_MARKERВсе ресурсы Vulkan инициализированы и готовы к использованию при вызове этой функции. Текущий фреймбуфер и основной командный буфер могут быть получены с помощью QVulkanWindow::currentFramebuffer() и QVulkanWindow::currentCommandBuffer(). Логическое устройство и активная графическая очередь доступны через QVulkanWindow::device() и QVulkanWindow::graphicsQueue(). Реализации могут создавать дополнительные командные буферы из пула, возвращаемого QVulkanWindow::graphicsCommandPool(). Для удобства индекс типа памяти, видимой для хоста, и локальной для устройства, доступен через QVulkanWindow::hostVisibleMemoryIndex() и QVulkanWindow::deviceLocalMemoryIndex(). Ко всем этим доступам безопасно обращаться из любого потока.
См. также QVulkanWindow::frameReady() и QVulkanWindow.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/qvulkanwindowrenderer.html