我面临的问题是我有一个基于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]$
答案 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是另一个上下文)