Класс 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 |
Открытые функции
| virtual | ~QVulkanWindowRenderer() |
| virtual void | initResources() |
| virtual void | initSwapChainResources() |
| virtual void | logicalDeviceLost() |
| virtual void | physicalDeviceLost() |
| virtual void | preInitResources() |
| virtual void | releaseResources() |
| virtual void | releaseSwapChainResources() |
| virtual 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, буфером фреймов или 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, буфером фреймов или renderpass, должны быть освобождены.
Реализация должна быть готова к тому, что за этим вызовом может последовать новый вызов initSwapChainResources() в более поздний момент.
QVulkanWindow позаботится о том, чтобы устройство было неактивным до и после вызова этой функции.
Реализация по умолчанию пустая.
Примечание: Это последнее место для работы со всеми графическими ресурсами, прежде чем QVulkanWindow начнёт их освобождать. Поэтому крайне важно, чтобы реализации с асинхронной, потенциально многопоточной startNextFrame() выполняли блокирующее ожидание и вызывали QVulkanWindow::frameReady() перед возвратом из этой функции, если имеется ожидаемое представление фрейма.
[pure virtual] void QVulkanWindowRenderer::startNextFrame()
Эта виртуальная функция вызывается, когда вызовы отрисовки для следующего кадра должны быть добавлены в буфер команд.
Каждый вызов этой функции должен сопровождаться вызовом QVulkanWindow::frameReady(). Отсутствие этого вызова приведёт к остановке цикла отрисовки. Вызов также может быть выполнен в более позднее время, после возвращения из этой функции. Это означает, что можно запустить асинхронную работу и только обновить буфер команд и уведомить QVulkanWindow, когда эта работа будет завершена.
Все ресурсы 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.2/qvulkanwindowrenderer.html