mafulechkaOct. 4, 2019, 5 a.m.

Running Qt Quick on Vulkan, Metal and Direct3D - Part 2

Давайте продолжим с того места, где остановились в первой статье. Был рассмотерен пример приложения 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
Card image cap
Pulsum Via

Project for travelers from EVILEG.

Go
Fornex

Let me recommend you a great European Fornex hosting.

Fornex has proven itself to be a stable host over the years.

For Django projects I recommend VPS hosting

Following the link you will receive a 5% discount on shared hosting services, dedicated servers, VPS and VPN

View Hosting
Share on social networks
Donate

The EVILEG project has switched to a non-commercial basis and will develop solely on the enthusiasm of the site creator, the enthusiasm of users, donations and the hosting referral system

Thank you for your support

Available ways to support the project

PayPal

PatreonYandex.MoneyMore

C++ - Test 001. The first program and data types

  • Result:80points,
  • Rating points4

C++ - Test 001. The first program and data types

  • Result:66points,
  • Rating points-1
GR

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

  • Result:90points,
  • Rating points8
Last comments

Qt/C++ - Lesson 061. Adding images to the application using the Drag And Drop method from the file manager

Доброго времени суток. А если нужно и изображение и текст? Что-то потерялся немного.... // Вместо отрисовки иконки и текста будем отрисовывать только одно изображение // с н…
AS

Qt/C++ - Lesson 004. QSqlTableModel – How to present the table from database?

error insert into TableExample " Количество параметров не совпадает" Я путь свой прописывала и даже бд удаляла, чтобы заново сделать, не работает. (всё остальное как у вас... Вроде ка…
i

Qt/C++ - Lesson 042. PopUp notification in the Gnome style using Qt

cialis powder comprare cialis online
LD

GameDev on Qt - Tutorial 1. Track mouse movement in QGraphicsScene

Вполне возможно, что ты не закинул graphicsView в дизайнере в виджет
LD

GameDev on Qt - Tutorial 1. Track mouse movement in QGraphicsScene

Кому интересно, поворот в slotTarget можно в одну строку организовать this->setRotation(90 + rotation() + qRadiansToDegrees(qAtan2(mapFromScene(point).y(), mapFromScene(point).x())));
Now discuss on the forum
M

Sorting the added QML elements in the ListModel

legal online pharmacy
  • Nomad
  • July 30, 2022, 5:42 a.m.

Как работать с HTMX?

Приветствую колеги. На днях наткнулся на вот это : https://htmx.org/ На офф сайте написанно вот такая фраза: htmx gives you access to AJAX, CSS Transitions, We…
h
  • harisr
  • July 25, 2022, 2:56 a.m.

QT - Native App Integration

Привет, у нас уже есть собственное приложение для Android. Можем ли мы интегрировать пользовательское представление QT в приложение со всем приложением QT внутри представления. Если да, ука…

Правильный запуск сервера на vps - Django

О я как то себе дома локальный сервер создавал. Вам же нужно просто сделать ручками конфигурацию системы. Настроить Nginx ну либо Apache (тут кому что нравится). Соответственно БД и всё остально…
o

Распознание объектов

Я к тому, что, возможно, софт уже есть.
About
Services
© EVILEG 2015-2022
Recommend hosting TIMEWEB