ситуация
Разработвам 32-битово приложение, което използва Qt 4, и работя върху Windows 7 64-битов.
Моята програма има основен уиджет, който не е OpenGL, и QGLWidget, който по желание се отваря от потребителя.
проблем:
Когато създам това QGLWidget
, glGetVersion
отчита "1.1.0" (хардуерът ми поддържа OpenGL 4.3.0). В резултат на това много функции, от които се нуждая, изобщо не работят (очевидно, защото не са налични в OpenGL 1). Този проблем се случва "понякога".
допълнителна информация
АКО стартирам програма с gDebugger, всичко работи добре и glGetVersion връща "4.3.0", както се очаква. Добавяне на този ред:
QGLFormat::OpenGLVersionFlags flags = QGLFormat::openGLVersionFlags();
в началото на функцията main() също коригира проблема.
Приложението работи добре на WinXP 32bit.
Написах OpenGL подсистема за това приложение преди 2..3 години и момчетата, които го използваха, казаха, че са имали подобен проблем на виртуални машини (Win7 или vista guest), но не си спомням как се справих с този проблем по това време.
Инициализация на OpenGL
Инициализацията на OpenGL се извършва от Qt 4, без glew или допълнителни библиотеки, с помощта на QGLWidget.
В програмата има само един QGLWidget. За да бъдем точни, има клас, извлечен от QGLWidget, неговата инициализация изглежда така:
DisplayWidget::DisplayWidget(QWidget* parent)
: QGLWidget(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer), parent)
Системна конфигурация:
ОС: Windows 7 64bit.
Компилатор: MSVC2008 express SP1.
Qt: Qt 4.8.1 (компилиран от източник с поддръжка на OpenSSL с помощта на MSVC2008). Windows SDK: Windows Server 2008 и .NET 3.5. GPU: GeForce 460 GTX
въпрос:
На какво може да се дължи този проблем?
--актуализация--
"магическа корекция" (OpenGLVersionFlags) спря да работи след пълно възстановяване и сега приложението постоянно инициализира софтуерния рендер, дори когато се стартира с gDebugger.
Всички други OpenGL приложения на моята машина работят добре и могат да използват шейдъри.
Ползвам най-новите драйвери.
Някакви идеи?
--актуализация--
След известно тестване открих, че по някакъв начин google chrome и steam клиентът засягат всички Qt приложения, които използват OpenGL.
Ако имам отворени Google Chrome и Steam, в крайна сметка всички програми ще спрат да работят правилно и вече няма да могат да получат хардуерно ускорен OpenGL.
Ако затворя google chrome и оставя Steam отворен, всеки втори опит за стартиране на хардуерно ускорена програма ще бъде неуспешен.
Ако затворя и steam, и chrome, тогава всяко стартиране на програма ще бъде успешно.
Защо това може да се случи?
--актуализация--
Прочетох изхода на дебъгера и открих много интересно нещо:
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\nvoglv32.dll'
First-chance exception at 0x777f47a5 (ntdll.dll) in vdclient.exe: 0xC0000005: Access violation reading location 0x05aa9000.
'vdclient.exe': Unloaded 'C:\Windows\SysWOW64\nvoglv32.dll'
По принцип, когато се зарежда nvoglv32.dll, "нещо" се срива някъде (дебъгерът не реагира на това събитие, между другото) и системата решава да разтовари nvoglv32.dll. Съдейки по името му е системен/драйверен компонент на nvidia и без този компонент не може да има хардуерно ускорение.
Когато opengl работи правилно, тази част от дневника изглежда така:
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\nvoglv32.dll'
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\ntmarta.dll', Symbols loaded (source information stripped).
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\Wldap32.dll', Symbols loaded (source information stripped).
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\powrprof.dll', Symbols loaded (source information stripped).
The thread 'Win32 Thread' (0x1744) has exited with code 0 (0x0).
The thread 'Win32 Thread' (0x1740) has exited with code 0 (0x0).
'vdclient.exe': Unloaded 'C:\Windows\SysWOW64\powrprof.dll'
The thread 'Win32 Thread' (0x1748) has exited with code 0 (0x0).
The thread 'Win32 Thread' (0x174c) has exited with code 0 (0x0).
'vdclient.exe': Loaded 'C:\Windows\SysWOW64\uxtheme.dll', Symbols loaded (source information stripped).
Идеи?
QGLFormat::OpenGLVersionFlags flags = QGLFormat::openGLVersionFlags();
следmainWindow.show();
, така че контекстът на OpenGL да се инициализира преди запитване за флагове за версия? - person user2448027   schedule 16.06.2013