Spec-Zone.ru › Qt 6.1

Qt для Windows — Ускорение графики

Для работы Qt Quick требуется графический драйвер, предоставляющий Direct 3D 11.1, Vulkan 1.0 или OpenGL 2.1 или более высокую версию. Начиная с Qt 6, по умолчанию для Qt Quick на Windows используется Direct3D 11. Это отличается от Qt 5, где по умолчанию использовался OpenGL, либо напрямую, либо через ANGLE, переводчик OpenGL в Direct3D. ANGLE больше не входит в состав Qt в Qt 6.

Для принудительного использования программного растризатора Direct3D (WARP) установите переменную среды QSG_RHI_PREFER_SOFTWARE_RENDERER в значение 1.

Для запроса использования Vulkan или OpenGL, для которых требуется установленный драйвер Vulkan или OpenGL, установите переменную среды QSG_RHI_BACKEND в значение vulkan или opengl, или используйте эквивалентный C++ API в main().

Хотя OpenGL не является по умолчанию для Qt Quick, он всё ещё широко используется во многих приложениях Qt, например, в приложениях на основе QWidget, использующих QOpenGLWindow или QOpenGLWidget. В следующих разделах рассматриваются некоторые особенности OpenGL в сборке Qt.

Динамическая загрузка OpenGL

Qt поддерживает выбор и загрузку реализации OpenGL во время выполнения. Этот режим является по умолчанию и может быть явно запрошен путём передачи -opengl dynamic в скрипт конфигурации.

configure -opengl dynamic

Эта конфигурация является наиболее гибкой, так как никакие зависимости или предположения о реализации OpenGL не жестко закодированы во время сборки. Это позволяет надёжную установку приложений. Если в конкретной среде отсутствует подходящая реализация OpenGL 2.0, она автоматически переключится на загрузку альтернативы opengl32.dll, по умолчанию имя которой opengl32sw.dll. В предварительно собранных пакетах Qt поставляется сборка Mesa llvmpipe, программная реализация растризации OpenGL, под этим именем.

При конфигурации с -opengl dynamic, ни Qt, ни приложения, построенные с использованием qmake или CMake, не будут ссылаться на opengl32.lib. Вместо этого библиотека выбирается и загружается во время выполнения. По умолчанию Qt определяет, предоставляет ли системный opengl32.dll функции OpenGL 2. Если они присутствуют, используется opengl32.dll, в противном случае пытается загрузить opengl32sw.dll. Подробности см. ниже.

Механизм загрузки может быть настроен через переменную среды QT_OPENGL и следующие атрибуты приложения:

  • Qt::AA_UseDesktopOpenGL Эквивалентно установке QT_OPENGL в значение desktop.
  • Qt::AA_UseOpenGLES Не имеет эффекта в Qt 6.
  • Qt::AA_UseSoftwareOpenGL Эквивалентно установке QT_OPENGL в значение software.

Когда определённая конфигурация запрашивается явно, проверки не выполняются во время запуска приложения, то есть системный opengl32.dll не будет проверяться.

Динамическая загрузка оказывает существенное влияние на приложения, содержащие собственные вызовы OpenGL: они могут не связаться, так как opengl32.lib не указывается компилятору автоматически. Вместо этого приложения должны использовать функции OpenGL через класс QOpenGLFunctions. Таким образом, прямая зависимость от библиотеки OpenGL удаляется, и все вызовы будут маршрутизироваться во время выполнения к реализации, выбранной Qt. В качестве альтернативы приложения могут делать прямые вызовы функций OpenGL, если они добавляют opengl32.lib в свои файлы проекта .pro: LIBS += opengl32.lib (Visual Studio) или LIBS += -lopengl32 (MinGW). Результат с точки зрения приложения эквивалентен конфигурации сборки -opengl desktop Qt.

Qt::AA_UseSoftwareOpenGL является особым, поскольку он будет пытаться загрузить реализацию OpenGL с нестандартным именем. По умолчанию имя opengl32sw.dll. Это позволяет поставлять только программную реализацию OpenGL, например, сборку Mesa с llvmpipe, под этим именем. При необходимости имя файла можно переопределить, установив переменную среды QT_OPENGL_DLL.

Можно предоставить конфигурационный файл в формате JSON, определяющий, какую реализацию OpenGL использовать в зависимости от графической карты и версии драйвера. Путь к файлу задаётся переменной среды QT_OPENGL_BUGLIST. Относительные пути разрешаются с использованием QLibraryInfo::SettingsPath или QStandardPaths::ConfigLocation. Файл использует формат списка ошибок драйвера, используемого в Проектах Chromium. Он состоит из списка записей, каждая из которых определяет набор условий и список ключевых слов функций. Обычно для соответствия определённой графической карте используются идентификаторы устройства и поставщика. Их можно найти в выводе инструмента qtdiag6 или dxdiag.

Следующие ключевые слова функций имеют отношение к выбору реализации OpenGL:

Примечание: В Qt 6 устаревшие ключевые слова, связанные с ANGLE (disable_angle, disable_d3d11, disable_d3d9), принимаются, но не имеют эффекта.

  • disable_desktopgl — Отключает OpenGL. Это гарантирует, что Qt не попытается использовать стандартный OpenGL (opengl32.dll) и сразу начнёт с ANGLE. Это полезно для предотвращения сбоев приложения плохими драйверами OpenGL.
  • disable_rotation — Принудительно устанавливает режим ориентации приложения в альбомную всегда. Не имеет эффекта при использовании программной реализации OpenGL. Предназначено для драйверов, у которых есть проблемы с поворотом.
  • disable_program_cache — Отключить хранение двоичных файлов программных шейдеров на диске.

Пример файла выглядит так:

{
"entries": [
{
  "id": 1,
  "description": "Disable D3D11 on older nVidia drivers",
  "os": {
    "type": "win"
  },
  "vendor_id": "0x10de",
  "device_id": ["0x0DE9"],
  "driver_version": {
    "op": "<=",
    "value": "8.17.12.6973"
  },
  "features": [
    "disable_d3d11"
  ]
},
...

Если QT_OPENGL_BUGLIST не указано, будет использоваться встроенный список. В него обычно входят некоторые более старые, менее мощные графические карты с disable_desktopgl установленным, чтобы предотвратить использование Qt их нестабильных реализаций OpenGL для настольных компьютеров и вместо этого сразу переключиться на попытку загрузки программной альтернативной библиотеки.

На практике наиболее распространённые комбинации должны быть следующими:

  • disable_desktopgl — В случае, если система предоставляет OpenGL 2.0 или новее, но известно, что драйвер нестабилен и склонен к ошибкам.
  • disable_desktopgl, disable_angle — Если не требуется ускоренный путь. Это гарантирует, что единственный вариант, который Qt попробует, — это программный растризатор (opengl32sw.dll). Может быть полезен в виртуальных машинах и приложениях, которые развёртываются на широком спектре старых систем.

Поддерживаемые ключи для соответствия заданной карте или драйверу следующие. Обратите внимание, что некоторые из них специфичны для Qt.

  • os.type — Операционная система: win, linux, macosx, android
  • os.version — Версия ядра
  • os.release — Указывает список версий операционной системы Windows: xp, vista, 7, 8, 8.1, 10.
  • vendor_id — Поставщик из идентификатора адаптера
  • device_id — Список идентификаторов устройств PCI.
  • driver_version — Версия драйвера из идентификатора адаптера
  • driver_description — Соответствует, когда значение является подстрокой описания драйвера из идентификатора адаптера
  • gl_vendor — Соответствует, когда значение является подстрокой строки GL_VENDOR

Чтобы отключить весь чёрный список, установите переменную среды QT_NO_OPENGL_BUGLIST в любое значение. Это пропустит чтение любых конфигурационных файлов и вместо этого предположит, что ничего не отключено, независимо от драйвера или ОС.

Примечание: Хотя обычно не требуется, QT_NO_OPENGL_BUGLIST может стать актуальным в определённых виртуализированных средах с несколькими, возможно виртуальными, графическими адаптерами. Если журналы из категорий, таких как qt.qpa.gl показывают, что обнаружение драйвера и графического адаптера приводит к ошибочному отключению OpenGL, рекомендуется установить эту переменную среды, чтобы приложение могло работать нормально. Эта переменная среды была введена в Qt 5.15.

Прямая зависимость от opengl32.dll

Альтернативой по умолчанию dynamic сборкам OpenGL является прямая зависимость от opengl32.dll. Для этого режима передайте опции командной строки -opengl desktop в скрипт конфигурации.

configure -opengl desktop

Примечание: Использование EGL и OpenGL ES не поддерживается в Windows. В Qt 6 OpenGL в Windows всегда подразумевает использование WGL в качестве интерфейса системы окон.

В таких сборках Qt многие общие библиотеки Qt, а также приложения Qt будут иметь зависимость от opengl32.dll, и поэтому использование альтернативной библиотеки невозможно.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/windows-graphics.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API