2012-02-27 13 views
0

私が直面している問題は、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]$ 

答えて

1

OpenGLのコンテキストがきれいにスレッド間で移行されないこと、それはただの勘だが、それはあるかもしれません。あなたがOpenGLとウィンドウ操作を完全に制御できるのであれば、あなたの質問は明確ではありません。

OpenGLとマルチスレッドに関する一般的なアプローチは、すべてのOpenGL操作を特定のスレッドに限定しておくことです。あなたはこれを確認できない場合

、あなたは必ずコンテキストがあることを確認するために、別のスレッドに降伏またはタスクレットを終了する前にOpenGLの作業を終えた後

glXMakeContextCurrent(display, None, None, NULL); // GLX 1.3 

または

glXMakeCurrent(display, None, NULL); // GLX 1.2 and earlier 

を呼び出す必要があります現在のスレッドから適切にアンバインドされます。

必要に応じてコンテキストを再バインドします。

+0

私が単に行うことができる唯一の場所は、swapbuffersを呼び出した後です。私は役に立たなかった。私はデバイスとglxMakeCurrentとglxSwapBuffers関数の作成を制御しています。そして私が描くライブラリを呼び出す前に、私はこれらを描画の周りに呼び出す。ドローイングが呼び出されたときに、私はあなたが呼んだスレッドですべてのglコールが行われることを約束しました。私のドローコールはメインスレッドにあります。 –

+0

XWindowを画面から画面にドラッグすると、2つのX(#CPU)+ 1スレッドがすべてpthread_cond_waitにあります。 –

+0

@MatthewHoggan:システム設定は何ですか?(GPUs、xrandr --verbose'、 'glxinfo'、' xdpyinfo')? – datenwolf

0

GLコンテキストでなければならないと思います。ある画面から別の画面に移動するときは、その(新しい)表示を持つGLコンテキストに切り替える必要があります。 exposeイベントを使用して、他のコンテキストを選択します。つまり、2つのコンテキストを作成し、glxMakeCurrent(xdisplay、xwindow、xglcontext)を使用します。 xdisplayは新しいディスプレイで、xglcontextは別のコンテキストになります)

関連する問題