Класс QVulkanWindowRenderer
Класс QVulkanWindowRenderer используется для реализации специфичной для приложения логики отрисовки для QVulkanWindow. Подробнее...
| Заголовок: | #include <QVulkanWindowRenderer> |
| qmake: | QT += gui |
| С тех пор: | Qt 5.10 |
Открытые функции
| виртуальный | ~QVulkanWindowRenderer() |
| виртуальный void | initResources() |
| виртуальный void | initSwapChainResources() |
| виртуальный void | logicalDeviceLost() |
| виртуальный void | physicalDeviceLost() |
| виртуальный void | preInitResources() |
| виртуальный void | releaseResources() |
| виртуальный void | releaseSwapChainResources() |
| виртуальный void | startNextFrame() = 0 |
Подробное описание
Класс QVulkanWindowRenderer используется для реализации специфичной для приложения логики отрисовки для QVulkanWindow.
Приложения обычно наследуют классы 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 только после завершения этой работы.
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-5.12/qvulkanwindowrenderer.html