私が直面している問題は、glxベースのアプリケーションで単一のスレッドで基本プリミティブをレンダリングすることです。私は両方の画面と私のレンダリングループの間でXWindowを移動することができます移動します。しかし、アプリケーションのいずれかの部分にスレッドがある場合でも、OpenGL呼び出しを行わないか、他のスレッドのXWindowに触れてもメインスレッドに触れる場合でも、XWindowをある画面から別の画面に移動すると、複数のモニタでGLXを使用するRHEL - OpenGL、XLib、Multiple Monitors(スレッドあり)
私が作る最初の関数呼び出しはXInitThreadsなので、X11はスレッドセーフであるべきです。私はこれは、1つのスレッドでプリミティブを描画するときに動作すると言ったが、1つ以上のスレッドを追加すると機能しません。スレッドは、私がソースにアクセスできないライブラリにあります。私はX11を使用してコードのウィンドウ部分を作成するように求められています。
この問題を解決するにはどうすればよいですか?
また、私はすべてのglcallがライブラリの中から呼び出すスレッド上にあることを確かめました。
更新
[[email protected] SampleApp]$ cat /etc/X11/xorg.conf && echo "--------" && xrandr --verbose && echo "-------" && glxinfo && echo "-------" && xdpyinfo
# nvidia-settings: X configuration file generated by nvidia-settings
# nvidia-settings: version 295.20 ([email protected]) Mon Feb 6 22:13:16 PST 2012
# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig: version 295.20 ([email protected]) Mon Feb 6 22:13:40 PST 2012
Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0" 0 0
Screen 1 "Screen1" RightOf "Screen0"
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
Option "Xinerama" "1"
EndSection
Section "Files"
FontPath "/usr/share/fonts/default/Type1"
EndSection
Section "InputDevice"
# generated from default
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/input/mice"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
EndSection
Section "InputDevice"
# generated from data in "/etc/sysconfig/keyboard"
Identifier "Keyboard0"
Driver "kbd"
Option "XkbLayout" "us"
Option "XkbModel" "pc105"
EndSection
Section "Monitor"
Identifier "Monitor0"
VendorName "Unknown"
ModelName "DELL P190S"
HorizSync 30.0 - 81.0
VertRefresh 56.0 - 76.0
Option "DPMS"
EndSection
Section "Monitor"
Identifier "Monitor1"
VendorName "Unknown"
ModelName "DELL P190S"
HorizSync 30.0 - 81.0
VertRefresh 56.0 - 76.0
Option "DPMS"
EndSection
Section "Monitor"
Identifier "Monitor1"
VendorName "Unknown"
ModelName "DELL 1908FP"
HorizSync 31.0 - 83.0
VertRefresh 56.0 - 76.0
EndSection
Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "Quadro 4000"
BusID "PCI:15:0:0"
Screen 0
EndSection
Section "Device"
Identifier "Device1"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "Quadro 4000"
BusID "PCI:15:0:0"
Screen 1
EndSection
Section "Screen"
Identifier "Screen0"
Device "Device0"
Monitor "Monitor0"
DefaultDepth 24
Option "TwinView" "0"
Option "TwinViewXineramaInfoOrder" "DFP-0"
Option "metamodes" "DFP-0: nvidia-auto-select +0+0"
SubSection "Display"
Depth 24
EndSubSection
EndSection
Section "Screen"
Identifier "Screen1"
Device "Device1"
Monitor "Monitor1"
DefaultDepth 24
Option "TwinView" "0"
Option "metamodes" "DFP-2: nvidia-auto-select +0+0"
SubSection "Display"
Depth 24
EndSubSection
EndSection
--------
Xlib: extension "RANDR" missing on display ":0.0".
RandR extension missing
[[email protected]gganz400 SampleApp]$
私が単に行うことができる唯一の場所は、swapbuffersを呼び出した後です。私は役に立たなかった。私はデバイスとglxMakeCurrentとglxSwapBuffers関数の作成を制御しています。そして私が描くライブラリを呼び出す前に、私はこれらを描画の周りに呼び出す。ドローイングが呼び出されたときに、私はあなたが呼んだスレッドですべてのglコールが行われることを約束しました。私のドローコールはメインスレッドにあります。 –
XWindowを画面から画面にドラッグすると、2つのX(#CPU)+ 1スレッドがすべてpthread_cond_waitにあります。 –
@MatthewHoggan:システム設定は何ですか?(GPUs、xrandr --verbose'、 'glxinfo'、' xdpyinfo')? – datenwolf