Класс QVulkanWindow
Класс QVulkanWindow — это вспомогательный подкласс QWindow для выполнения рендеринга Vulkan. Подробнее...
| Заголовок: | #include <QVulkanWindow> |
| qmake: | QT += gui |
| С версии: | Qt 5.10 |
| Наследует: | QWindow |
Этот класс был введён в Qt 5.10.
Открытые типы
| enum | Flag { PersistentResources } |
| flags | Flags |
| typedef | QueueCreateInfoModifier |
Открытые функции
| QVulkanWindow(QWindow *parent = nullptr) | |
| virtual | ~QVulkanWindow() |
| QVector<VkPhysicalDeviceProperties> | availablePhysicalDevices() |
| QMatrix4x4 | clipCorrectionMatrix() |
| VkFormat | colorFormat() const |
| int | concurrentFrameCount() const |
| virtual QVulkanWindowRenderer * | createRenderer() |
| VkCommandBuffer | currentCommandBuffer() const |
| int | currentFrame() const |
| VkFramebuffer | currentFramebuffer() const |
| int | currentSwapChainImageIndex() const |
| VkRenderPass | defaultRenderPass() const |
| VkFormat | depthStencilFormat() const |
| VkImage | depthStencilImage() const |
| VkImageView | depthStencilImageView() const |
| VkDevice | device() const |
| uint32_t | deviceLocalMemoryIndex() const |
| QVulkanWindow::Flags | flags() const |
| void | frameReady() |
| QImage | grab() |
| VkCommandPool | graphicsCommandPool() const |
| VkQueue | graphicsQueue() const |
| uint32_t | graphicsQueueFamilyIndex() const |
| uint32_t | hostVisibleMemoryIndex() const |
| bool | isValid() const |
| VkImage | msaaColorImage(int idx) const |
| VkImageView | msaaColorImageView(int idx) const |
| VkPhysicalDevice | physicalDevice() const |
| const VkPhysicalDeviceProperties * | physicalDeviceProperties() const |
| VkSampleCountFlagBits | sampleCountFlagBits() const |
| void | setDeviceExtensions(const QByteArrayList &extensions) |
| void | setFlags(QVulkanWindow::Flags flags) |
| void | setPhysicalDeviceIndex(int idx) |
| void | setPreferredColorFormats(const QVector<VkFormat> &formats) |
| void | setQueueCreateInfoModifier(const QVulkanWindow::QueueCreateInfoModifier &modifier) |
| void | setSampleCount(int sampleCount) |
| QVulkanInfoVector<QVulkanExtension> | supportedDeviceExtensions() |
| QVector<int> | supportedSampleCounts() |
| bool | supportsGrab() const |
| VkImage | swapChainImage(int idx) const |
| int | swapChainImageCount() const |
| QSize | swapChainImageSize() const |
| VkImageView | swapChainImageView(int idx) const |
Статические открытые члены
| const int | MAX_CONCURRENT_FRAME_COUNT |
Подробное описание
QVulkanWindow — это поддерживающее Vulkan окно QWindow, которое управляет устройством Vulkan, графической очередью, пулом команд и буфером, изображением глубины/шаблона и двухбуферным FIFO-обменным буфером, одновременно обеспечивая корректное поведение при таких событиях, как изменение размера, специальные ситуации, например, отсутствие очереди устройств, поддерживающей как графику, так и презентацию, сценарии потери устройства, и дополнительные функции, такие как чтение обратно отрендеренного контента. По своей концепции это аналог QOpenGLWindow в мире Vulkan.
Примечание: QVulkanWindow не всегда исключает необходимость реализации полностью настраиваемого подкласса QWindow, поскольку он не всегда будет достаточным в сложных случаях использования.
QVulkanWindow может быть встроен в пользовательские интерфейсы на основе QWidget с помощью QWidget::createWindowContainer(). Однако этот подход имеет ряд ограничений. Обязательно изучите документацию сначала.
Типичное приложение, использующее QVulkanWindow, может выглядеть следующим образом:
class VulkanRenderer : public QVulkanWindowRenderer
{
public:
VulkanRenderer(QVulkanWindow *w) : m_window(w) { }
void initResources() override
{
m_devFuncs = m_window->vulkanInstance()->deviceFunctions(m_window->device());
...
}
void initSwapChainResources() override { ... }
void releaseSwapChainResources() override { ... }
void releaseResources() override { ... }
void startNextFrame() override
{
VkCommandBuffer cmdBuf = m_window->currentCommandBuffer();
...
m_devFuncs->vkCmdBeginRenderPass(...);
...
m_window->frameReady();
}
private:
QVulkanWindow *m_window;
QVulkanDeviceFunctions *m_devFuncs;
};
class VulkanWindow : public QVulkanWindow
{
public:
QVulkanWindowRenderer *createRenderer() override {
return new VulkanRenderer(this);
}
};
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QVulkanInstance inst;
// enable the standard validation layers, when available
inst.setLayers(QByteArrayList() << "VK_LAYER_LUNARG_standard_validation");
if (!inst.create())
qFatal("Failed to create Vulkan instance: %d", inst.errorCode());
VulkanWindow w;
w.setVulkanInstance(&inst);
w.showMaximized();
return app.exec();
} Как видно из примера, основные шаблоны использования QVulkanWindow таковы:
- Экземпляр QVulkanInstance ассоциируется через QWindow::setVulkanInstance(). Затем его можно получить через QWindow::vulkanInstance() из любой точки, на любом потоке.
- Аналогично QVulkanInstance, расширения устройства можно запросить через supportedDeviceExtensions() до фактической инициализации. Запрос на включение расширения выполняется через setDeviceExtensions(). Такие вызовы должны быть выполнены до того, как окно станет видимым, то есть до вызова show() или подобных функций. Запросы на несуществующие расширения игнорируются.
- Рендерер реализован в подклассе QVulkanWindowRenderer, экземпляр которого создается в фабричной функции createRenderer().
- Основная команда Vulkan раскрыта через объект QVulkanFunctions, доступный путем вызова QVulkanInstance::functions(). Функции уровня устройства доступны после создания VkDevice вызовом QVulkanInstance::deviceFunctions().
- Создание вызовов отрисовки для следующего кадра происходит в QVulkanWindowRenderer::startNextFrame(). Реализация должна добавлять команды в буфер команд, возвращаемый функцией currentCommandBuffer(). Возврат из функции не означает, что команды готовы к отправке. Требуется явный вызов frameReady(). Это позволяет асинхронное создание команд, возможно, на нескольких потоках. Простые реализации просто вызовут frameReady() в конце своей функции QVulkanWindowRenderer::startNextFrame().
- Основные ресурсы Vulkan (физическое устройство, графический буфер очереди, пул команд, главный буфер команд окна, форматы изображений и т.д.) доступны в QVulkanWindow через легкие функции-геттеры. Некоторые из них предназначены только для удобства, и приложения всегда могут запросить, создать и управлять дополнительными ресурсами напрямую через API Vulkan.
- Рендерер работает в потоке GUI/главном потоке, как и само окно. Этот поток затем ограничен частотой обновления, аналогично тому, как ведёт себя OpenGL со значением интервала обмена 1. Однако реализация рендерера может использовать несколько потоков любым подходящим способом. Доступные функции, такие как vulkanInstance(), currentCommandBuffer() и т.д., могут вызываться из любого потока. Отправка основного буфера команд, ввод в очередь представления и создание следующего кадра не начинаются до тех пор, пока не будет вызван frameReady() в потоке GUI/главном потоке.
- Когда окно становится видимым, содержимое обновляется автоматически. Дальнейшие обновления можно запросить, вызвав QWindow::requestUpdate(). Для непрерывной отрисовки вызовите requestUpdate() после frameReady().
Для отладки включите категорию регистрации qt.vulkan. Критические ошибки выводятся через qWarning() автоматически.
Отличия систем координат OpenGL и Vulkan
Есть два заметных отличия: Во-первых, в Vulkan ось Y в пространстве клипа направлена вниз, в то время как OpenGL использует ось Y, направленную вверх. Во-вторых, стандартная матрица проекции OpenGL предполагает значения ближней и дальней плоскостей -1 и 1, а Vulkan предпочитает 0 и 1.
Для помощи приложениям при миграции из кода на основе OpenGL без необходимости переворачивать координаты Y в данных вершин и для возможности использования функций QMatrix4x4, таких как QMatrix4x4::perspective(), при сохранении значений minDepth и maxDepth вьюпорта Vulkan равными 0 и 1 соответственно, QVulkanWindow предоставляет матрицу коррекции, доступную при вызове clipCorrectionMatrix().
Мультисэмплирование
Несмотря на то, что отключено по умолчанию, сэмплирование с антиалиасингом полностью поддерживается QVulkanWindow. Дополнительные буферы цвета и разрешение в буферы обмена без мультисэмплирования управляются автоматически.
Для запроса поддерживаемых значений количества сэмплов вызовите supportedSampleCounts(). Если возвращаемый набор содержит 4, 8, ..., передача одного из этих значений в setSampleCount() запрашивает рендеринг с мультисэмплированием.
Примечание: в отличие от QSurfaceFormat::setSamples(), список поддерживаемых значений количества сэмплов предоставляется приложениям заранее, и в setSampleCount() нет автоматического возврата к меньшим значениям количества сэмплов. Если запрошенное значение не поддерживается, выводится предупреждение, и мультисэмплирование не будет использоваться.
Чтение изображений обратно
Когда supportsGrab() возвращает true, QVulkanWindow может выполнять чтение из буфера цвета в QImage. grab() — медленная и неэффективная операция, поэтому частый вызов следует избегать. Тем не менее, она полезна, так как позволяет приложениям делать скриншоты или инструментам и тестам обрабатывать и проверять результаты рендеринга графическим процессором.
Поддержка sRGB
Хотя многие приложения смогут работать с поведением QVulkanWindow по умолчанию, когда речь идёт о форматах изображений буфера обмена, setPreferredColorFormats() позволяет запросить предварительно определённый формат. Это особенно полезно при работе в цветовом пространстве sRGB. Передача формата, такого как VK_FORMAT_B8G8R8A8_SRGB, приводит к выбору формата sRGB, если он доступен.
Слои валидации
При разработке приложений крайне полезно иметь включённые слои валидации Vulkan. Как показано в примере кода выше, вызов QVulkanInstance::setLayers() в QVulkanInstance до QVulkanInstance::create() включает валидацию, предполагая, что стек драйвера Vulkan в системе содержит необходимые слои.
Примечание: Следует учитывать платформенные различия. На настольных платформах обычно достаточно установки Vulkan SDK. Однако, например, Android требует развертывания дополнительных общих библиотек вместе с приложением и также требует другого списка имен слоёв валидации. Дополнительную информацию см. на страницах разработки Vulkan для Android .
Примечание: QVulkanWindow не предоставляет слои устройств, так как эта функциональность устарела начиная с версии 1.0.13 API Vulkan.
См. также QVulkanInstance и QWindow.
Документация по типам членов
перечисление QVulkanWindow::Flagфлаги QVulkanWindow::Flags
Это перечисление описывает флаги, которые можно передать в setFlags().
| Константа | Значение | Описание |
|---|---|---|
QVulkanWindow::PersistentResources |
0x01 |
Обеспечивает, что графические ресурсы не освобождаются, когда окно становится невидимым. По умолчанию все ресурсы освобождаются и повторно инициализируются при повторном отображении окна. |
Тип Flags является типом-псевдонимом для QFlags<Flag>. Он хранит логическое ИЛИ комбинацию значений Flag.
тип QVulkanWindow::QueueCreateInfoModifier
Функция, вызываемая во время графической инициализации для добавления дополнительных очередей, которые должны быть созданы.
Устанавливается, если рендереру нужны дополнительные очереди помимо стандартной графической очереди (например, очередь передачи). Предоставленные свойства семейства очередей могут использоваться для выбора индексов дополнительных очередей. Впоследствии рендерер может запросить фактическую очередь в initResources().
Обратите внимание при запросе дополнительных графических очередей: Qt всегда запрашивает графическую очередь, вам нужно будет найти соответствующую запись в queueCreateInfo и изменить её, чтобы получить дополнительную очередь.
См. также setQueueCreateInfoModifier().
Документация по функциям-членам
QVulkanWindow::QVulkanWindow(QWindow *parent = nullptr)
Конструирует новый QVulkanWindow с заданным parent.
Тип поверхности установлен в QSurface::VulkanSurface.
[virtual] QVulkanWindow::~QVulkanWindow()
Деструктор.
QVector<VkPhysicalDeviceProperties> QVulkanWindow::availablePhysicalDevices()
Возвращает список свойств поддерживаемых физических устройств в системе.
Примечание: Эту функцию можно вызывать до того, как окно станет видимым.
QMatrix4x4 QVulkanWindow::clipCorrectionMatrix()
Возвращает QMatrix4x4, который можно использовать для исправления различий систем координат между OpenGL и Vulkan.
Умножением матрицы проекции на эту матрицу приложения могут продолжать считать, что Y направлен вверх, и могут установить minDepth и maxDepth в viewport в 0 и 1 соответственно, не выполняя дополнительных исправлений позиций Z вершин. Геометрия из приложений OpenGL может использоваться без изменений, предполагая состояние растризации, соответствующее настройкам обрезки и лицевой стороны OpenGL.
VkFormat QVulkanWindow::colorFormat() const
Возвращает формат буфера цвета, используемый буфером обмена.
Примечание: Вызов этой функции допустим только с вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
См. также setPreferredColorFormats().
int QVulkanWindow::concurrentFrameCount() const
Возвращает количество кадров, которые могут быть потенциально активны одновременно.
Примечание: Значение является постоянным для всего срока существования QVulkanWindow.
class Renderer {
...
VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT];
};
void Renderer::startNextFrame()
{
const int count = m_window->concurrentFrameCount();
for (int i = 0; i < count; ++i)
m_uniformBufInfo[i] = ...
...
} См. такжеcurrentFrame().
[virtual] QVulkanWindowRenderer *QVulkanWindow::createRenderer()
Возвращает новый экземпляр QVulkanWindowRenderer.
Этот виртуальный метод вызывается один раз за время жизни окна, в какой-то момент после его первого отображения.
По умолчанию возвращает null, поэтому отрисовка не будет выполняться, за исключением очистки буферов.
Окно принимает во владение возвращённый объект рендерера.
VkCommandBuffer QVulkanWindow::currentCommandBuffer() const
Возвращает активный буфер команд для текущего изображения swap-цепи. Реализации QVulkanWindowRenderer::startNextFrame() должны добавлять команды в этот буфер команд.
Примечание: Этот метод должен вызываться только изнутри startNextFrame() и, в случае асинхронного создания команд, до вызова frameReady().
int QVulkanWindow::currentFrame() const
Возвращает индекс текущего кадра в диапазоне [0, concurrentFrameCount() - 1].
Реализации рендеринга должны гарантировать, что данные униформы и другие динамические ресурсы существуют в нескольких копиях, чтобы предотвратить изменение данных, используемых ещё активными кадрами N - 1, N - 2, ... N - concurrentFrameCount() + 1, кадром N.
Чтобы избежать зависимости от размеров динамических массивов, приложения могут использовать MAX_CONCURRENT_FRAME_COUNT при объявлении массивов. Это гарантированно будет всегда равно или больше значения, возвращаемого concurrentFrameCount(). Такие массивы затем можно индексировать с помощью значения, возвращаемого этим методом.
class Renderer {
...
VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT];
};
void Renderer::startNextFrame()
{
VkDescriptorBufferInfo &uniformBufInfo(m_uniformBufInfo[m_window->currentFrame()]);
...
} Примечание: Этот метод должен вызываться только изнутри startNextFrame() и, в случае асинхронного создания команд, до вызова frameReady().
См. также concurrentFrameCount().
VkFramebuffer QVulkanWindow::currentFramebuffer() const
Возвращает VkFramebuffer для текущего изображения swap-цепи, используя стандартный render pass.
Framebuffer имеет два атрибута (цвет, глубина-шаблон), если не используется мультисэмплинг, и три (разрешение цвета, глубина-шаблон, цвет мультисэмплинга), если sampleCountFlagBits() больше чем VK_SAMPLE_COUNT_1_BIT.
Рендереры должны учесть это, например, при предоставлении значений очистки.
Примечание: Приложения не обязаны использовать этот framebuffer, если они предоставляют свой собственный render pass вместо использования render pass, возвращённого из defaultRenderPass().
Примечание: Этот метод должен вызываться только изнутри startNextFrame() и, в случае асинхронного создания команд, до вызова frameReady().
См. также defaultRenderPass().
int QVulkanWindow::currentSwapChainImageIndex() const
Возвращает индекс текущего изображения swap-цепи в диапазоне [0, swapChainImageCount() - 1].
Примечание: Этот метод должен вызываться только изнутри startNextFrame() и, в случае асинхронного создания команд, до вызова frameReady().
VkRenderPass QVulkanWindow::defaultRenderPass() const
Возвращает типичный render pass с одним под-проходом.
Примечание: Приложения не обязаны использовать этот render pass. Однако они несут ответственность за обеспечение того, что текущие изображения swap-цепи и глубина-шаблон переведены из VK_IMAGE_LAYOUT_UNDEFINED в VK_IMAGE_LAYOUT_PRESENT_SRC_KHR и VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL либо через собственный render pass приложения, либо другими способами.
Примечание: Чтение/запись stencil не включены в этот render pass.
Примечание: Вызов этого метода допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
См. также currentFramebuffer().
VkFormat QVulkanWindow::depthStencilFormat() const
Возвращает формат, используемый буфером(ами) глубины-шаблона.
Примечание: Вызов этого метода допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
VkImage QVulkanWindow::depthStencilImage() const
Возвращает изображение глубины-шаблона.
Примечание: Вызов этого метода допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
VkImageView QVulkanWindow::depthStencilImageView() const
Возвращает представление изображения глубины-шаблона.
Примечание: Вызов этого метода допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
VkDevice QVulkanWindow::device() const
Возвращает активное логическое устройство.
Примечание: Вызов этого метода допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
uint32_t QVulkanWindow::deviceLocalMemoryIndex() const
Возвращает индекс типа локальной памяти устройства, подходящий для общего использования.
Примечание: Вызов этого метода допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
Примечание: Нет гарантии, что этот тип памяти всегда подходит. Правильное решение, особенно для изображений локального устройства, — вручную выбрать тип памяти после проверки маски, возвращённой из vkGetImageMemoryRequirements.
QVulkanWindow::Flags QVulkanWindow::flags() const
Возвращает запрошенные флаги.
См. также setFlags().
void QVulkanWindow::frameReady()
Этот метод должен вызываться ровно один раз в ответ на каждый вызов реализации QVulkanWindowRenderer::startNextFrame(). В момент вызова этого метода главный буфер команд, доступный через currentCommandBuffer(), должен содержать все необходимые команды отрисовки, поскольку этот метод вызовет отправку команд и добавление команды представления в очередь.
Примечание: Этот метод должен вызываться только из потока GUI/главного потока, где вызываются функции QVulkanWindowRenderer и где находится экземпляр QVulkanWindow.
См. также QVulkanWindowRenderer::startNextFrame().
QImage QVulkanWindow::grab()
Создаёт и отрисовывает следующий кадр без его представления, а затем выполняет блокирующую обратную запись содержимого изображения.
Возвращает изображение, если реализация метода renderer's startNextFrame() вызывает frameReady() напрямую. В противном случае возвращает неполное изображение, имеющее правильный размер, но не содержащее содержимого. Содержимое будет передано через сигнал frameGrabbed() в последнем случае.
Примечание: Этот метод не следует вызывать, когда кадр находится в процессе обработки (то есть, frameReady() ещё не был вызван приложением).
Примечание: Этот метод потенциально дорогостоящий из-за дополнительной, блокирующей обратной записи.
Примечание: В настоящее время этот метод требует, чтобы swap-цепь поддерживала использование в качестве источника передачи (VK_IMAGE_USAGE_TRANSFER_SRC_BIT), и в противном случае завершится ошибкой.
VkCommandPool QVulkanWindow::graphicsCommandPool() const
Возвращает активный буфер команд графики.
Примечание: Вызов этого метода допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
VkQueue QVulkanWindow::graphicsQueue() const
Возвращает активную очередь графики.
Примечание: Вызов этого метода допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
uint32_t QVulkanWindow::graphicsQueueFamilyIndex() const
Возвращает индекс семейства активной очереди графики.
Примечание: Вызов этого метода допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources(). Реализации QVulkanWindowRenderer::updateQueueCreateInfo() также могут вызывать этот метод.
Этот метод был добавлен в Qt 5.15.
uint32_t QVulkanWindow::hostVisibleMemoryIndex() const
Возвращает индекс типа памяти, видимой хосту, подходящий для общего использования.
Возвращаемый тип памяти будет одновременно видимым для хоста и когерентным. Кроме того, он также будет кэшироваться, если это возможно.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
bool QVulkanWindow::isValid() const
Возвращает true, если окно успешно инициализировало все ресурсы Vulkan, включая цепочку обмена.
Примечание: Инициализация происходит при первом событии expose после того, как окно станет видимым.
VkImage QVulkanWindow::msaaColorImage(int idx) const
Возвращает указанный цветной многообразный цвет, или VK_NULL_HANDLE если многообразный цвет не используется.
idx должно быть в диапазоне [0, swapChainImageCount() - 1].
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
VkImageView QVulkanWindow::msaaColorImageView(int idx) const
Возвращает указанный цветной многообразный вид, или VK_NULL_HANDLE если многообразный цвет не используется.
idx должно быть в диапазоне [0, swapChainImageCount() - 1].
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
VkPhysicalDevice QVulkanWindow::physicalDevice() const
Возвращает активное физическое устройство.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::preInitResources() до QVulkanWindowRenderer::releaseResources().
const VkPhysicalDeviceProperties *QVulkanWindow::physicalDeviceProperties() const
Возвращает указатель на свойства активного физического устройства.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::preInitResources() до QVulkanWindowRenderer::releaseResources().
VkSampleCountFlagBits QVulkanWindow::sampleCountFlagBits() const
Возвращает текущее количество выборок как VkSampleCountFlagBits значение.
При работе с целевым рендеринговым целевым объектом поле rasterizationSamples объекта VkPipelineMultisampleStateCreateInfo должно быть установлено на это значение.
См. также setSampleCount() и supportedSampleCounts().
void QVulkanWindow::setDeviceExtensions(const QByteArrayList &extensions)
Устанавливает список extensions устройства, которые нужно включить.
Неподдерживаемые расширения игнорируются.
Расширение swapchain всегда добавляется автоматически, нет необходимости включать его в этот список.
Примечание: Эта функция должна быть вызвана до того, как окно станет видимым, или как минимум в QVulkanWindowRenderer::preInitResources(), и не имеет эффекта, если вызвана после.
void QVulkanWindow::setFlags(QVulkanWindow::Flags flags)
Настраивает поведение в соответствии с предоставленными flags.
Примечание: Эта функция должна быть вызвана до того, как окно станет видимым, или как минимум в QVulkanWindowRenderer::preInitResources(), и не имеет эффекта, если вызвана после.
См. также flags().
void QVulkanWindow::setPhysicalDeviceIndex(int idx)
Запрашивает использование физического устройства с индексом idx. Индекс соответствует списку, возвращаемому из availablePhysicalDevices().
По умолчанию используется первое физическое устройство.
Примечание: Эта функция должна быть вызвана до того, как окно станет видимым, или как минимум в QVulkanWindowRenderer::preInitResources(), и не имеет эффекта, если вызвана после.
void QVulkanWindow::setPreferredColorFormats(const QVector<VkFormat> &formats)
Устанавливает предпочтительные форматы цепочки обмена.
По умолчанию не установлено никаких предпочтительных форматов приложения. В этом случае используется предпочтительный формат поверхности или, в его отсутствие, VK_FORMAT_B8G8R8A8_UNORM.
Список в форматах отсортирован. Если первый формат не поддерживается, будет рассмотрен второй и так далее. Когда ни один из форматов в списке не поддерживается, поведение такое же, как и в случае по умолчанию.
Чтобы запросить фактический формат после инициализации, вызовите colorFormat().
Примечание: Эта функция должна быть вызвана до того, как окно станет видимым, или как минимум в QVulkanWindowRenderer::preInitResources(), и не имеет эффекта, если вызвана после.
Примечание: Переопределение QVulkanWindowRenderer::preInitResources() позволяет динамически изучать список поддерживаемых форматов, если это необходимо. Там поверхность доступна через QVulkanInstace::surfaceForWindow(), в то время как эта функция по-прежнему может безопасно вызываться, чтобы повлиять на последующие этапы инициализации.
См. также colorFormat().
void QVulkanWindow::setQueueCreateInfoModifier(const QVulkanWindow::QueueCreateInfoModifier &modifier)
Устанавливает функцию изменения информации о создании очереди.
Эта функция была добавлена в Qt 5.15.
См. также queueCreateInfoModifier().
void QVulkanWindow::setSampleCount(int sampleCount)
Запрашивает сглаживание с многообразными образцами с заданным sampleCount. Допустимые значения — 1, 2, 4, 8 и т. д., до максимального значения, поддерживаемого физическим устройством.
Если количество выборок больше 1, QVulkanWindow создаст буфер цвета с многообразными образцами, а не просто обратится к изображениям цепочки обмена. Рендеринг в буфере с многообразными образцами будет разрешен в буферы без многообразных образцов в конце каждого кадра.
Чтобы изучить список поддерживаемых количеств выборок, вызовите supportedSampleCounts().
При настройке рендерингового конвейера вызовите sampleCountFlagBits(), чтобы получить активное количество выборок как VkSampleCountFlagBits значение.
Примечание: Эта функция должна быть вызвана до того, как окно станет видимым, или как минимум в QVulkanWindowRenderer::preInitResources(), и не имеет эффекта, если вызвана после.
См. также supportedSampleCounts() и sampleCountFlagBits().
QVulkanInfoVector<QVulkanExtension> QVulkanWindow::supportedDeviceExtensions()
Возвращает список расширений, которые поддерживаются логическими устройствами, созданными из физического устройства, выбранного с помощью setPhysicalDeviceIndex().
Примечание: Эта функция может быть вызвана до того, как окно станет видимым.
QVector<int> QVulkanWindow::supportedSampleCounts()
Возвращает набор поддерживаемых количеств выборок при использовании физического устройства, выбранного с помощью setPhysicalDeviceIndex(), в виде отсортированного вектора.
По умолчанию QVulkanWindow использует количество выборок 1. Вызванием setSampleCount() с другим значением (2, 4, 8, ...) из набора, возвращаемого этой функцией, можно запросить сглаживание с многообразными образцами.
Примечание: Эта функция может быть вызвана до того, как окно станет видимым.
См. также setSampleCount().
bool QVulkanWindow::supportsGrab() const
Возвращает true, если цепочка обмена поддерживает использование в качестве источника передачи, что означает, что grab() функциональна.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
VkImage QVulkanWindow::swapChainImage(int idx) const
Возвращает указанное изображение цепочки обмена.
idx должно быть в диапазоне [0, swapChainImageCount() - 1].
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
int QVulkanWindow::swapChainImageCount() const
Возвращает количество изображений в цепочке обмена.
Примечание: Обращение к этому необходимо, когда предоставляется пользовательский проход рендеринга и буфер кадра. Буфер кадра специфичен для текущего изображения цепочки обмена, и поэтому приложение должно предоставить несколько буферов кадров.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
QSize QVulkanWindow::swapChainImageSize() const
Возвращает размер изображения swapchain.
Обычно совпадает с размером окна, но может отличаться в случае, если vkGetPhysicalDeviceSurfaceCapabilitiesKHR сообщает о фиксированном размере.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
VkImageView QVulkanWindow::swapChainImageView(int idx) const
Возвращает указанный вид изображения swapchain.
idx должно быть в диапазоне [0, swapChainImageCount() - 1].
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
Документация по переменным членам
const int QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT
Эта переменная содержит постоянное значение, которое всегда равно или больше максимального значения concurrentFrameCount().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qvulkanwindow.html