Класс QVulkanWindow
Класс QVulkanWindow — это удобный подкласс QWindow для выполнения рендеринга Vulkan. Подробнее...
| Заголовок: | #include <QVulkanWindow> |
| CMake: | find_package(Qt6 COMPONENTS Gui REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
| qmake: | QT += gui |
| С версии: | Qt 5.10 |
| Наследует: | QWindow |
Открытые типы
| enum | Flag { PersistentResources } |
| flags | Flags |
| QueueCreateInfoModifier |
Открытые функции
| QVulkanWindow(QWindow *parent = nullptr) | |
| virtual | ~QVulkanWindow() |
| QList<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 QList<VkFormat> &formats) |
| void | setQueueCreateInfoModifier(const QVulkanWindow::QueueCreateInfoModifier &modifier) |
| void | setSampleCount(int sampleCount) |
| QVulkanInfoVector<QVulkanExtension> | supportedDeviceExtensions() |
| QList<int> | supportedSampleCounts() |
| bool | supportsGrab() const |
| VkImage | swapChainImage(int idx) const |
| int | swapChainImageCount() const |
| QSize | swapChainImageSize() const |
| VkImageView | swapChainImageView(int idx) const |
Сигналы
| void | frameGrabbed(const QImage &image) |
Статические открытые члены
| 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(commandBuffer, renderPassBegin, contents);
// ...
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. Дополнительные буферы цветов и их разрешение в не-мультисэмплинговые буферы в swapchain управляются автоматически.
Для запроса поддерживаемых значений сэмплов вызовите supportedSampleCounts(). Когда возвращаемый набор содержит 4, 8 и т.д., передача одного из этих значений в setSampleCount() запрашивает рендеринг с мультисэмплингом.
Примечание: в отличие от QSurfaceFormat::setSamples(), список поддерживаемых значений сэмплов предоставляется приложениям заранее, и в setSampleCount() нет автоматического возврата к меньшим значениям сэмплов. Если запрошенное значение не поддерживается, выводится сообщение об ошибке, и мультисэмплинг не используется.
Чтение изображений обратно
Когда supportsGrab() возвращает true, QVulkanWindow может выполнять чтение из буфера цвета в QImage. grab() — медленная и неэффективная операция, поэтому следует избегать частого её использования. Тем не менее, она полезна, поскольку позволяет приложениям делать снимки экрана или инструментам и тестам обрабатывать и проверять выходные данные рендеринга GPU.
Поддержка sRGB
Хотя многие приложения будут работать нормально с поведением QVulkanWindow по умолчанию, когда речь идёт о форматах изображений swapchain, 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 — это typedef для QFlags<Flag>. Он хранит логическое ИЛИ сочетание значений Flag.
QVulkanWindow::QueueCreateInfoModifier
Функция, вызываемая во время графической инициализации для добавления дополнительных очередей, которые должны быть созданы.
Устанавливается, если рендереру требуются дополнительные очереди помимо стандартной графической очереди (например, очередь передачи). Предоставленные свойства семейства очередей могут быть использованы для выбора индексов для дополнительных очередей. Позже рендерер может запросить фактическую очередь в initResources().
Примечание: При запросе дополнительных графических очередей Qt сам всегда запрашивает графическую очередь. Вам потребуется найти соответствующую запись в queueCreateInfo и манипулировать ею, чтобы получить дополнительную очередь.
См. также setQueueCreateInfoModifier().
Документация по членам-функциям
QVulkanWindow::QVulkanWindow(QWindow *parent = nullptr)
Конструирует новый QVulkanWindow с заданным parent.
Тип поверхности устанавливается в QSurface::VulkanSurface.
[signal] void QVulkanWindow::frameGrabbed(const QImage &image)
Этот сигнал испускается, когда image готова.
[virtual] QVulkanWindow::~QVulkanWindow()
Деструктор.
QList<VkPhysicalDeviceProperties> QVulkanWindow::availablePhysicalDevices()
Возвращает список свойств поддерживаемых физических устройств в системе.
Примечание: Эту функцию можно вызывать до отображения окна.
QMatrix4x4 QVulkanWindow::clipCorrectionMatrix()
Возвращает QMatrix4x4, которую можно использовать для исправления различий в системах координат между OpenGL и Vulkan.
Умножая матрицу проекции на эту матрицу, приложения могут продолжать считать, что Y направлен вверх, и могут установить minDepth и maxDepth вьюпорта соответственно в 0 и 1, не выполняя никаких дополнительных исправлений позиций вершин Z. Геометрия из приложений OpenGL может затем использоваться как есть, предполагая состояние растрирования, соответствующее настройкам обрезки и лицевой стороны OpenGL.
VkFormat QVulkanWindow::colorFormat() const
Возвращает формат буфера цвета, используемый цепочкой обмена.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
См. также setPreferredColorFormats().
int QVulkanWindow::concurrentFrameCount() const
Возвращает количество кадров, которые могут быть потенциально активны одновременно.
Примечание: Значение постоянно на протяжении всего жизненного цикла QVulkanWindow.
class Renderer {
void startNextFrame();
// ...
VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT];
QVulkanWindow *m_window = nullptr;
};
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
Возвращает активный буфер команд для текущего изображения цепочки обмена. Ожидается, что реализации 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 {
void startNextFrame();
// ...
VkDescriptorBufferInfo m_uniformBufInfo[QVulkanWindow::MAX_CONCURRENT_FRAME_COUNT];
QVulkanWindow *m_window = nullptr;
};
void Renderer::startNextFrame()
{
VkDescriptorBufferInfo &uniformBufInfo(m_uniformBufInfo[m_window->currentFrame()]);
// ...
} Примечание: Эта функция должна вызываться только изнутри startNextFrame() и, в случае асинхронной генерации команд, до вызова frameReady().
См. также concurrentFrameCount().
VkFramebuffer QVulkanWindow::currentFramebuffer() const
Возвращает VkFramebuffer для текущего изображения цепочки обмена, используя стандартный проход рендеринга.
Буфер фрейма имеет два объекта привязки (цвет, глубина-шаблон) при отсутствии многообразного сэмплирования и три (разрешение цвета, глубина-шаблон, многообразный цвет) при sampleCountFlagBits() больше, чем VK_SAMPLE_COUNT_1_BIT. Рендереры должны учитывать это, например, при предоставлении значений очистки.
Примечание: Приложения не обязаны использовать этот буфер фрейма, если вместо этого они предоставят свой собственный проход рендеринга вместо использования прохода, возвращаемого из defaultRenderPass().
Примечание: Эта функция должна вызываться только изнутри startNextFrame() и, в случае асинхронной генерации команд, до вызова frameReady().
См. также defaultRenderPass().
int QVulkanWindow::currentSwapChainImageIndex() const
Возвращает текущий индекс изображения цепочки обмена в диапазоне [0, swapChainImageCount() - 1].
Примечание: Эта функция должна вызываться только изнутри startNextFrame() и, в случае асинхронной генерации команд, до вызова frameReady().
VkRenderPass QVulkanWindow::defaultRenderPass() const
Возвращает типичный проход рендеринга с одним подпроходом.
Примечание: Приложения не обязаны использовать этот проход рендеринга. Однако они затем несут ответственность за обеспечение того, что текущее изображение цепочки обмена и изображения глубины-шаблона переводятся из VK_IMAGE_LAYOUT_UNDEFINED в VK_IMAGE_LAYOUT_PRESENT_SRC_KHR и VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL либо через пользовательский проход рендеринга приложения, либо другими средствами.
Примечание: Чтение/запись шаблона не включено в этом проходе рендеринга.
Примечание: Вызов этой функции допустим только с момента вызова 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(), должен содержать все необходимые команды рендеринга, добавленные с момента этого вызова, так как эта функция вызовет передачу команд и добавление команды презентации в очередь.
Примечание: Этот метод должен вызываться только из потока графического интерфейса/главного потока, в котором вызываются функции QVulkanWindowRenderer, и в котором находится экземпляр QVulkanWindow.
См. также QVulkanWindowRenderer::startNextFrame().
QImage QVulkanWindow::grab()
Создаёт и рендерит следующий кадр без его отображения, затем выполняет блокирующее чтение содержимого изображения.
Возвращает изображение, если реализация startNextFrame() рендерера вызывает обратный вызов frameReady() напрямую. В противном случае возвращает неполное изображение, которое имеет правильный размер, но не содержимое ещё. Содержимое будет передано через сигнал frameGrabbed() в последнем случае.
Примечание: Этот метод не должен вызываться, когда выполняется обработка кадра (т. е. frameReady() ещё не был вызван приложением).
Примечание: Этот метод потенциально дорогостоящий из-за дополнительного блокирующего чтения.
Примечание: В настоящее время этот метод требует, чтобы цепочка обмена поддерживала использование в качестве источника передачи (VK_IMAGE_USAGE_TRANSFER_SRC_BIT), и в противном случае завершится ошибкой.
VkCommandPool QVulkanWindow::graphicsCommandPool() const
Возвращает активный пул команд графики.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
VkQueue QVulkanWindow::graphicsQueue() const
Возвращает активную очередь графики.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initResources() до QVulkanWindowRenderer::releaseResources().
[since 5.15] 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, включая swapchain.
Примечание: Инициализация происходит в первом событии 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 QList<VkFormat> &formats)
Устанавливает предпочтительные форматы swapchain.
По умолчанию предпочтительный формат приложения не установлен. В этом случае будет использоваться предпочтительный формат поверхности или, в случае его отсутствия, VK_FORMAT_B8G8R8A8_UNORM.
Список в formats упорядочен. Если первый формат не поддерживается, будет рассмотрен второй и так далее. Если ни один формат в списке не поддерживается, поведение аналогично поведению в случае по умолчанию.
Для запроса фактического формата после инициализации вызовите colorFormat().
Примечание: Эта функция должна быть вызвана до того, как окно станет видимым, или, самое позднее, в QVulkanWindowRenderer::preInitResources(), и не имеет эффекта, если вызвана после.
Примечание: Переопределение QVulkanWindowRenderer::preInitResources() позволяет динамически исследовать список поддерживаемых форматов, если это необходимо. Там поверхность доступна через QVulkanInstace::surfaceForWindow(), в то время как эту функцию можно безопасно вызывать, чтобы повлиять на последующие стадии инициализации.
См. также colorFormat().
[since 5.15] void QVulkanWindow::setQueueCreateInfoModifier(const QVulkanWindow::QueueCreateInfoModifier &modifier)
Устанавливает функцию модификации информации о создании очереди modifier.
Функция была добавлена в Qt 5.15.
См. также QueueCreateInfoModifier.
void QVulkanWindow::setSampleCount(int sampleCount)
Запрашивает многократную выборку с антиалиасингом с заданным sampleCount. Допустимые значения: 1, 2, 4, 8 и так далее до максимального значения, поддерживаемого физическим устройством.
Если значение выборки больше 1, QVulkanWindow создаст буфер цвета с многократной выборкой вместо простого назначения изображений swapchain. Рендеринг в буфере с многократной выборкой будет разрешён в буферы без многократной выборки в конце каждого кадра.
Для просмотра списка поддерживаемых значений количества выборок вызовите supportedSampleCounts().
При настройке конвейера рендеринга вызовите sampleCountFlagBits(), чтобы запросить активное значение количества выборок в виде VkSampleCountFlagBits.
Примечание: Эта функция должна быть вызвана до того, как окно станет видимым, или, самое позднее, в QVulkanWindowRenderer::preInitResources(), и не имеет эффекта, если вызвана после.
См. также supportedSampleCounts() и sampleCountFlagBits().
QVulkanInfoVector<QVulkanExtension> QVulkanWindow::supportedDeviceExtensions()
Возвращает список расширений, поддерживаемых логическими устройствами, созданными из физического устройства, выбранного с помощью setPhysicalDeviceIndex().
Примечание: Эту функцию можно вызывать до того, как окно станет видимым.
QList<int> QVulkanWindow::supportedSampleCounts()
Возвращает набор поддерживаемых значений количества выборок при использовании физического устройства, выбранного с помощью setPhysicalDeviceIndex(), в виде отсортированного списка.
По умолчанию QVulkanWindow использует значение количества выборок 1. Вызвав setSampleCount() с другим значением (2, 4, 8, ...) из набора, возвращаемого этой функцией, можно запросить многократную выборку с антиалиасингом.
Примечание: Эту функцию можно вызывать до того, как окно станет видимым.
См. также setSampleCount().
bool QVulkanWindow::supportsGrab() const
Возвращает true, если swapchain поддерживает использование в качестве источника передачи, что означает, что 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
Возвращает размер картинки цепочки обмена.
Обычно совпадает с размером окна, но может отличаться, если vkGetPhysicalDeviceSurfaceCapabilitiesKHR сообщает о фиксированном размере.
Примечание: Вызов этой функции допустим только с момента вызова QVulkanWindowRenderer::initSwapChainResources() до QVulkanWindowRenderer::releaseSwapChainResources().
VkImageView QVulkanWindow::swapChainImageView(int idx) const
Возвращает указанный вид картинки цепочки обмена.
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-6.1/qvulkanwindow.html