LINUX.ORG.RU

История изменений

Исправление EXL, (текущая версия) :

Но может ли кто-нибудь оьъяснить зачем в Qt5 приложении под виндой OpenGL?

Да. Я могу.

У разжиревшего Qt 5 в зависимостях к модулю QtGui обязателен OpenGL, даже если приложение никакой OpenGL и не использует. Эта зависимость не только под виндой, но и под Linux'ом и (наверное) macOS. И точно так же, под Linux'ом приложения на Qt 5 не используют OpenGL, но от него зависят. Лулз-тред на ЛОРе, с обсуждением сего: qt 5.3 и qt 5.5 (комментарий)

Зависимость QtGui от OpenGL была сделана для таких вот специфичных трюков, которые описываются, например, здесь:

http://doc.qt.io/qt-5/qopenglwindow.html

А пример использования в реальных приложениях можно посмотреть здесь:

https://habr.com/post/272423/

---

Далее, отвечаю на вопрос, зачем нужна библиотека opengl32sw.dll для приложений на Qt 5?

Суть в том, что в любой MS Windows в стандартной поставке «из-коробки» используется старейший OpenGL 1.1 родом из 1997 года:

PPSSPP 1.0 (комментарий)

А Qt 5 работает лишь c OpenGL >= 2.1

Поэтому, если приложение всё-таки использует OpenGL, то алгоритм подгрузки либ, согласно официально документации, получается следующий:

1. Проверяется библиотека opengl32.dll

Если эта библиотека в вашей ОС поставляется vendor'ом вашего GPU (AMD, NVidia, Intel) и имеет реализацию OpenGL 2.1, то она и будет использоваться без каких-либо ограничений. Это множество включает в себя большинство случаев и компьютеров.

Если же opengl32.dll в системе это дефолтная реализация OpenGL от MS Windows, родом из 1997 года, то значит требуется перейти к шагу №2. Этот случай повсеместно встречается в офисных компах «без видеокарты» или же ноутбуках с Intel GPU, где забили на реализацию OpenGL под MS Windows или она косячная.

2. Проверяется возможность работы через ANGLE

Итак, если ваша реализация OpenGL в системе оставляет желать лучшего, то Qt 5 пытается заюзать костыль под называнием ANGLE. Его суть в том, чтобы все вызовы OpenGL или OpenGL ES транслируются в вызовы DirectX. Библиотека ANGLE изначально была разработана Google для браузера Chrome для аналогичных целей.

В случае если ANGLE по каким-либо причинам использовать не получается, то переходим к шагу №3. Причин таких может быть несколько: видеокарта не поддерживает DirectX 9.0c, отсутствуют библиотеки ANGLE и DirectX в поставке с приложением, и т. д.

3. Fallback-режим: использование opengl32sw.dll

Если все проверки на OpenGL/DirectX зафейлились, то приложение переходит к использованию библиотеки opengl32sw.dll аля LLVMPipe. Её суть в реализации OpenGL на мощностях не GPU, а CPU. Медленно, зато будет работать.

Вот такие пироги. Зачем всё это приложению на Qt 5 с двумя кнопками — остаётся загадкой. Но видимо утилита windeployqt считает, что так и нужно.

P.S. Отвязать модуль QtGui от OpenGL можно лишь пересборкой всего Qt с флажком -disable-opengl. Однако во всех стандартных бинарных сборках для MS Windows и Linux эта фича активирована по умолчанию.

Как решение — если приложение точно не использует модули зависящие от OpenGL или не использует OpenGL из QtGui; и не планирует, то можно забить на все эти доп. либы аля ANGLE и opengl32sw.dll и тупо их вырезать. Места освободится много, а функциональность нарушена не будет.

Исходная версия EXL, :

Но может ли кто-нибудь оьъяснить зачем в Qt5 приложении под виндой OpenGL?

Да. Я могу.

У разжиревшего Qt 5 в зависимостях к модулю QtGui обязателен OpenGL, даже если приложение никакой OpenGL и не использует. Эта зависимость не только под виндой, но и под Linux'ом и (наверное) macOS. И точно так же, под Linux'ом приложения на Qt 5 не используют OpenGL, но от него зависят. Лулз-тред на ЛОРе, с обсуждением сего: qt 5.3 и qt 5.5 (комментарий)

Зависимость QtGui от OpenGL была сделана для таких вот специфичных трюков, которые описываются, например, здесь:

http://doc.qt.io/qt-5/qopenglwindow.html

А пример использования в реальных приложениях можно посмотреть здесь:

https://habr.com/post/272423/

---

Далее, отвечаю на вопрос, зачем нужна библиотека opengl32sw.dll для приложений на Qt 5?

Суть в том, что в любой MS Windows в стандартной поставке «из-коробки» используется старейший OpenGL 1.1 родом из 1997 года:

PPSSPP 1.0 (комментарий)

А Qt 5 работает лишь c OpenGL >= 2.1

Поэтому, если приложение всё-таки использует OpenGL, то алгоритм подгрузки либ, согласно официально документации, получается следующий:

1. Проверяется библиотека opengl32.dll

Если эта библиотека в вашей ОС поставляется vendor'ом вашего GPU (AMD, NVidia, Intel) и имеет реализацию OpenGL 2.1, то она и будет использоваться без каких-либо ограничений. Это множество включает в себя большинство случаев и компьютеров.

Если же opengl32.dll в системе это дефолтная реализация OpenGL от MS Windows, родом из 1997 года, то значит требуется перейти к шагу №2. Этот случай повсеместно встречается в офисных компах «без видеокарты» или же ноутбуках с Intel GPU, где забили на реализацию OpenGL под MS Windows или она косячная.

2. Проверяется возможность работы через ANGLE

Итак, если ваша реализация OpenGL в системе оставляется желать лучшего, то Qt 5 пытается заюзать костыль под называнием ANGLE. Его суть в том, чтобы все вызовы OpenGL транслировать в вызовы DirectX. Библиотека ANGLE изначально была разработана Google для браузера Chrome для аналогичных целей.

В случае если ANGLE по каким-либо причинам использовать не получается, то переходим к шагу №3. Причин таких может быть несколько: видеокарта не поддерживает DirectX 9.0c, отсутствуют библиотеки ANGLE и DirectX в поставке с приложением, и т. д.

3. Fallback-режим: использование opengl32sw.dll

Если все проверки на OpenGL/DirectX зафейлились, то приложение переходит к использованию библиотеки opengl32sw.dll аля LLVMPipe. Её суть реализации OpenGL на мощностях не GPU, а CPU. Медленно, зато будет работать.

Вот такие пироги. Зачем всё это приложению на Qt 5 с двумя кнопками — остаётся загадкой. Но видимо утилита windeployqt считает, что так и нужно.

P.S. Отвязать модуль QtGui от OpenGL можно лишь пересборкой всего Qt с флажком -disable-opengl. Однако во всех стандартных бинарных сборках для MS Windows и Linux эта фича активирована по умолчанию.

Как решение — если приложение точно не использует OpenGL из QtGui и не планирует, то можно забить на эти либы ANGLE и opengl32sw.dll и тупо их вырезать. Места освободится много, а функциональность нарушена не будет.