0

私が直面している問題は、単一のスレッドで基本的なプリミティブを適切にレンダリングする glx ベースのアプリケーションがあることです。両方の画面間で XWindow を移動でき、レンダリング ループが続行されます。ただし、アプリケーションの一部にスレッドがある場合、openGL 呼び出しを行ったり、他のスレッドで XWindow に触れたりしなくても、XWindow をある画面から別の画面に移動すると、描画するグラフィックスのメイン スレッドが失われます。

私が行う最初の関数呼び出しは XInitThreads であるため、X11 がスレッド セーフであることはわかっています。私が言ったように、これは 1 つのスレッドでプリミティブを描画するときに機能しますが、1 つ以上のスレッドを追加すると機能しません。スレッドは、ソースにアクセスできないライブラリにあります。X11 を使用してコードのウィンドウ部分を作成するように求められています。

これを修正するには、どのようなことを探す必要がありますか?

また、すべての glcall は、ライブラリ内から呼び出したスレッドで発生することが保証されていることに注意してください。


アップデート

[matt6809@hogganz400 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  (buildmeister@swio-display-x86-rhel47-05.nvidia.com)  Mon Feb  6 22:13:16 PST 2012

# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig:  version 295.20  (buildmeister@swio-display-x86-rhel47-05.nvidia.com)  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
[matt6809@hogganz400 SampleApp]$ 
4

2 に答える 2

1

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

OpenGL とマルチスレッドに関する通常のアプローチは、すべての OpenGL 操作を 1 つの特定のスレッドのみに制限することです。

これを確認できない場合は、電話する必要があります

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

また

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

OpenGL操作を終了した後、別のスレッドに譲る前、またはタスクレットを終了して、コンテキストが現在のスレッドから適切にバインド解除されていることを確認します。

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

于 2012-02-27T22:49:45.750 に答える
0

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

于 2016-04-27T10:25:22.413 に答える