Давайте продолжим с того места, где остановились в первой статье. Был рассмотерен пример приложения 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, и как работают шейдеры.