状況
Qt 4 を使用する 32 ビット アプリケーションを開発しており、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 で正常に動作します。
私は 2..3 年前にこのアプリの OpenGL サブシステムを書きました。それを使用した人は、仮想マシン (Win7 または Vista ゲスト) で同様の問題があると言いましたが、当時この問題にどのように対処したか覚えていません。
OpenGL の初期化
OpenGL の初期化は、QGLWidget を使用して、glew や追加のライブラリなしで Qt 4 によって実行されます。
プログラムには QGLWidget が 1 つしかありません。正確には、QGLWidget から派生したクラスがあり、その初期化は次のようになります。
DisplayWidget::DisplayWidget(QWidget* parent)
: QGLWidget(QGLFormat(QGL::DoubleBuffer | QGL::DepthBuffer), parent)
システム構成:
OS:Windows7 64bit。
コンパイラ: MSVC2008 Express SP1。
Qt: Qt 4.8.1 (MSVC2008 を使用して OpenSSL をサポートするソースからコンパイル)。Windows SDK: Windows Server 2008 および .NET 3.5。GPU: GeForce 460 GTX
質問:
この問題の原因は何ですか?
- アップデート -
"magical fix" (OpenGLVersionFlags) は、完全な再構築後に動作を停止し、gDebugger を使用して起動された場合でも、アプリケーションが常にソフトウェア レンダラーを初期化するようになりました。
私のマシン上の他のすべての OpenGL アプリケーションは正常に動作し、シェーダーを使用できます。
最新のドライバーを使用しています。
何か案は?
- アップデート -
いくつかのテストの後、Google Chrome と Steam クライアントが、OpenGL を使用するすべての Qt アプリケーションに何らかの影響を与えることがわかりました。
Google Chrome と Steam を開いていると、最終的にすべてのプログラムが正常に動作しなくなり、ハードウェア アクセラレーション OpenGL を取得できなくなります。
Google Chrome を閉じて Steam を開いたままにすると、ハードウェア アクセラレーション プログラムを 2 回起動しようとすると失敗します。
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).
アイデア?