X11 전달을 사용한 OpenGL 렌더링

X11 전달을 사용한 OpenGL 렌더링

SSH -Y를 통해 연결된 원격 서버에서 실행 파일을 실행하려고 합니다. 실행 파일이 OpenGL을 사용하는 것 같습니다.

서버는 Ubuntu를 실행하고 로컬 시스템은 OSX를 실행합니다.

ssh -Y는 일반적으로 X11을 통해 내 로컬 컴퓨터의 디스플레이를 엽니다. 이는 다른 응용프로그램(firefox, matlab 등)에서도 잘 작동합니다.

이번에는 다음과 같은 메시지를 받았습니다.

libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
X Error of failed request:  GLXBadContext
  Major opcode of failed request:  149 (GLX)
  Minor opcode of failed request:  6 (X_GLXIsDirect)
  Serial number of failed request:  35
  Current serial number in output stream:  34
X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  149 (GLX)
  Minor opcode of failed request:  24 (X_GLXCreateNewContext)
  Value in failed request:  0x0
  Serial number of failed request:  34
  Current serial number in output stream:  35

나는 또한 glxinfo를 실행했고(포럼에서 찾은 것을 시도하고 있었습니다) 이것을 얻었습니다.

name of display: localhost:11.0
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
X Error of failed request:  GLXBadContext
  Major opcode of failed request:  149 (GLX)
  Minor opcode of failed request:  6 (X_GLXIsDirect)
  Serial number of failed request:  23
  Current serial number in output stream:  22

이 문제를 해결하는 데 도움을 줄 수 있는 사람이 있나요?

감사합니다!

답변1

2021년 5월 5일에 수정됨: XQuartz 2.8.0이 출시되면서 구성 경로가 org.macosforge.xquartz.X11에서 변경된 것으로 보입니다 org.xquartz.X11. 동일한 지침이 여전히 적용됩니다. 미래에서 온 경우 기존 경로를 새 경로로 바꾸십시오.


여기에 있는 답변은 수정되었지만, 직장에서 격년으로 이 질문이 나올 때 향후 참조로 사용할 수 있는 또 다른 답변을 제출합니다. :)

이는 X가 (SSH, Docker 등을 통해) 전달될 때 자주 발생합니다. 많은 X11 서버(예: XQuarts 또는 Ubuntu의 표준 X11 서버)에서 기본적으로 비활성화되어 있는 OpenGL 그리기(iglx)를 허용해야 합니다. 이와 관련하여 볼 수 있는 다른 로그는 다음과 같습니다.

XRequest.155: GLXBadContext 0x500003a
XRequest.155: BadValue (integer parameter out of range for operation) 0x0
XRequest.155: GLXBadContext 0x500003b
[xcb] Unknown sequence number while processing queue
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
../../src/xcb_io.c:259: poll_for_event: Assertion `!xcb_xlib_threads_sequence_lost' failed.

수정 사항은 iglx를 활성화하는 것입니다. 먼저, 사용 중인 XQuarts 버전이 이 기능을 지원하는지 확인하세요. 이 글을 쓰는 시점의 최신 버전은 이것이지만 더 이상 사용되지 않으므로 앞으로는 그렇지 않을 수도 있습니다. 내 버전은 입니다 XQuartz 2.7.11 (xorg-server 1.18.4).

다음으로 실행 defaults write org.macosforge.xquartz.X11 enable_iglx -bool true하여 설정되었는지 확인할 수 있습니다.

$ defaults read org.macosforge.xquartz.X11
{
    "app_to_run" = "/opt/X11/bin/xterm";
    "cache_fonts" = 1;
    "done_xinit_check" = 1;
    "enable_iglx" = 1; ####### this should be truthy
    "login_shell" = "/bin/sh";
    "no_auth" = 0;
    "nolisten_tcp" = 0;
    "startx_script" = "/opt/X11/bin/startx -- /opt/X11/bin/Xquartz";
}

마지막으로 xquartz(또는 전체 머신)를 다시 시작하세요. 보안 및 인증을 비활성화한 상태에서 다시 실행해야 할 수도 있습니다 xhost +(격리된 컴퓨터에는 좋지만 인터넷에 노출된 컴퓨터에는 위험함). 이제 예상대로 GUI 애플리케이션을 실행할 수 있습니다. 도움이 되었기를 바랍니다!

답변2

모든 분들의 의견과 제안을 토대로 다음과 같은 방법으로 이루어질 수 있다고 생각합니다. 달리기:

quartz-wm --help

이것은 다음과 같이 출력됩니다

usage: quartz-wm OPTIONS
Aqua window manager for X11.

--version                 Print the version string
--prefs-domain <domain>   Change the domain used for reading preferences
                          (default: org.xquartz.X11)

마지막 줄에는 defaults도메인이 표시됩니다. 이 경우 다음을 사용하여 확인할 수 있습니다.

defaults read org.xquartz.X11

그리고 바꿔봐

defaults write org.xquartz.X11 enable_iglx -bool true

지금 Zquartz를 다시 시작하는 경우(종료하거나 로그아웃한 후 다시 로그인하거나 다시 시작하여) 나에게는 Xquartz xterm 세션에서 ssh 세션을 시작해야 했습니다. 이것은 나에게 다음을 제공합니다:

nicola@raspy3:~ $ glxinfo                                                                                                                                                                      
name of display: localhost:10.0                                                                                                                                                                
libGL error: No matching fbConfigs or visuals found                                                                                                                                            
libGL error: failed to load driver: swrast                                                                                                                                                     
display: localhost:10  screen: 0                                                                                                                                                               
direct rendering: No (If you want to find out why, try setting LIBGL_DEBUG=verbose)                                                                                                            
server glx vendor string: SGI                                                                                                                                                                  
server glx version string: 1.4                                                                                                                                                                 
server glx extensions:                                                                                                                                                                         
    GLX_ARB_multisample, GLX_EXT_import_context, GLX_EXT_visual_info,                                                                                                                          
    GLX_EXT_visual_rating, GLX_OML_swap_method, GLX_SGIS_multisample,                                                                                                                          
    GLX_SGIX_fbconfig, GLX_SGIX_pbuffer, GLX_SGIX_visual_select_group,                                                                                                                         
    GLX_SGI_make_current_read                                                                                                                                                                  

따라서 swast 메시지는 여전히 존재하지만 이제 GL이 작동하고 있습니다.

PS: 한 줄의 코드로 필요한 구성을 작성합니다.

defaults write `quartz-wm --help | awk '/default:.*X11/ { gsub(/\)/, "", $2); print $2}'` enable_iglx -bool true

답변3

Mac OS Mojave에서 기본값을 사용하여 터미널 응용 프로그램에 쓴 org.macports.X11 enable_iglx -bool true다음 동일한 터미널에서 Xquartz +extension GLX`를 실행했습니다.

그런 다음 glxgears를 실행하고 래스터 작업을 수행할 수 있지만 디스플레이는 기본/Retina 디스플레이 대신 외부 모니터의 왼쪽 상단 모서리에 배치되고 크기 조정/이동을 위한 프레임은 그려지지 않습니다.

이는 Nvidia 그래픽 카드에 대한 형편없는 드라이버 지원과 1990년대 Linux 데스크탑을 실행하려고 했던 것을 생각나게 합니다. :)

freedesktop.org 버그 저장소를 확인한 결과 Xquartz/X11이 아직 Retina 디스플레이를 지원하지 않는 것 같습니다. 몇 가지 트릭이 있지만 몇 년 전 내 Mac의 XQuartz에서 Wireshark를 실행하는 것이 얼마나 투박했는지 생각나게 합니다. 저는 X11 전달이 제대로 작동하고 프레임을 다시 그리는 데 약 3~5분 정도 걸리지 않기를 원합니다. 바라보다https://gitlab.freedesktop.org/xorg/xserver/-/issues/187

관련 정보