mafulechkaOct. 4, 2019, 5 a.m.

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

Content

Давайте продолжим с того места, где остановились в первой статье. Был рассмотерен пример приложения 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
How to become an author?

Contribute to the evolution of the EVILEG community.

Learn how to become a site author.

Learn it
Donate

Good day, Dear Users!!!

I am Evgenii Legotckoi, developer of EVILEG. And it is my hobby project, which helps to learn programming another programmers and developers

If the site helped you, and you want also support the development of the site, than you can donate by following ways

PayPalYandex.Money
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting
KA

C++ - Тест 003. Условия и циклы

  • Result:78points,
  • Rating points2
R

C++ - Test 002. Constants

  • Result:75points,
  • Rating points2
R

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

  • Result:73points,
  • Rating points1
Last comments
V

Django - Tutorial 027. Implementation Google reCAPTCHA

Спасибо. Только использую декоратор не в urls.py а перед views
R

Qt WinAPI - Lesson 001. How to collect all DLL, which used in Qt project?

Вы меня не совсем правильно поняли, но все равно спасибо, принял все к сведению. Все сделал как вы сказали, все отлично работает, еще раз огромнейшее спасибо) Разве что только что были опять про…

Qt WinAPI - Lesson 001. How to collect all DLL, which used in Qt project?

Стоило перед использованием что ли инструкцию прочитать https://www.cyberforum.ru/blogs/131347/blog2457.html "После сборки при запуске требовались dll," Ясное дело стоило задепло…
R
R

Qt WinAPI - Lesson 001. How to collect all DLL, which used in Qt project?

Да, собралось. После сборки при запуске требовались dll, перекинул всю папки bin, plugins(не знаю как можно было сделать более умно). Как я понял в первой строке путь к екзешнику вставляю, втор…
Now discuss on the forum

QML+QtGraphicalEffects

да, сборку делал без параметра поиска qml, хотя dll QtGraphicalEffects он подтягивает, когда я добавил всю папку QtGraphicalEffects в проект - то заработало, похоже что именно qml-файлов ему не …

Не работают слоты/сигналы

и посмотрите работу с потоками в Qt, там подробно описано как передавать данные с одного в потока в другой при помощи сигналов и слотов

Как в Qt в qmenu добавить scrollarea

Вот это наследованный класс меню. Но посути это обычное меню. #pragma once#include <QtWidgets>class TransMenu : public QMenu { Q_OBJECTpublic: TransMenu(QWidget* parent = …

Qt C++ и Python

Красиво/некрасиво - это скорее моё личное отношение. Если есть возможность ограничить количество интсрументов, то лучше ограничить. Но не зацикливайтесь на этом. Если у вас есть скрипты Py…

Qt + OpenGL glDeleteVertexArrays

Я не уверен, поскольку с OpenGL очень мало работал. Но может быть OpenGL контекст виджета нужно переинициализовывать. И ещё виджет стоит удалять через метод deleteLater() а не п…
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB