2012-02-27 1 views
0

내가 직면하고있는 문제는 단일 스레드에서 기본 기본 요소를 렌더링하는 glx 기반 응용 프로그램을 가지고 있다는 것입니다. 두 화면 사이에서 XWindow를 움직일 수 있고 렌더링 루프가 계속 진행됩니다. 그러나 응용 프로그램의 일부에 스레드가 있으면 OpenGL 호출을하지 않거나 다른 스레드에서는 XWindow를 누르지 만 주 스레드는 한 화면에서 다른 화면으로 XWindow를 이동하면 렌더링되는 그래픽이 손실됩니다.다중 모니터에서 GLX 사용 RHEL - OpenGL, XLib 및 다중 모니터 (스레드 포함)

내가 처음 작성한 함수 호출은 XInitThreads이므로 X11은 스레드로부터 안전해야한다는 것을 알고 있습니다. 내가 말했듯이 한 스레드에서 프리미티브를 그릴 때 작동하지만 하나 이상의 스레드를 추가 할 때는 작동하지 않는다. 스레드는 내가 소스에 액세스 할 수없는 라이브러리에 있습니다. 나는 X11을 사용하여 코드의 윈도우 부분을 생성하라는 요청을 받고있다.

이 문제를 해결하려면 무엇을해야합니까?

또한 모든 glcall이 내가 라이브러리 내부에서 호출하는 스레드에서 hapen된다는 것을 알아 냈습니다.


업데이트는

[[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] 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를 화면에서 화면으로 드래그하면 두 개의 X (#CPUs) + 1 스레드 모두 pthread_cond_wait에 있습니다. –

+0

@MatthewHoggan : 시스템 설정은 무엇입니까 (사용 된 GPU, xorg.conf [.d] 출력의 xrandr --verbose','glxinfo','xdpyinfo')? – datenwolf

0

GL 컨텍스트 여야한다고 생각합니다. 한 화면에서 다른 화면으로 이동할 때 (새) 표시가있는 GL 컨텍스트로 전환해야합니다. expose 이벤트를 사용하여 다른 컨텍스트를 선택하십시오. 즉, 두 개의 컨텍스트를 만들고 glxMakeCurrent (xdisplay, xwindow, xglcontext)를 사용하십시오. 여기서 xdisplay는 새로운 디스플레이이고 xglcontext는 다른 컨텍스트입니다.)