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
d
  • dsfs
  • 26 квітня 2024 р. 04:56

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

  • Результат:80бали,
  • Рейтинг балів4
d
  • dsfs
  • 26 квітня 2024 р. 04:45

C++ - Тест 002. Константы

  • Результат:50бали,
  • Рейтинг балів-4
d
  • dsfs
  • 26 квітня 2024 р. 04:35

C++ - Тест 001. Первая программа и типы данных

  • Результат:73бали,
  • Рейтинг балів1
Останні коментарі
k
kmssr08 лютого 2024 р. 18:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко05 лютого 2024 р. 01:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 грудня 2023 р. 10:30
Boost - статичне зв&#39;язування в проекті CMake під Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 грудня 2023 р. 08:38
Boost - статичне зв&#39;язування в проекті CMake під Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik18 грудня 2023 р. 21:01
Qt/C++ - Урок 056. Підключення бібліотеки Boost в Qt для компіляторів MinGW і MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi02 травня 2024 р. 14:07
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
IscanderChe
IscanderChe30 квітня 2024 р. 04:22
Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…
G
Gar22 квітня 2024 р. 05:46
Clipboard Как скопировать окно целиком в clipb?
Павел Дорофеев
Павел Дорофеев14 квітня 2024 р. 02:35
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrex04 квітня 2024 р. 04:47
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

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