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
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
TG

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

  • Result:53points,
  • Rating points-4
TG

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

  • Result:60points,
  • Rating points-1
TN

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

  • Result:40points,
  • Rating points-8
Last comments
r

Поздравляю всё Сообщество EVILEG с Новым Годом!!!

https://nutakugold.club/freenutakugold/ - the best generator woooow :) 2021 updated. hmm i found it. or https://issuu.com/nutakugoldcoins2021 Study reviews of matches prior to …

Django - Tutorial 001. Deploying a site on Django + PostgreSQL + Gunicorn + Nginx

Ошибка в конфиге инжинкса про статику в root последний слеш лишний путь в таком виде получается /home/user/myprojectenv/myproject/myproject//static
  • Jurij
  • Jan. 20, 2021, 1:34 p.m.

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

// Вместо отрисовки иконки и текста будем отрисовывать только одно изображение // с небольшими отступами в 5 пикселей QPixmap pix(m_model->data(index).toString()); …
m
  • magrif
  • Jan. 19, 2021, 12:37 p.m.

Qt Сертификация

Здравствуйте. Подскажите, оплачивать ваучер прямо в выбранном тестовом центре? Можно ли загранник предъявить? Или свой паспорт, а заполнить транслитом? А то там пишут: Your name must exactl…
r
  • retmas
  • Jan. 17, 2021, 4:09 a.m.

Qt/C++ - Tutorial 074. Generating pseudo-random numbers, using STD library random

Дмитрий, решает. Просто автор, видимо, не сильно озаботился изучением документации QRandomGenerator. Да и в листинге с использованием qrand вызов функции qsrand на каждой итерации цикла нав…
Now discuss on the forum
DK

QScrollArea dynamically add QCheckBoxes

QWidget *materialContainer = new QWidget(this);QVBoxLayout *materialLay = new QVBoxLayout();materialContainer->setLayout(materialLay);ui->_materialScrollArea->setWidget(materialContaine…

Ошибка при работе утилиты не удалось получить фабрику класса com для компонента с clsid

Всем привет! Мне для тестов нужна одна утилита. Она тестирует определенное оборудование. Поставил ее на новый ноут с Windows 10 Домашняя, 64-бит, версия 10.0.19041. Утилита работает, но спу…

Как в Android открыть свернутое приложение?

Это не вам, тот коммент судя по всему удалили, или я написал не туда

Qt: INTERNAL ERROR: failed to install GetMessage hook: 1158

ESP8266 и вправду не корректно закрывало соединение. Причина оказалась банальной: перед функцией ухода в глубокий сон ESP.deepSleep(60e6) необходимо было поставить небольшую задержку delay(1). В…
  • Nomad
  • Jan. 20, 2021, 8:48 a.m.

Ограничение доступа к ресурсу с по django-cors-headers

всем привет помогите разобраться гуглю и ниче не помогает есть проект с drf установил django-cors-headers добавил в INSTALLED_APPS добавил MIDDLEWARE слой для cor…
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB