Использование GLX на нескольких мониторах RHEL - OpenGL, XLib и несколько мониторов (с потоками) - PullRequest
0 голосов
/ 28 февраля 2012

Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть приложение на основе glx, которое будет прекрасно отображать базовые примитивы в одном потоке. Я могу перемещать XWindow между обоими экранами, и мой цикл рендеринга продолжается. Однако, если в какой-либо части моего приложения есть потоки, даже если оно не выполняет никаких вызовов openGL или не касается XWindow в каком-либо другом потоке, кроме основного потока, изображение, которое я отображаю, теряется, когда я перемещаю XWindow с одного экрана на другой.

Самый первый вызов функции, который я выполняю, это XInitThreads, поэтому я знаю, что X11 должен быть безопасным для потоков. Как я уже сказал, это работает при рисовании примитивов в одном потоке, но не работает, когда я добавляю 1 или более потоков. Потоки находятся в библиотеке, к которой у меня нет доступа к источнику. Меня просто просят создать оконную часть кода, используя X11.

Какие вещи я должен искать, чтобы это исправить?

Также обратите внимание, что я был уверен, что все glcalls произошли в потоке, который я вызываю изнутри библиотеки.


Обновление

[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 ]

1 голос
/ 28 февраля 2012

Это всего лишь догадка, но может случиться так, что контексты OpenGL не переносятся между потоками.Ваш вопрос не проясняет, если у вас есть полный контроль над OpenGL и операциями с окнами.

Обычный подход, когда речь идет об OpenGL и многопоточности, состоит в том, чтобы все операции OpenGL ограничивались только одним конкретным потоком.

Если вы не можете убедиться в этом, вы должны вызвать

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

или

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

после завершения операций OpenGL перед передачей в другой поток или завершением тасклетаубедитесь, что контекст должным образом не связан с текущим потоком.

При необходимости перепривязать контекст.

0 голосов
/ 27 апреля 2016

Я думаю, это должен быть контекст GL. Когда вы переходите с одного экрана на другой, вы должны переключиться на контекст GL, который имеет этот (новый) дисплей. Используйте событие expose, чтобы выбрать другой контекст. То есть создайте два контекста и используйте glxMakeCurrent (xdisplay, xwindow, xglcontext). Где xdisplay - новый экран, а xglcontext - другой контекст)

...