Windows 7 64bit, Qt 4: glGetVersion връща 1.1.0, nvogl32v.dll се разтоварва

ситуация

Разработвам 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).

Идеи?


person SigTerm    schedule 11.06.2013    source източник
comment
Този проблем се случва понякога. Какво означава това? Можете ли да определите нещо конкретно, което го причинява? Какви са вашите параметри на пикселния формат?   -  person Nicol Bolas    schedule 11.06.2013
comment
@NicolBolas: Понякога, когато стартирам приложение, то отчита gl версия 4.3.0. Въпреки това, в повечето случаи, когато го стартирам нормално (и без споменатата магическа корекция на QGLFormat), gl версия отчита 1.1.0.   -  person SigTerm    schedule 11.06.2013
comment
Версия на драйвера на GPU? Опитахте ли да преинсталирате драйверите? Предлагам ви да изтеглите най-новата версия от NVidia и да я инсталирате, за да изключите всякакви грешки в драйвера.   -  person datenwolf    schedule 11.06.2013
comment
@datenwolf: Най-новите драйвери - 320.18. Не съм опитвал да преинсталирам, защото операционната система е инсталирана от нулата наскоро (преди по-малко от две седмици). Някак си подозирам, че това е грешка в Qt 4, а не грешка в драйвера, но нямам доказателство. Възможно ли е случайно да се създаде контекст само за OpenGL 1.1.0 на платформа Windows? Мисля, че windows по подразбиране предоставя някакъв вид емулация на OpenGL, която е доста ограничена и само OpenGL 1.1.0. Нямам представа обаче какво трябва да направите, за да получите този вместо хардуерно ускорения OpenGL.   -  person SigTerm    schedule 11.06.2013
comment
@SigTerm: Заявката за пикселен формат PFD_DRAW_TO_BITMAP ще ви постави надеждно в режим OpenGL-1.1. Някои други конфигурации на PFD също са предразположени към падащото меню с версия на OpenGL. Но се съмнявам, че това е вашият проблем в момента.   -  person datenwolf    schedule 11.06.2013
comment
@datenwolf: висящ указател или неинициализирана променлива може на теория да модифицира PIXELFORMATDESCRIPTOR по такъв начин, че да задейства падащото меню на версията. Никъде другаде не виждам графични проблеми, затова не мисля, че това е проблем на драйвера. Тъй като приложението се държи по различен начин под gDebugger, може да е нещо подобно....   -  person SigTerm    schedule 11.06.2013
comment
Опитайте да използвате build:release, за да видите какво получавате.   -  person adderly    schedule 16.06.2013
comment
Опитвали ли сте да поставите този ред QGLFormat::OpenGLVersionFlags flags = QGLFormat::openGLVersionFlags(); след mainWindow.show();, така че контекстът на OpenGL да се инициализира преди запитване за флагове за версия?   -  person user2448027    schedule 16.06.2013
comment
@user2448027: Ще покаже, че използвам OpenGL 1.0. По принцип поради неизвестна причина програмата се връща към софтуерно изобразяване. Само ТАЗИ програма. Когато това се случи, получавам определени графични артефакти, така че е трудно да се пропусне.   -  person SigTerm    schedule 16.06.2013
comment
@SigTerm Същото нещо случва ли се, ако стартирате друга програма, която използва Qt и OpenGL (ако например създадете малка тестова програма и я стартирате)?   -  person user2448027    schedule 16.06.2013
comment
@user2448027: Изглежда, че отварянето на google chrome по някакъв начин засяга програмите Qt+OpenGL. Ако имам chrome/steam open OpenGL+Qt програми в крайна сметка спират да работят и всеки опит да получа хардуерно ускорен OpenGL ще се провали. Ако го затворя, в крайна сметка те започват да работят правилно. :-\   -  person SigTerm    schedule 17.06.2013
comment
Две мисли: 1) Експериментирайте с друг браузър или други приложения, които могат да се забъркват с контекстите на OpenGL 2) Ретагирайте, за да включите google-chrome и/или steam.   -  person Samuel Harmer    schedule 20.06.2013
comment
@Styne666: Има ограничение от 5 етикета.   -  person SigTerm    schedule 20.06.2013


Отговори (3)


Посочвате ли версията на OpenGL с помощта на QGLFormat.setVersion + QGLFormat.setProfile?

QGLFormat glFormat;
glFormat.setVersion( 3, 2 );
glFormat.setProfile( QGLFormat::CoreProfile );
glFormat.setSampleBuffers( true );

QGLWidget w( glFormat );

Друг потенциален проблем. Вашият glGetVersion трябва да бъде извикан, след като контекстът на OpenGL е инициализиран в метода QGLWidget.initializeGL().

person Mortennobel    schedule 19.06.2013
comment
Изричното искане на версия 1.5 (това е всичко, от което се нуждая) не решава проблема. - person SigTerm; 20.06.2013

Добре, отказвам се.

Ще го маркирам като грешка в драйвера или несъвместимост с Google Chrome.

Ще добавя тази странност|проблем към readme на проекта и ще се уверя, че приложението работи добре (т.е. не показва артефакти), дори ако OpenGL е емулиран.

person SigTerm    schedule 22.06.2013

OpenGL 3.0 и по-нови имат модел за оттегляне за наследени функции. В старите версии на OpenGL новата версия беше надмножество на старата версия. т.е. ако искахте контекст OpenGL 1.5 и получихте контекст OpenGL 2.0, това беше добре. След като се появи възможността за премахване на стара функционалност, това вече не е жизнеспособно. Беше направено разширение WGL_ARB_create_context: то излага нова функция, която да замени wglCreateContext. Подобно на wglChoosePixelFormatARB, той добавя механизъм за разширение към системата, който прави възможно разширяването на опциите за създаване на контекст. Невъзможно е да се създаде контекст на основния профил на OpenGL 3.2+ без да се използва тази функция.

Ето официалната актуална документация за това как да създадете OpenGL контекст: http://www.opengl.org/wiki/Creating_an_OpenGL_Context_(WGL)

person Sergey K.    schedule 17.06.2013
comment
Без да се обиждаш, но това няма отношение към проблема. Тъй като същата програма без никакви промени или се инициализира успешно и получава хардуерно ускорен контекст OPenGL 4+, или не успява да се инициализира правилно и получава контекст на OpenGL 1.0, който се емулира от софтуера. - person SigTerm; 17.06.2013
comment
Това може да е специфично за приложението/драйвера поведение. - person Sergey K.; 18.06.2013
comment
Това поведение не е документирано никъде. Така че това е грешка, която се случва някъде. Бих искал да знам какво го причинява и как надеждно да го заобиколя/избегна. Това е всичко. - person SigTerm; 19.06.2013