История изменений
Исправление 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
А пример использования в реальных приложениях можно посмотреть здесь:
---
Далее, отвечаю на вопрос, зачем нужна библиотека opengl32sw.dll для приложений на Qt 5?
Суть в том, что в любой MS Windows в стандартной поставке «из-коробки» используется старейший OpenGL 1.1 родом из 1997 года:
А 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
А пример использования в реальных приложениях можно посмотреть здесь:
---
Далее, отвечаю на вопрос, зачем нужна библиотека opengl32sw.dll для приложений на Qt 5?
Суть в том, что в любой MS Windows в стандартной поставке «из-коробки» используется старейший OpenGL 1.1 родом из 1997 года:
А 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 и тупо их вырезать. Места освободится много, а функциональность нарушена не будет.