linux - 在 GLX 中使用 X11 转发时遇到问题
问题描述
Covid让我远程工作,我被困在这里了。
我对 UI 甚至 3D OpenSceneGraph 可视化使用 X11 转发都没有问题,但是我需要运行的新应用程序在远程计算机上出现以下错误:
X Error of failed request: GLXUnsupportedPrivateRequest
Major opcode of failed request: 149 (GLX)
Minor opcode of failed request: 16 (X_GLXVendorPrivate)
Serial number of failed request: 35
Current serial number in output stream: 38
远程计算机是运行 ubuntu 16.04 的 linux 机器,本地计算机是使用 XQuartz 作为 X 服务器的 mac。
根据我的研究,本地计算机似乎不支持某个 GLX 请求。我想知道这是否只是 XQuartz 中缺少的无法解决的 GLX 功能。
我试图调查 GLX 是否是问题所在。如果我运行“glxdemo”,我会看到黄色方块没问题。可能相关 - 当我运行 glxgears 时,我看到齿轮没有移动,尽管没有错误并且控制台报告非零 fps。
其他一些有趣的信息,这是我在远程计算机上运行“glxinfo”的结果。这与未启用直接渲染有关吗?我读到这与使用不支持远程 GLX 的 NVidia 的 libGL.so 有关。这是正确的下坡路吗?其他奇怪的是“OpenGL 渲染器字符串”引用了内部的英特尔芯片,而不是英伟达显卡。为什么会出现这种情况,是否相关?
name of display: localhost:10.0
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
client glx vendor string: NVIDIA Corporation
client glx version string: 1.4
client glx extensions:
GLX_ARB_context_flush_control, GLX_ARB_create_context,
GLX_ARB_create_context_no_error, GLX_ARB_create_context_profile,
GLX_ARB_create_context_robustness, GLX_ARB_fbconfig_float,
GLX_ARB_get_proc_address, GLX_ARB_multisample, GLX_EXT_buffer_age,
GLX_EXT_create_context_es2_profile, GLX_EXT_create_context_es_profile,
GLX_EXT_fbconfig_packed_float, GLX_EXT_framebuffer_sRGB,
GLX_EXT_import_context, GLX_EXT_stereo_tree, GLX_EXT_swap_control,
GLX_EXT_swap_control_tear, GLX_EXT_texture_from_pixmap,
GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_NV_copy_buffer,
GLX_NV_copy_image, GLX_NV_delay_before_swap, GLX_NV_float_buffer,
GLX_NV_multisample_coverage, GLX_NV_present_video,
GLX_NV_robustness_video_memory_purge, GLX_NV_swap_group,
GLX_NV_video_capture, GLX_NV_video_out, GLX_SGIX_fbconfig,
GLX_SGIX_pbuffer, GLX_SGI_swap_control, GLX_SGI_video_sync
GLX version: 1.4
GLX extensions:
GLX_ARB_get_proc_address, GLX_ARB_multisample, GLX_EXT_import_context,
GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_SGIX_fbconfig
OpenGL vendor string: Intel Inc.
OpenGL renderer string: Intel(R) Iris(TM) Plus Graphics 640
OpenGL version string: 1.4 (2.1 INTEL-10.25.24)
OpenGL extensions:
GL_ARB_depth_texture, GL_ARB_draw_buffers, GL_ARB_fragment_program,
GL_ARB_fragment_program_shadow, GL_ARB_multisample, GL_ARB_multitexture,
GL_ARB_occlusion_query, GL_ARB_point_parameters, GL_ARB_point_sprite,
GL_ARB_shadow, GL_ARB_texture_border_clamp, GL_ARB_texture_compression,
GL_ARB_texture_cube_map, GL_ARB_texture_env_add,
GL_ARB_texture_env_combine, GL_ARB_texture_env_crossbar,
GL_ARB_texture_env_dot3, GL_ARB_texture_mirrored_repeat,
GL_ARB_texture_non_power_of_two, GL_ARB_transpose_matrix,
GL_ARB_vertex_program, GL_ARB_window_pos, GL_ATI_texture_mirror_once,
GL_EXT_abgr, GL_EXT_bgra, GL_EXT_blend_color,
GL_EXT_blend_equation_separate, GL_EXT_blend_func_separate,
GL_EXT_blend_minmax, GL_EXT_blend_subtract, GL_EXT_draw_range_elements,
GL_EXT_fog_coord, GL_EXT_framebuffer_object, GL_EXT_multi_draw_arrays,
GL_EXT_rescale_normal, GL_EXT_secondary_color,
GL_EXT_separate_specular_color, GL_EXT_shadow_funcs,
GL_EXT_stencil_two_side, GL_EXT_stencil_wrap,
GL_EXT_texture_compression_dxt1, GL_EXT_texture_compression_s3tc,
GL_EXT_texture_env_add, GL_EXT_texture_filter_anisotropic,
GL_EXT_texture_lod_bias, GL_NV_blend_square, GL_NV_depth_clamp,
GL_NV_fog_distance, GL_NV_light_max_exponent, GL_NV_texgen_reflection,
GL_SGIS_generate_mipmap, GL_SGIS_texture_lod
任何帮助将不胜感激。远程工作有点困难,但我被迫这样做。
解决方案
在我的服务器中安装了 Nvidia GPU 以运行 CUDA 应用程序后,我在使用不同的程序时遇到了同样的问题。似乎在这样做之后,一些 GL 应用程序(但不是 glxinfo 或 glxgears)加载 NvidialibGLX.so
而不是应该用于通过 ssh 进行 GLX 转发的 Mesa 间接应用程序。
这是通过在远程机器上输入以下内容来解决的:
sudo update-glx --config glx
然后选择 Mesa 驱动程序。
我确实认为这会在系统范围内禁用 Nvidia GLX 驱动程序,如果显卡用于本地视频输出,这可能是不可取的。
推荐阅读
- python - Documentum REST API (dm_audittrail)
- python - 带有 aiocache 和 Redis 的 FastAPI 无法设置 databases.backends.postgres.Record 对象
- c# - 如何在 C# Telegram Bot API 中请求联系
- flutter - Flutter - 将计算作为文本传递到不同的屏幕
- javascript - 2 菜单 javascripts 与 echother 冲突
- node.js - 无法使用 ngrok 访问其他路线
- javascript - Ajax 轮询 - 无延迟触发超时
- node.js - 尽可能快地汇总一个大数组(200,000+)的对象
- javascript - 两个下拉列表值重定向到特定的 URL
- php - 用插件样式覆盖主题样式