Запуск Qt Quick на Vulkan, Metal и Direct3D – Часть 2

Vulkan, Quick, macOS, Qt, Embedded, Windows, Graphics, Desktop, OpenGL

Давайте продолжим с того места, где остановились в первой статье. Был рассмотерен пример приложения Qt Quick, работающего в Linux поверх OpenGL и Vulkan. Также видели захват кадра Vulkan в RenderDoc, который является не только неоценимым инструментом при разработке Qt, но также может быть полезен всем, кто хочет копать глубже и лучше понимать, как Qt Quick рендерит кадр (или устранять проблемы в рендеринге приложения). Теперь в этой статье сосредоточимся на том, что предлагает Qt 5.14 для macOS и Windows.

Metal на macOS

Неудивительно, что запуск демонстрации qt5-cinematic-experience с QSG_RHI=1 (and QSG_INFO=1) в macOS 10.13 или 10.14 приводит к:

qt.scenegraph.general: Using QRhi with backend Metal
  graphics API debug/validation layers: 0
  QRhi profiling and debug markers: 0
qt.scenegraph.general: threaded render loop
qt.scenegraph.general: Using sg animation driver
qt.scenegraph.general: Animation Driver: using vsync: 16.67 ms
qt.rhi.general: Metal device: Intel(R) HD Graphics 615
qt.scenegraph.general: MSAA sample count for the swapchain is 1. Alpha channel requested = no.
qt.scenegraph.general: rhi texture atlas dimensions: 4096x2048
qt.rhi.general: got CAMetalLayer, size 2560x1440

В соответствии с целью Qt 6 по умолчанию использовать основной, наиболее поддерживаемый графический API платформы (при этом позволяя приложениям устанавливать свои собственные предпочтения, если они того пожелают), включив путь рендеринга на основе QRhi в Qt Quick на macOS, по умолчанию используется Metal,

Подобно тому, как основанный на Vulkan путь рендеринга строится на образце Vulkan и поддержке поверхности, представленной модулю QtGui, QPA и некоторым плагинам платформы, бэкенд Metal QRhi опирается на поддержку Metal плагина cocoa платформы, которая появилась вокруг Qt 5.12. QWindow с QSurface::MetalSurface получает NSView, поддерживаемый CAMetalLayer под капотом. Это именно то, что нужно бэкенду Metal QRhi (это все работает, потому что QQuickWindow получает соответствующий набор QSurface::SurfaceType всякий раз, когда активен путь кода на основе QRhi).

Одна важная особенность здесь - это возможность работать с многопоточным циклом рендеринга Qt Quick. Это очень приветствуется, потому что из-за проблем с многопоточностью некоторых NSOpenGLContext и связанных API в macOS 10.14 Qt отключает многопоточный цикл с OpenGL на macOS, вместо этого по умолчанию используется базовый цикл. Это приводит к несколько пониженной плавности анимации Qt Quick. Что касается Metal, у разработчиков нет (согласно текущим знаниям) никаких проблем с настройкой потоков, поэтому можно еще раз использовать по умолчанию многопоточный цикл рендеринга (выбор по умолчанию для цикла рендеринга можно изменить, установив переменную окружения QSG_RENDER_LOOP, эта переменная поддерживается также в сочетании с QSG_RHI)

Уже упоминалось о RenderDoc, как инструменте для отладки рендеринга кадров приложений Qt при работе на OpenGL, Vulkan или Direct3D. Для Metal можно использовать XCode и встроенный захват кадров GPU.

Один из полезных способов быстрого открытия проекта Qt в XCode, готовом к отладке, это запустить make xcodeproj && open .xcodeproj (или qmake -spec macx-xcode*, если qmake еще не был запущен) из терминала. Нажав Cmd-R, вы сразу же запускаете отладчик. Разработчики тоже часто используют это во время разработки Qt. В случае, если захват Metal GPU недоступен, даже если Qt Quick настроен для рендеринга через Metal, выберите Product -> Scheme -> Edit scheme ... и измените GPU Frame Capture на Metal.

При запуске отладочной сборки приложения в XCode будет включена проверка Metal, что означает, что XCode выдаст (надеемся) полезное предупреждение и прервет выполнение программы, если API-интерфейс Metal используется каким-либо неправильным образом. В отличие от других платформ, валидация Metal API не может быть включена, если не выполняется отладка через XCode (поэтому, в отличие от Vulkan и D3D, установка QSG_RHI_DEBUG_LAYER не будет иметь никакого эффекта).

Металл на iOS

А как насчет iOS или tvOS?

Что ж, на момент написания статьи плагин, связанный с Metal, в плагине платформы отсутствует, что также означает, что бэкенд Metal QRhi еще не тестировался на этих платформах. Вот почему на странице новых возможностей Qt 5.14 упоминается только macOS в разделе Qt Quick. Ожидается, что поддержка будет добавлена в недалеком будущем, возможно в версии 5.15.

Вулкан на macOS

Как насчет Vulkan через MoltenVK?

Как упоминалось в части 1, запрос о рендеринге через Vulkan, а затем использование MoltenVK для перевода вызовов API и шейдеров SPIR-V во время выполнения в Metal и Metal Shading Language также возможны. Для этого требуется сборка Qt с поддержкой Vulkan, чего нельзя сказать о готовых решениях на платформах Apple. Ключ в том, чтобы передать –I и, чтобы настроить и убедиться, что библиотеки могут быть найдены во время выполнения, возможно, установив QT_VULKAN_LIB.

Важно отметить, что этот подход будет поддерживаться только на основе максимальных усилий. Основной поддерживаемый способ рендеринга на платформах Apple будет через Metal.

Запуск демонстрационного приложения с QSG_RHI_BACKEND=vulkan (с использованием соответствующим образом настроенной сборки Qt 5.14) дает:

qt.scenegraph.general: Using QRhi with backend Vulkan
  graphics API debug/validation layers: 0
  QRhi profiling and debug markers: 0
qt.scenegraph.general: threaded render loop
qt.scenegraph.general: Using sg animation driver
qt.scenegraph.general: Animation Driver: using vsync: 16.67 ms
qt.rhi.general: Physical device 0: 'Intel(R) UHD Graphics 630' 0.2.1835 (api 1.0.92 vendor 0x8086 device 0x3E9B type 1)
qt.rhi.general: using this physical device
qt.rhi.general: queue family 0: flags=0x7 count=1
qt.rhi.general: 17 device extensions available
qt.scenegraph.general: MSAA sample count for the swapchain is 1. Alpha channel requested = no.
qt.scenegraph.general: rhi texture atlas dimensions: 2048x1024
qt.rhi.general: Creating new swapchain of 2 buffers, size 1280x720, presentation mode 2

Стоит отметить, что были проблемы с запуском этого на macOS 10.13, возникали блокировки и сбои при использовании многопоточного цикла рендеринга. Обновление до более новой (1.0.121) Vulkan SDK (включая MoltenVK) привело к новому набору проблем и невозможности запустить приложение.

Windows

Windows - это платформа, на которой больше всего возможностей. Из 4 основных бэкендов QRhi (Vulkan, Metal, D3D11, OpenGL) можно использовать не менее 3 в Windows: Direct3D 11, Vulkan и OpenGL.

Напрашивается очевидный вопрос: почему только 3? Разве не должно быть 4 с Direct3D 12?

На данный момент нет бэкенда D3D12. Это может измениться позже, так как это есть в планах, но не в настоящее время. Стоит отметить, что экспериментальный бэкенд для D3D12 для Qt Quick, добавленный в Qt 5.8 теперь архитектурно устарел (поскольку разработчики решают проблему нескольких графических API совершенно по-новому), и подлежит удалению в Qt 6.

В Windows по умолчанию при установке QSG_RHI=1 используется Direct3D 11. Как обычно, переопределите с помощью QSG_RHI_BACKEND, если требуется Vulkan или OpenGL.

qt.scenegraph.general: Using QRhi with backend D3D11
  graphics API debug/validation layers: 0
  QRhi profiling and debug markers: 0
qt.scenegraph.general: threaded render loop
qt.scenegraph.general: Using sg animation driver
qt.scenegraph.general: Animation Driver: using vsync: 16.67 ms
qt.rhi.general: DXGI 1.2 = true, FLIP_DISCARD swapchain supported = true
qt.rhi.general: Adapter 0: 'NVIDIA GeForce RTX 2060' (flags 0x0)
qt.rhi.general: using this adapter
qt.rhi.general: Adapter 1: 'Microsoft Basic Render Driver' (flags 0x2)
qt.scenegraph.general: MSAA sample count for the swapchain is 1
qt.scenegraph.general: rhi texture atlas dimensions: 2048x1024

Стоит отметить, что нужен Direct3D 11.1, а не 11.0. Это в основном потому, что нужен VSSetConstantBuffers1
(и связанные варианты PS и CS). Это не должно представлять проблему, если кто-то не хочет работать на простой Windows 7 без обновления платформы. Говоря о Windows 7, важно отметить, что рендеринг на основе D3D11 в настоящее время не работает корректно в Windows 7 с Qt 5.14, поэтому на странице новых функций 5.14 упоминается только Windows 10. Это будет исправлено позже (но только если Windows 7 останется поддерживаемой платформой для Qt 6).

Чтобы включить уровень отладки Direct3D, установите для переменной среды QSG_RHI_DEBUG_LAYER значение 1. Это также работает для Vulkan, если доступны слои проверки (например, из установленного Vulkan SDK). Qt удобно направляет сообщения на выходные данные отладки (как если бы они были выведены через qDebug).

Vulkan и OpenGL должны работать как положено в Windows.

Как и в случае с Vulkan и Metal, бэкенд OpenGL QRhi основывается на некоторых (но не на всех) существующих активаторах OpenGL и слежении за платформой, таких как QOpenGLContext, QOpenGLFunctions и в плагине платформы Windows (WGL, EGL). Следовательно, все, что относится к приложениям Qt Quick, работающим непосредственно в OpenGL, применимо и здесь (desktop (рабочий стол) vs. ANGLE vs. software (программного обеспечения), переменные среды, такие как QT_OPENGL).

Говоря об ANGLE, ожидается, что он может быть удален, как прямая зависимость в Qt 6. Это требует дальнейшего изучения, чтобы полностью гарантировать, что не потеряется поддержка для особых случаев использования, но на данный момент план состоит в том, чтобы иметь основанный на QRhi путь рендеринга с поддержкой Direct3D 11, OpenGL (собственно, через WGL) и Vulkan будет достаточно для приложений Qt 6 в Windows.

В третьей части будет рассмотренно, что это за QRhi, и как работают шейдеры.

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
Support the author Donate

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Looking for a Job?
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

SV
Oct. 23, 2019, 1 a.m.
Semen Voloh

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:70points,
  • Rating points1
SS
Oct. 22, 2019, 2:31 p.m.
Samantha Smith

Qt - Test 001. Signals and slots

  • Result:52points,
  • Rating points-4
MB
Oct. 21, 2019, 1:25 a.m.
Mihail Bulatov

C++ - Test 002. Constants

  • Result:16points,
  • Rating points-10
Last comments
Oct. 17, 2019, 2:17 a.m.
Evgenij Legotskoj

Используем, там где требуется :)
MP
Oct. 17, 2019, 2:15 a.m.
Mikhail Petrov

Совет: подключайте ресурсы динамически. Используйте Resource Compiler: https://doc.qt.io/qt-5/rcc.html
Oct. 16, 2019, 6:45 a.m.
Evgenij Legotskoj

Если это не чистой воды спам, а по делу, то без проблем. Но в таком случае лучше создавайте отдельный вопрос на форуме . При создании вопроса есть поле, в котором можно указать статью…
KK
Oct. 16, 2019, 6:39 a.m.
Kirill Kirilych

А тут можно ссылки на сторонний ресурс показывать? Нашёл на habr похожую статью, только там чуток отличается код и про локальный сервер написано, нужно чтоб кто то понимающий посмотрел и своё …
Now discuss on the forum
Oct. 23, 2019, 4:06 a.m.
Evgenij Legotskoj

Ну если после обновления начало появляться, то тогда откатить драйвера. А вообще, если это жить не мешает и код работает как и раньше, то просто проигнорировать эти сообщения.
Oct. 22, 2019, 2:42 a.m.
Pavel K.

Всем привет , Пытаюсь реализовать класс для работы с блютуз (Bluetooth Handler) для мобилки , с использование QBluetoothDeviceInfo и QBluetoothDeviceDiscoveryAgent . Может у кого е…
Oct. 22, 2019, 2:16 a.m.
Pavel K.

попробуй сделать через свой собственный компонет , те возьми контрол Component, например , переорпедели как свой , в нем что нить типо проперти type : disk1, disk2 (сделай метод в структуре …
E
Oct. 22, 2019, 12:03 a.m.
Evgenij_Kanusovskij@1981

Этот алгоритм предназначен для того чтобы исключить из обработки строки содержащие буквенные символы. Если Вам не трудно опишите пожалуйста как бы Вы написали этот алгоритм, желательно в коде?
MP
Oct. 21, 2019, 7:03 a.m.
Mikhail Petrov

Зависит от вашей задачи. Можете обратить внимание на этот пример: https://doc.qt.io/qt-5/qtqml-referenceexamples-properties-example.html QQmlListProperty используется мною достаточно ч…
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB