mafulechka
mafulechka04 жовтня 2019 р. 05:00

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

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


Метал на 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 і як працюють шейдери.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 01:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80бали,
  • Рейтинг балів4
m
  • molni99
  • 26 жовтня 2024 р. 01:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 06:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 03:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 09:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах