- 1. Метал на macOS
- 2. Метал на iOS
- 3. Вулкан на macOS
- 4. Windows
Давайте продовжимо з того місця, де зупинилися у першій статті. Був розглянутий приклад програми 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 і як працюють шейдери.