在多个监视器上使用GLX RHEL - OpenGL,XLib和多个监视器(带线程)

时间:2012-02-27 21:01:32

标签: c++ opengl glx

我面临的问题是我有一个基于glx的应用程序,可以在单个线程上渲染基本原语。我可以在两个屏幕之间移动XWindow,我的渲染循环继续。但是,如果我的应用程序的任何部分都有线程,即使它没有进行任何openGL调用或触摸任何其他线程上的XWindow,但是当我将XWindow从一个屏幕移动到另一个屏幕时,我呈现的图形的主线程将丢失。

我做的第一个函数调用是XInitThreads,所以我知道X11应该是线程安全的。正如我所说,当在一个线程上绘制基元时,这是有效的,但是当我添加一个或多个线程时,它不起作用。线程位于我无法访问源的库中。我只是被要求使用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]$ 

2 个答案:

答案 0 :(得分:1)

这只是一种预感,但可能是,OpenGL上下文在线程之间没有干净地迁移。如果您完全控制OpenGL和窗口操作,那么您的问题就不清楚了。

OpenGL和多线程的常用方法是将所有OpenGL操作仅限于一个特定的线程。

如果您无法确定,请致电

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

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

在完成OpenGL操作之后,在屈服于另一个线程或完成tasklet以确保上下文正确地从当前线程中解除绑定。

在需要时相应地重新绑定上下文。

答案 1 :(得分:0)

我认为必须是GL背景。当您从一个屏幕移动到另一个屏幕时,您应该切换到具有该(新)显示的GL上下文。使用expose事件选择其他上下文。也就是说,创建两个上下文并使用glxMakeCurrent(xdisplay,xwindow,xglcontext)。其中xdisplay是新显示,xglcontext是另一个上下文)