6

我只是尝试运行这个:

int main(int argc, char **argv) {

EGLDisplay display;
EGLConfig config;
EGLContext context;
EGLint num_config;

display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (display == EGL_NO_DISPLAY)
{
    std:: cout << "ERROR: EGL could not be initialized"<< std::endl;
    exit(EXIT_FAILURE);
}
if (!eglInitialize(display, nullptr, nullptr))
{
    std:: cout << "ERROR: Could not start EGL display connection"<< std::endl;
    exit(EXIT_FAILURE);
}
if (eglChooseConfig(display, nullptr, &config, 1, &num_config) != EGL_TRUE)
{
    std:: cout << "ERROR: Configuration selection failed" << std::endl;
    exit(EXIT_FAILURE);
}
eglBindAPI(EGL_OPENGL_API);
context = eglCreateContext(display, config, EGL_NO_CONTEXT, NULL);
if (eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, context) != EGL_TRUE) {
    std:: cout << "ERROR: Display was not made current one"<< std::endl;
    exit(EXIT_FAILURE);
}

GLenum err = glewInit();
if (GLEW_OK != err)
{
    std:: cout << "GLEW Error: " << glewGetErrorString(err) << std::endl;
    exit(EXIT_FAILURE);
}
// ... some code here
}

但是在运行它时,我有:

GLEW 错误:缺少 GL 版本

看起来我glewInit()的 GL 上下文失败了,但我不明白为什么,因为 myglewInit()在上下文创建后被调用。EGL 没有错误。

此代码的目的是能够在没有任何窗口的情况下拥有 Opengl 上下文。这段代码过去有效,但自从我使用 Nvidia 384 升级了我的 Ubuntu 17.10,在 Quadro K2000M 上工作后就没有了。

这是我的glxinfo

glxinfo 
name of display: :1
display: :1  screen: 0
direct rendering: Yes
server glx vendor string: NVIDIA Corporation
server glx version string: 1.4
server glx extensions:
    GLX_ARB_context_flush_control, GLX_ARB_create_context, 
    GLX_ARB_create_context_profile, GLX_ARB_create_context_robustness, 
    GLX_ARB_fbconfig_float, GLX_ARB_multisample, GLX_EXT_buffer_age, 
    GLX_EXT_create_context_es2_profile, GLX_EXT_create_context_es_profile, 
    GLX_EXT_framebuffer_sRGB, GLX_EXT_import_context, GLX_EXT_libglvnd, 
    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_robustness_video_memory_purge, 
    GLX_NV_swap_group, GLX_NV_video_capture, GLX_SGIX_fbconfig, 
    GLX_SGIX_pbuffer, GLX_SGI_swap_control, GLX_SGI_video_sync
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_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_context_flush_control, GLX_ARB_create_context, 
    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_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_robustness_video_memory_purge, GLX_NV_swap_group, 
    GLX_NV_video_capture, GLX_SGIX_fbconfig, GLX_SGIX_pbuffer, 
    GLX_SGI_swap_control, GLX_SGI_video_sync
OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: Quadro M2000M/PCIe/SSE2
OpenGL core profile version string: 4.5.0 NVIDIA 384.90
OpenGL core profile shading language version string: 4.50 NVIDIA
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
    GL_AMD_multi_draw_indirect, GL_AMD_seamless_cubemap_per_texture, 
    GL_ARB_ES2_compatibility, GL_ARB_ES3_1_compatibility, 
    GL_ARB_ES3_2_compatibility, GL_ARB_ES3_compatibility, 
    GL_ARB_arrays_of_arrays, GL_ARB_base_instance, GL_ARB_bindless_texture, 
    GL_ARB_blend_func_extended, GL_ARB_buffer_storage, GL_ARB_cl_event, 
    GL_ARB_clear_buffer_object, GL_ARB_clear_texture, GL_ARB_clip_control, 
    GL_ARB_color_buffer_float, GL_ARB_compressed_texture_pixel_storage, 
    GL_ARB_compute_shader, GL_ARB_compute_variable_group_size, 
    GL_ARB_conditional_render_inverted, GL_ARB_conservative_depth, 
    GL_ARB_copy_buffer, GL_ARB_copy_image, GL_ARB_cull_distance, 
    GL_ARB_debug_output, GL_ARB_depth_buffer_float, GL_ARB_depth_clamp, 
    GL_ARB_depth_texture, GL_ARB_derivative_control, 
    GL_ARB_direct_state_access, GL_ARB_draw_buffers, 
    GL_ARB_draw_buffers_blend, GL_ARB_draw_elements_base_vertex, 
    GL_ARB_draw_indirect, GL_ARB_draw_instanced, GL_ARB_enhanced_layouts, 
    GL_ARB_explicit_attrib_location, GL_ARB_explicit_uniform_location, 
    GL_ARB_fragment_coord_conventions, GL_ARB_fragment_layer_viewport, 
    GL_ARB_fragment_program, GL_ARB_fragment_program_shadow, 
    GL_ARB_fragment_shader, GL_ARB_framebuffer_no_attachments, 
    GL_ARB_framebuffer_object, GL_ARB_framebuffer_sRGB, 
    GL_ARB_geometry_shader4, GL_ARB_get_program_binary, 
    GL_ARB_get_texture_sub_image, GL_ARB_gl_spirv, GL_ARB_gpu_shader5, 
    GL_ARB_gpu_shader_fp64, GL_ARB_gpu_shader_int64, GL_ARB_half_float_pixel, 
    GL_ARB_half_float_vertex, GL_ARB_imaging, GL_ARB_indirect_parameters, 
    GL_ARB_instanced_arrays, GL_ARB_internalformat_query, 
    GL_ARB_internalformat_query2, GL_ARB_invalidate_subdata, 
    GL_ARB_map_buffer_alignment, GL_ARB_map_buffer_range, GL_ARB_multi_bind, 
    GL_ARB_multi_draw_indirect, GL_ARB_multisample, GL_ARB_multitexture, 
    GL_ARB_occlusion_query, GL_ARB_occlusion_query2, 
    GL_ARB_parallel_shader_compile, GL_ARB_pipeline_statistics_query, 
    GL_ARB_pixel_buffer_object, GL_ARB_point_parameters, GL_ARB_point_sprite, 
    GL_ARB_program_interface_query, GL_ARB_provoking_vertex, 
    GL_ARB_query_buffer_object, GL_ARB_robust_buffer_access_behavior, 
    GL_ARB_robustness, GL_ARB_sample_shading, GL_ARB_sampler_objects, 
    GL_ARB_seamless_cube_map, GL_ARB_seamless_cubemap_per_texture, 
    GL_ARB_separate_shader_objects, GL_ARB_shader_atomic_counter_ops, 
    GL_ARB_shader_atomic_counters, GL_ARB_shader_ballot, 
    GL_ARB_shader_bit_encoding, GL_ARB_shader_clock, 
    GL_ARB_shader_draw_parameters, GL_ARB_shader_group_vote, 
    GL_ARB_shader_image_load_store, GL_ARB_shader_image_size, 
    GL_ARB_shader_objects, GL_ARB_shader_precision, 
    GL_ARB_shader_storage_buffer_object, GL_ARB_shader_subroutine, 
    GL_ARB_shader_texture_image_samples, GL_ARB_shader_texture_lod, 
    GL_ARB_shading_language_100, GL_ARB_shading_language_420pack, 
    GL_ARB_shading_language_include, GL_ARB_shading_language_packing, 
    GL_ARB_shadow, GL_ARB_sparse_buffer, GL_ARB_sparse_texture, 
    GL_ARB_stencil_texturing, GL_ARB_sync, GL_ARB_tessellation_shader, 
    GL_ARB_texture_barrier, GL_ARB_texture_border_clamp, 
    GL_ARB_texture_buffer_object, GL_ARB_texture_buffer_object_rgb32, 
    GL_ARB_texture_buffer_range, GL_ARB_texture_compression, 
    GL_ARB_texture_compression_bptc, GL_ARB_texture_compression_rgtc, 
    GL_ARB_texture_cube_map, GL_ARB_texture_cube_map_array, 
    GL_ARB_texture_env_add, GL_ARB_texture_env_combine, 
    GL_ARB_texture_env_crossbar, GL_ARB_texture_env_dot3, 
    GL_ARB_texture_float, GL_ARB_texture_gather, 
    GL_ARB_texture_mirror_clamp_to_edge, GL_ARB_texture_mirrored_repeat, 
    GL_ARB_texture_multisample, GL_ARB_texture_non_power_of_two, 
    GL_ARB_texture_query_levels, GL_ARB_texture_query_lod, 
    GL_ARB_texture_rectangle, GL_ARB_texture_rg, GL_ARB_texture_rgb10_a2ui, 
    GL_ARB_texture_stencil8, GL_ARB_texture_storage, 
    GL_ARB_texture_storage_multisample, GL_ARB_texture_swizzle, 
    GL_ARB_texture_view, GL_ARB_timer_query, GL_ARB_transform_feedback2, 
    GL_ARB_transform_feedback3, GL_ARB_transform_feedback_instanced, 
    GL_ARB_transform_feedback_overflow_query, GL_ARB_transpose_matrix, 
    GL_ARB_uniform_buffer_object, GL_ARB_vertex_array_bgra, 
    GL_ARB_vertex_array_object, GL_ARB_vertex_attrib_64bit, 
    GL_ARB_vertex_attrib_binding, GL_ARB_vertex_buffer_object, 
    GL_ARB_vertex_program, GL_ARB_vertex_shader, 
    GL_ARB_vertex_type_10f_11f_11f_rev, GL_ARB_vertex_type_2_10_10_10_rev, 
    GL_ARB_viewport_array, GL_ARB_window_pos, GL_ATI_draw_buffers, 
    GL_ATI_texture_float, GL_ATI_texture_mirror_once, 
    GL_EXTX_framebuffer_mixed_formats, GL_EXT_Cg_shader, GL_EXT_abgr, 
    GL_EXT_bgra, GL_EXT_bindable_uniform, GL_EXT_blend_color, 
    GL_EXT_blend_equation_separate, GL_EXT_blend_func_separate, 
    GL_EXT_blend_minmax, GL_EXT_blend_subtract, GL_EXT_compiled_vertex_array, 
    GL_EXT_depth_bounds_test, GL_EXT_direct_state_access, 
    GL_EXT_draw_buffers2, GL_EXT_draw_instanced, GL_EXT_draw_range_elements, 
    GL_EXT_fog_coord, GL_EXT_framebuffer_blit, GL_EXT_framebuffer_multisample, 
    GL_EXT_framebuffer_multisample_blit_scaled, GL_EXT_framebuffer_object, 
    GL_EXT_framebuffer_sRGB, GL_EXT_geometry_shader4, 
    GL_EXT_gpu_program_parameters, GL_EXT_gpu_shader4, 
    GL_EXT_import_sync_object, GL_EXT_memory_object, GL_EXT_memory_object_fd, 
    GL_EXT_multi_draw_arrays, GL_EXT_packed_depth_stencil, 
    GL_EXT_packed_float, GL_EXT_packed_pixels, GL_EXT_pixel_buffer_object, 
    GL_EXT_point_parameters, GL_EXT_polygon_offset_clamp, 
    GL_EXT_provoking_vertex, GL_EXT_rescale_normal, GL_EXT_secondary_color, 
    GL_EXT_semaphore, GL_EXT_semaphore_fd, GL_EXT_separate_shader_objects, 
    GL_EXT_separate_specular_color, GL_EXT_shader_image_load_formatted, 
    GL_EXT_shader_image_load_store, GL_EXT_shader_integer_mix, 
    GL_EXT_shadow_funcs, GL_EXT_stencil_two_side, GL_EXT_stencil_wrap, 
    GL_EXT_texture3D, GL_EXT_texture_array, GL_EXT_texture_buffer_object, 
    GL_EXT_texture_compression_dxt1, GL_EXT_texture_compression_latc, 
    GL_EXT_texture_compression_rgtc, GL_EXT_texture_compression_s3tc, 
    GL_EXT_texture_cube_map, GL_EXT_texture_edge_clamp, 
    GL_EXT_texture_env_add, GL_EXT_texture_env_combine, 
    GL_EXT_texture_env_dot3, GL_EXT_texture_filter_anisotropic, 
    GL_EXT_texture_integer, GL_EXT_texture_lod, GL_EXT_texture_lod_bias, 
    GL_EXT_texture_mirror_clamp, GL_EXT_texture_object, GL_EXT_texture_sRGB, 
    GL_EXT_texture_sRGB_decode, GL_EXT_texture_shared_exponent, 
    GL_EXT_texture_storage, GL_EXT_texture_swizzle, GL_EXT_timer_query, 
    GL_EXT_transform_feedback2, GL_EXT_vertex_array, GL_EXT_vertex_array_bgra, 
    GL_EXT_vertex_attrib_64bit, GL_EXT_window_rectangles, 
    GL_EXT_x11_sync_object, GL_IBM_rasterpos_clip, 
    GL_IBM_texture_mirrored_repeat, GL_KHR_blend_equation_advanced, 
    GL_KHR_blend_equation_advanced_coherent, GL_KHR_context_flush_control, 
    GL_KHR_debug, GL_KHR_no_error, GL_KHR_robust_buffer_access_behavior, 
    GL_KHR_robustness, GL_KTX_buffer_region, GL_NVX_conditional_render, 
    GL_NVX_gpu_memory_info, GL_NVX_nvenc_interop, GL_NV_ES1_1_compatibility, 
    GL_NV_ES3_1_compatibility, GL_NV_alpha_to_coverage_dither_control, 
    GL_NV_bindless_multi_draw_indirect, 
    GL_NV_bindless_multi_draw_indirect_count, GL_NV_bindless_texture, 
    GL_NV_blend_equation_advanced, GL_NV_blend_equation_advanced_coherent, 
    GL_NV_blend_square, GL_NV_command_list, GL_NV_compute_program5, 
    GL_NV_conditional_render, GL_NV_copy_depth_to_color, GL_NV_copy_image, 
    GL_NV_deep_texture3D, GL_NV_depth_buffer_float, GL_NV_depth_clamp, 
    GL_NV_draw_texture, GL_NV_draw_vulkan_image, GL_NV_explicit_multisample, 
    GL_NV_fence, GL_NV_float_buffer, GL_NV_fog_distance, 
    GL_NV_fragment_program, GL_NV_fragment_program2, 
    GL_NV_fragment_program_option, GL_NV_framebuffer_multisample_coverage, 
    GL_NV_geometry_shader4, GL_NV_gpu_program4, GL_NV_gpu_program4_1, 
    GL_NV_gpu_program5, GL_NV_gpu_program5_mem_extended, 
    GL_NV_gpu_program_fp64, GL_NV_gpu_shader5, GL_NV_half_float, 
    GL_NV_internalformat_sample_query, GL_NV_light_max_exponent, 
    GL_NV_multisample_coverage, GL_NV_multisample_filter_hint, 
    GL_NV_occlusion_query, GL_NV_packed_depth_stencil, 
    GL_NV_parameter_buffer_object, GL_NV_parameter_buffer_object2, 
    GL_NV_path_rendering, GL_NV_pixel_data_range, GL_NV_point_sprite, 
    GL_NV_primitive_restart, GL_NV_register_combiners, 
    GL_NV_register_combiners2, GL_NV_robustness_video_memory_purge, 
    GL_NV_shader_atomic_counters, GL_NV_shader_atomic_float, 
    GL_NV_shader_atomic_int64, GL_NV_shader_buffer_load, 
    GL_NV_shader_storage_buffer_object, GL_NV_shader_thread_group, 
    GL_NV_shader_thread_shuffle, GL_NV_texgen_reflection, 
    GL_NV_texture_barrier, GL_NV_texture_compression_vtc, 
    GL_NV_texture_env_combine4, GL_NV_texture_multisample, 
    GL_NV_texture_rectangle, GL_NV_texture_shader, GL_NV_texture_shader2, 
    GL_NV_texture_shader3, GL_NV_transform_feedback, 
    GL_NV_transform_feedback2, GL_NV_uniform_buffer_unified_memory, 
    GL_NV_vdpau_interop, GL_NV_vertex_array_range, GL_NV_vertex_array_range2, 
    GL_NV_vertex_attrib_integer_64bit, GL_NV_vertex_buffer_unified_memory, 
    GL_NV_vertex_program, GL_NV_vertex_program1_1, GL_NV_vertex_program2, 
    GL_NV_vertex_program2_option, GL_NV_vertex_program3, GL_S3_s3tc, 
    GL_SGIS_generate_mipmap, GL_SGIS_texture_lod, GL_SGIX_depth_texture, 
    GL_SGIX_shadow, GL_SUN_slice_accum

OpenGL version string: 4.5.0 NVIDIA 384.90
OpenGL shading language version string: 4.50 NVIDIA
OpenGL context flags: (none)
OpenGL profile mask: (none)
OpenGL extensions:
    GL_AMD_multi_draw_indirect, GL_AMD_seamless_cubemap_per_texture, 
    GL_ARB_ES2_compatibility, GL_ARB_ES3_1_compatibility, 
    GL_ARB_ES3_2_compatibility, GL_ARB_ES3_compatibility, 
    GL_ARB_arrays_of_arrays, GL_ARB_base_instance, GL_ARB_bindless_texture, 
    GL_ARB_blend_func_extended, GL_ARB_buffer_storage, GL_ARB_cl_event, 
    GL_ARB_clear_buffer_object, GL_ARB_clear_texture, GL_ARB_clip_control, 
    GL_ARB_color_buffer_float, GL_ARB_compatibility, 
    GL_ARB_compressed_texture_pixel_storage, GL_ARB_compute_shader, 
    GL_ARB_compute_variable_group_size, GL_ARB_conditional_render_inverted, 
    GL_ARB_conservative_depth, GL_ARB_copy_buffer, GL_ARB_copy_image, 
    GL_ARB_cull_distance, GL_ARB_debug_output, GL_ARB_depth_buffer_float, 
    GL_ARB_depth_clamp, GL_ARB_depth_texture, GL_ARB_derivative_control, 
    GL_ARB_direct_state_access, GL_ARB_draw_buffers, 
    GL_ARB_draw_buffers_blend, GL_ARB_draw_elements_base_vertex, 
    GL_ARB_draw_indirect, GL_ARB_draw_instanced, GL_ARB_enhanced_layouts, 
    GL_ARB_explicit_attrib_location, GL_ARB_explicit_uniform_location, 
    GL_ARB_fragment_coord_conventions, GL_ARB_fragment_layer_viewport, 
    GL_ARB_fragment_program, GL_ARB_fragment_program_shadow, 
    GL_ARB_fragment_shader, GL_ARB_framebuffer_no_attachments, 
    GL_ARB_framebuffer_object, GL_ARB_framebuffer_sRGB, 
    GL_ARB_geometry_shader4, GL_ARB_get_program_binary, 
    GL_ARB_get_texture_sub_image, GL_ARB_gl_spirv, GL_ARB_gpu_shader5, 
    GL_ARB_gpu_shader_fp64, GL_ARB_gpu_shader_int64, GL_ARB_half_float_pixel, 
    GL_ARB_half_float_vertex, GL_ARB_imaging, GL_ARB_indirect_parameters, 
    GL_ARB_instanced_arrays, GL_ARB_internalformat_query, 
    GL_ARB_internalformat_query2, GL_ARB_invalidate_subdata, 
    GL_ARB_map_buffer_alignment, GL_ARB_map_buffer_range, GL_ARB_multi_bind, 
    GL_ARB_multi_draw_indirect, GL_ARB_multisample, GL_ARB_multitexture, 
    GL_ARB_occlusion_query, GL_ARB_occlusion_query2, 
    GL_ARB_parallel_shader_compile, GL_ARB_pipeline_statistics_query, 
    GL_ARB_pixel_buffer_object, GL_ARB_point_parameters, GL_ARB_point_sprite, 
    GL_ARB_program_interface_query, GL_ARB_provoking_vertex, 
    GL_ARB_query_buffer_object, GL_ARB_robust_buffer_access_behavior, 
    GL_ARB_robustness, GL_ARB_sample_shading, GL_ARB_sampler_objects, 
    GL_ARB_seamless_cube_map, GL_ARB_seamless_cubemap_per_texture, 
    GL_ARB_separate_shader_objects, GL_ARB_shader_atomic_counter_ops, 
    GL_ARB_shader_atomic_counters, GL_ARB_shader_ballot, 
    GL_ARB_shader_bit_encoding, GL_ARB_shader_clock, 
    GL_ARB_shader_draw_parameters, GL_ARB_shader_group_vote, 
    GL_ARB_shader_image_load_store, GL_ARB_shader_image_size, 
    GL_ARB_shader_objects, GL_ARB_shader_precision, 
    GL_ARB_shader_storage_buffer_object, GL_ARB_shader_subroutine, 
    GL_ARB_shader_texture_image_samples, GL_ARB_shader_texture_lod, 
    GL_ARB_shading_language_100, GL_ARB_shading_language_420pack, 
    GL_ARB_shading_language_include, GL_ARB_shading_language_packing, 
    GL_ARB_shadow, GL_ARB_sparse_buffer, GL_ARB_sparse_texture, 
    GL_ARB_stencil_texturing, GL_ARB_sync, GL_ARB_tessellation_shader, 
    GL_ARB_texture_barrier, GL_ARB_texture_border_clamp, 
    GL_ARB_texture_buffer_object, GL_ARB_texture_buffer_object_rgb32, 
    GL_ARB_texture_buffer_range, GL_ARB_texture_compression, 
    GL_ARB_texture_compression_bptc, GL_ARB_texture_compression_rgtc, 
    GL_ARB_texture_cube_map, GL_ARB_texture_cube_map_array, 
    GL_ARB_texture_env_add, GL_ARB_texture_env_combine, 
    GL_ARB_texture_env_crossbar, GL_ARB_texture_env_dot3, 
    GL_ARB_texture_float, GL_ARB_texture_gather, 
    GL_ARB_texture_mirror_clamp_to_edge, GL_ARB_texture_mirrored_repeat, 
    GL_ARB_texture_multisample, GL_ARB_texture_non_power_of_two, 
    GL_ARB_texture_query_levels, GL_ARB_texture_query_lod, 
    GL_ARB_texture_rectangle, GL_ARB_texture_rg, GL_ARB_texture_rgb10_a2ui, 
    GL_ARB_texture_stencil8, GL_ARB_texture_storage, 
    GL_ARB_texture_storage_multisample, GL_ARB_texture_swizzle, 
    GL_ARB_texture_view, GL_ARB_timer_query, GL_ARB_transform_feedback2, 
    GL_ARB_transform_feedback3, GL_ARB_transform_feedback_instanced, 
    GL_ARB_transform_feedback_overflow_query, GL_ARB_transpose_matrix, 
    GL_ARB_uniform_buffer_object, GL_ARB_vertex_array_bgra, 
    GL_ARB_vertex_array_object, GL_ARB_vertex_attrib_64bit, 
    GL_ARB_vertex_attrib_binding, GL_ARB_vertex_buffer_object, 
    GL_ARB_vertex_program, GL_ARB_vertex_shader, 
    GL_ARB_vertex_type_10f_11f_11f_rev, GL_ARB_vertex_type_2_10_10_10_rev, 
    GL_ARB_viewport_array, GL_ARB_window_pos, GL_ATI_draw_buffers, 
    GL_ATI_texture_float, GL_ATI_texture_mirror_once, 
    GL_EXTX_framebuffer_mixed_formats, GL_EXT_Cg_shader, GL_EXT_abgr, 
    GL_EXT_bgra, GL_EXT_bindable_uniform, GL_EXT_blend_color, 
    GL_EXT_blend_equation_separate, GL_EXT_blend_func_separate, 
    GL_EXT_blend_minmax, GL_EXT_blend_subtract, GL_EXT_compiled_vertex_array, 
    GL_EXT_depth_bounds_test, GL_EXT_direct_state_access, 
    GL_EXT_draw_buffers2, GL_EXT_draw_instanced, GL_EXT_draw_range_elements, 
    GL_EXT_fog_coord, GL_EXT_framebuffer_blit, GL_EXT_framebuffer_multisample, 
    GL_EXT_framebuffer_multisample_blit_scaled, GL_EXT_framebuffer_object, 
    GL_EXT_framebuffer_sRGB, GL_EXT_geometry_shader4, 
    GL_EXT_gpu_program_parameters, GL_EXT_gpu_shader4, 
    GL_EXT_import_sync_object, GL_EXT_memory_object, GL_EXT_memory_object_fd, 
    GL_EXT_multi_draw_arrays, GL_EXT_packed_depth_stencil, 
    GL_EXT_packed_float, GL_EXT_packed_pixels, GL_EXT_pixel_buffer_object, 
    GL_EXT_point_parameters, GL_EXT_polygon_offset_clamp, 
    GL_EXT_provoking_vertex, GL_EXT_rescale_normal, GL_EXT_secondary_color, 
    GL_EXT_semaphore, GL_EXT_semaphore_fd, GL_EXT_separate_shader_objects, 
    GL_EXT_separate_specular_color, GL_EXT_shader_image_load_formatted, 
    GL_EXT_shader_image_load_store, GL_EXT_shader_integer_mix, 
    GL_EXT_shadow_funcs, GL_EXT_stencil_two_side, GL_EXT_stencil_wrap, 
    GL_EXT_texture3D, GL_EXT_texture_array, GL_EXT_texture_buffer_object, 
    GL_EXT_texture_compression_dxt1, GL_EXT_texture_compression_latc, 
    GL_EXT_texture_compression_rgtc, GL_EXT_texture_compression_s3tc, 
    GL_EXT_texture_cube_map, GL_EXT_texture_edge_clamp, 
    GL_EXT_texture_env_add, GL_EXT_texture_env_combine, 
    GL_EXT_texture_env_dot3, GL_EXT_texture_filter_anisotropic, 
    GL_EXT_texture_integer, GL_EXT_texture_lod, GL_EXT_texture_lod_bias, 
    GL_EXT_texture_mirror_clamp, GL_EXT_texture_object, GL_EXT_texture_sRGB, 
    GL_EXT_texture_sRGB_decode, GL_EXT_texture_shared_exponent, 
    GL_EXT_texture_storage, GL_EXT_texture_swizzle, GL_EXT_timer_query, 
    GL_EXT_transform_feedback2, GL_EXT_vertex_array, GL_EXT_vertex_array_bgra, 
    GL_EXT_vertex_attrib_64bit, GL_EXT_window_rectangles, 
    GL_EXT_x11_sync_object, GL_IBM_rasterpos_clip, 
    GL_IBM_texture_mirrored_repeat, GL_KHR_blend_equation_advanced, 
    GL_KHR_blend_equation_advanced_coherent, GL_KHR_context_flush_control, 
    GL_KHR_debug, GL_KHR_no_error, GL_KHR_robust_buffer_access_behavior, 
    GL_KHR_robustness, GL_KTX_buffer_region, GL_NVX_conditional_render, 
    GL_NVX_gpu_memory_info, GL_NVX_nvenc_interop, GL_NV_ES1_1_compatibility, 
    GL_NV_ES3_1_compatibility, GL_NV_alpha_to_coverage_dither_control, 
    GL_NV_bindless_multi_draw_indirect, 
    GL_NV_bindless_multi_draw_indirect_count, GL_NV_bindless_texture, 
    GL_NV_blend_equation_advanced, GL_NV_blend_equation_advanced_coherent, 
    GL_NV_blend_square, GL_NV_command_list, GL_NV_compute_program5, 
    GL_NV_conditional_render, GL_NV_copy_depth_to_color, GL_NV_copy_image, 
    GL_NV_deep_texture3D, GL_NV_depth_buffer_float, GL_NV_depth_clamp, 
    GL_NV_draw_texture, GL_NV_draw_vulkan_image, GL_NV_explicit_multisample, 
    GL_NV_fence, GL_NV_float_buffer, GL_NV_fog_distance, 
    GL_NV_fragment_program, GL_NV_fragment_program2, 
    GL_NV_fragment_program_option, GL_NV_framebuffer_multisample_coverage, 
    GL_NV_geometry_shader4, GL_NV_gpu_program4, GL_NV_gpu_program4_1, 
    GL_NV_gpu_program5, GL_NV_gpu_program5_mem_extended, 
    GL_NV_gpu_program_fp64, GL_NV_gpu_shader5, GL_NV_half_float, 
    GL_NV_internalformat_sample_query, GL_NV_light_max_exponent, 
    GL_NV_multisample_coverage, GL_NV_multisample_filter_hint, 
    GL_NV_occlusion_query, GL_NV_packed_depth_stencil, 
    GL_NV_parameter_buffer_object, GL_NV_parameter_buffer_object2, 
    GL_NV_path_rendering, GL_NV_pixel_data_range, GL_NV_point_sprite, 
    GL_NV_primitive_restart, GL_NV_register_combiners, 
    GL_NV_register_combiners2, GL_NV_robustness_video_memory_purge, 
    GL_NV_shader_atomic_counters, GL_NV_shader_atomic_float, 
    GL_NV_shader_atomic_int64, GL_NV_shader_buffer_load, 
    GL_NV_shader_storage_buffer_object, GL_NV_shader_thread_group, 
    GL_NV_shader_thread_shuffle, GL_NV_texgen_reflection, 
    GL_NV_texture_barrier, GL_NV_texture_compression_vtc, 
    GL_NV_texture_env_combine4, GL_NV_texture_multisample, 
    GL_NV_texture_rectangle, GL_NV_texture_shader, GL_NV_texture_shader2, 
    GL_NV_texture_shader3, GL_NV_transform_feedback, 
    GL_NV_transform_feedback2, GL_NV_uniform_buffer_unified_memory, 
    GL_NV_vdpau_interop, GL_NV_vertex_array_range, GL_NV_vertex_array_range2, 
    GL_NV_vertex_attrib_integer_64bit, GL_NV_vertex_buffer_unified_memory, 
    GL_NV_vertex_program, GL_NV_vertex_program1_1, GL_NV_vertex_program2, 
    GL_NV_vertex_program2_option, GL_NV_vertex_program3, GL_S3_s3tc, 
    GL_SGIS_generate_mipmap, GL_SGIS_texture_lod, GL_SGIX_depth_texture, 
    GL_SGIX_shadow, GL_SUN_slice_accum

OpenGL ES profile version string: OpenGL ES 3.2 NVIDIA 384.90
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
OpenGL ES profile extensions:
    GL_ANDROID_extension_pack_es31a, GL_EXT_base_instance, 
    GL_EXT_blend_func_extended, GL_EXT_blend_minmax, GL_EXT_buffer_storage, 
    GL_EXT_clip_cull_distance, GL_EXT_color_buffer_float, 
    GL_EXT_color_buffer_half_float, GL_EXT_compressed_ETC1_RGB8_sub_texture, 
    GL_EXT_copy_image, GL_EXT_debug_label, GL_EXT_discard_framebuffer, 
    GL_EXT_disjoint_timer_query, GL_EXT_draw_buffers_indexed, 
    GL_EXT_draw_elements_base_vertex, GL_EXT_draw_transform_feedback, 
    GL_EXT_float_blend, GL_EXT_frag_depth, GL_EXT_geometry_point_size, 
    GL_EXT_geometry_shader, GL_EXT_gpu_shader5, GL_EXT_map_buffer_range, 
    GL_EXT_memory_object, GL_EXT_memory_object_fd, GL_EXT_multi_draw_indirect, 
    GL_EXT_multisample_compatibility, GL_EXT_occlusion_query_boolean, 
    GL_EXT_polygon_offset_clamp, GL_EXT_primitive_bounding_box, 
    GL_EXT_protected_textures, GL_EXT_render_snorm, GL_EXT_robustness, 
    GL_EXT_sRGB, GL_EXT_sRGB_write_control, GL_EXT_semaphore, 
    GL_EXT_semaphore_fd, GL_EXT_separate_shader_objects, 
    GL_EXT_shader_group_vote, GL_EXT_shader_implicit_conversions, 
    GL_EXT_shader_integer_mix, GL_EXT_shader_io_blocks, 
    GL_EXT_shader_non_constant_global_initializers, GL_EXT_shader_texture_lod, 
    GL_EXT_shadow_samplers, GL_EXT_sparse_texture, 
    GL_EXT_tessellation_point_size, GL_EXT_tessellation_shader, 
    GL_EXT_texture_border_clamp, GL_EXT_texture_buffer, 
    GL_EXT_texture_compression_dxt1, GL_EXT_texture_compression_s3tc, 
    GL_EXT_texture_cube_map_array, GL_EXT_texture_filter_anisotropic, 
    GL_EXT_texture_format_BGRA8888, GL_EXT_texture_norm16, GL_EXT_texture_rg, 
    GL_EXT_texture_sRGB_R8, GL_EXT_texture_sRGB_decode, 
    GL_EXT_texture_storage, GL_EXT_texture_view, GL_EXT_unpack_subimage, 
    GL_EXT_window_rectangles, GL_KHR_blend_equation_advanced, 
    GL_KHR_blend_equation_advanced_coherent, GL_KHR_context_flush_control, 
    GL_KHR_debug, GL_KHR_no_error, GL_KHR_robust_buffer_access_behavior, 
    GL_KHR_robustness, GL_NV_bgr, GL_NV_bindless_texture, 
    GL_NV_blend_equation_advanced, GL_NV_blend_equation_advanced_coherent, 
    GL_NV_conditional_render, GL_NV_copy_buffer, GL_NV_copy_image, 
    GL_NV_draw_buffers, GL_NV_draw_instanced, GL_NV_draw_texture, 
    GL_NV_draw_vulkan_image, GL_NV_explicit_attrib_location, 
    GL_NV_fbo_color_attachments, GL_NV_framebuffer_blit, 
    GL_NV_framebuffer_multisample, GL_NV_generate_mipmap_sRGB, 
    GL_NV_gpu_shader5, GL_NV_image_formats, GL_NV_instanced_arrays, 
    GL_NV_internalformat_sample_query, GL_NV_non_square_matrices, 
    GL_NV_occlusion_query_samples, GL_NV_pack_subimage, GL_NV_packed_float, 
    GL_NV_packed_float_linear, GL_NV_path_rendering, 
    GL_NV_pixel_buffer_object, GL_NV_polygon_mode, GL_NV_read_buffer, 
    GL_NV_read_depth, GL_NV_read_depth_stencil, GL_NV_read_stencil, 
    GL_NV_sRGB_formats, GL_NV_shader_noperspective_interpolation, 
    GL_NV_shadow_samplers_array, GL_NV_shadow_samplers_cube, 
    GL_NV_texture_array, GL_NV_texture_barrier, GL_NV_texture_border_clamp, 
    GL_NV_texture_compression_latc, GL_NV_texture_compression_s3tc, 
    GL_NV_texture_compression_s3tc_update, GL_NV_timer_query, 
    GL_NV_viewport_array, GL_OES_compressed_ETC1_RGB8_texture, 
    GL_OES_copy_image, GL_OES_depth24, GL_OES_depth32, GL_OES_depth_texture, 
    GL_OES_depth_texture_cube_map, GL_OES_draw_buffers_indexed, 
    GL_OES_draw_elements_base_vertex, GL_OES_element_index_uint, 
    GL_OES_fbo_render_mipmap, GL_OES_geometry_point_size, 
    GL_OES_geometry_shader, GL_OES_get_program_binary, GL_OES_gpu_shader5, 
    GL_OES_mapbuffer, GL_OES_packed_depth_stencil, 
    GL_OES_primitive_bounding_box, GL_OES_rgb8_rgba8, GL_OES_sample_shading, 
    GL_OES_sample_variables, GL_OES_shader_image_atomic, 
    GL_OES_shader_io_blocks, GL_OES_shader_multisample_interpolation, 
    GL_OES_standard_derivatives, GL_OES_tessellation_point_size, 
    GL_OES_tessellation_shader, GL_OES_texture_border_clamp, 
    GL_OES_texture_buffer, GL_OES_texture_cube_map_array, 
    GL_OES_texture_float, GL_OES_texture_float_linear, 
    GL_OES_texture_half_float, GL_OES_texture_half_float_linear, 
    GL_OES_texture_npot, GL_OES_texture_stencil8, 
    GL_OES_texture_storage_multisample_2d_array, GL_OES_texture_view, 
    GL_OES_vertex_array_object, GL_OES_vertex_half_float, 
    GL_OES_viewport_array

有什么线索吗?难道我做错了什么?

编辑:

来自 es2_info:

EGL_VERSION: 1.4
EGL_VENDOR: NVIDIA
EGL_CLIENT_APIS: OpenGL_ES OpenGL
GL_VERSION: OpenGL ES 3.2 NVIDIA 384.90
GL_RENDERER: Quadro M2000M/PCIe/SSE2

我删除了扩展。stackoverflow的限制

4

3 回答 3

18

2017 年 11 月 28 日的原始答案:

我认为这是最新版本的 nvidia 软件包中的一个错误:

https://bugs.launchpad.net/ubuntu/+source/nvidia-graphics-drivers-384/+bug/1731968

发布:Ubuntu 16.04.3 LTS

包版本:384.90-0ubuntu0.16.04.2

在最新的驱动程序 384.90-0ubuntu0.16.04.2 中,EGL 初始化现在被破坏,返回的 GL 上下文不一致导致崩溃。我准备了一个最小化的测试用例,展示了最新驱动程序的问题。我还确保它可以在干净安装中与以前的版本 384.90-0ubuntu0.16.04.1 和 384.81-0ubuntu1 一起正常工作。

我的 EGL 程序在我的 prod 服务器上运行良好,我有这些 nvidia 包:

$ dpkg -l | grep nvidia
ii  nvidia-367                            375.66-0ubuntu0.16.04.1                    amd64        Transitional package for nvidia-375
ii  nvidia-375                            384.90-0ubuntu0.16.04.1                    amd64        Transitional package for nvidia-384
ii  nvidia-384                            384.90-0ubuntu0.16.04.1                    amd64        NVIDIA binary driver - version 384.90
rc  nvidia-opencl-icd-375                 384.90-0ubuntu0.16.04.1                    amd64        Transitional package for nvidia-opencl-icd-384
ii  nvidia-opencl-icd-384                 384.90-0ubuntu0.16.04.1                    amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       361.42-0ubuntu1                            amd64        Tool for configuring the NVIDIA graphics driver

apt-get update但是在安装更新(后跟)后它开始在我的测试服务器上失败,apt-get upgrade然后我有这些 nvidia 包:

$ dpkg -l | grep nvidia
ii  nvidia-367                            375.66-0ubuntu0.16.04.1                    amd64        Transitional package for nvidia-375
ii  nvidia-375                            384.90-0ubuntu0.16.04.2                    amd64        Transitional package for nvidia-384
ii  nvidia-384                            384.90-0ubuntu0.16.04.2                    amd64        NVIDIA binary driver - version 384.90
ii  nvidia-opencl-icd-384                 384.90-0ubuntu0.16.04.2                    amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       361.42-0ubuntu1                            amd64        Tool for configuring the NVIDIA graphics driver

我将 nvidia-384 包降级为旧版本:

$ sudo apt-get install nvidia-384=384.90-0ubuntu0.16.04.1

然后重新启动。之后我现在有了这个:

$ dpkg -l | grep nvidia
ii  nvidia-367                            375.66-0ubuntu0.16.04.1                    amd64        Transitional package for nvidia-375
ii  nvidia-375                            384.90-0ubuntu0.16.04.2                    amd64        Transitional package for nvidia-384
ii  nvidia-384                            384.90-0ubuntu0.16.04.1                    amd64        NVIDIA binary driver - version 384.90
ii  nvidia-opencl-icd-384                 384.90-0ubuntu0.16.04.2                    amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       361.42-0ubuntu1                            amd64        Tool for configuring the NVIDIA graphics driver

现在我的 EGL 程序又可以工作了!

2018 年 1 月 15 日更新:

几天前 Ubuntu 发布了 384.111 更新,其中包含对Spectre漏洞之一的修复:

https://bugs.launchpad.net/ubuntu/+source/nvidia-graphics-drivers-384/+bug/1741807

根据http://nvidia.custhelp.com/app/answers/detail/a_id/4611 需要将 NVIDIA 驱动程序更新到 384.111 以修复 NVIDIA 内核模块中的 Spectre 漏洞(以及即将发布的内核安全补丁)。

此更新是自动应用的,并在我的服务器上再次破坏了 EGL,并安装了以下软件包:

$ dpkg -l | grep nvidia
ii  nvidia-367                            375.66-0ubuntu0.16.04.1                    amd64        Transitional package for nvidia-375
ii  nvidia-375                            384.111-0ubuntu0.16.04.1                   amd64        Transitional package for nvidia-384
ii  nvidia-384                            384.111-0ubuntu0.16.04.1                   amd64        NVIDIA binary driver - version 384.111
rc  nvidia-opencl-icd-375                 384.90-0ubuntu0.16.04.1                    amd64        Transitional package for nvidia-opencl-icd-384
ii  nvidia-opencl-icd-384                 384.111-0ubuntu0.16.04.1                   amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       361.42-0ubuntu1                            amd64        Tool for configuring the NVIDIA graphics driver

之前降级到 384.90-0ubuntu0.16.04.1 的修复不再有效:

$ sudo apt-get install nvidia-384=384.90-0ubuntu0.16.04.1
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Version '384.90-0ubuntu0.16.04.1' for 'nvidia-384' was not found

这是因为它在 2018 年 1 月 10 日被取代和删除:

https://launchpad.net/ubuntu/+source/nvidia-graphics-drivers-384/+publishinghistory

我可以通过删除所有 NVIDIA 软件包来解决这个问题:

$ sudo apt-get purge nvidia*

然后手动安装 384.90 驱动:

$ wget https://launchpad.net/ubuntu/+archive/primary/+files/nvidia-graphics-drivers-384_384.90.orig.tar.gz
$ tar xzf nvidia-graphics-drivers-384_384.90.orig.tar.gz
$ cd nvidia-graphics-drivers-384_384.90
$ chmod u+x NVIDIA-Linux-x86_64-384.90-no-compat32.run
$ sudo ./NVIDIA-Linux-x86_64-384.90-no-compat32.run

我的 EGL 程序现在又可以工作了。但是请注意,它现在运行的是未修补的驱动程序,因此这可能不适合您,因为它可能会使您的系统容易受到攻击。

2018 年 1 月 15 日更新(第 2 部分):

只是为了一些额外的背景/参考,我还从这里尝试了 390.12 的测试版,它于 1 月 13 日发布:

https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa

我做了以下事情:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-390

这导致以下已安装软件包列表:

$ dpkg -l | grep nvidia
ii  nvidia-390                            390.12-0ubuntu0~gpu16.04.2                 amd64        NVIDIA binary driver - version 390.12
ii  nvidia-opencl-icd-390                 390.12-0ubuntu0~gpu16.04.2                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       390.12-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

但是 EGL 仍然不起作用。

2018 年 3 月 16 日更新:

390.25 的测试版于 1 月 30 日发布。为了尝试,我再次执行了以下操作:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-390

这导致以下已安装软件包列表:

$ dpkg -l | grep nvidia
ii  nvidia-390                            390.25-0ubuntu0~gpu16.04.1                 amd64        NVIDIA binary driver - version 390.25
ii  nvidia-opencl-icd-390                 390.25-0ubuntu0~gpu16.04.1                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       390.25-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

但是 EGL 仍然不起作用。

2018 年 5 月 17 日更新:

我正在设置一个新服务器,所以又试了一次。

来自https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa的“长期分支版本”现在是 390.48(4 月 18 日发布),“短期分支版本”现在是396.24(5 月 3 日发布)。

我试过 390.48:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-390

这导致了以下已安装软件包的列表:

$ dpkg -l | grep nvidia
ii  nvidia-390                            390.48-0ubuntu0~gpu16.04.3                 amd64        NVIDIA binary driver - version 390.48
ii  nvidia-opencl-icd-390                 390.48-0ubuntu0~gpu16.04.3                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       396.24-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

但是 EGL 仍然不起作用。

我试过 396.24:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-396

这导致了以下已安装软件包的列表:

$ dpkg -l | grep nvidia
ii  nvidia-396                            396.24-0ubuntu0~gpu16.04.1                 amd64        NVIDIA binary driver - version 396.24
ii  nvidia-opencl-icd-396                 396.24-0ubuntu0~gpu16.04.1                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       396.24-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

但是 EGL 仍然不起作用。

手动安装 384.90 驱动程序仍然有效。

我之前一直在 AWS g2.2xlarge 服务器上进行安装。这次我在 Azure NC6 服务器上安装,我必须禁用统一内存,否则安装会失败,即:

$ sudo apt-get purge nvidia*
$ wget https://launchpad.net/ubuntu/+archive/primary/+files/nvidia-graphics-drivers-384_384.90.orig.tar.gz
$ tar xzf nvidia-graphics-drivers-384_384.90.orig.tar.gz
$ cd nvidia-graphics-drivers-384_384.90
$ chmod u+x NVIDIA-Linux-x86_64-384.90-no-compat32.run
$ sudo ./NVIDIA-Linux-x86_64-384.90-no-compat32.run --no-unified-memory

请注意,没有统一内存,CUDA 不可用。

另请注意,如上所述,这仍然是 Spectre 漏洞补丁之前未修补的驱动程序。

2018 年 6 月 25 日更新:

来自https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa的最新版本现在是 390.67(6 月 7 日发布)和 396.24.02(6 月 4 日发布)。

我试过 390.67:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-390
$ sudo reboot
[after reboot]
$ dpkg -l | grep nvidia
ii  nvidia-390                            390.67-0ubuntu0~gpu16.04.1                 amd64        NVIDIA binary driver - version 390.67
ii  nvidia-opencl-icd-390                 390.67-0ubuntu0~gpu16.04.1                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       396.24-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

EGL 仍然没有工作。

我试过 396.24.02:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-396
$ sudo reboot
[after reboot]
$ dpkg -l | grep nvidia
ii  nvidia-396                            396.24.02-0ubuntu0~gpu16.04.1              amd64        NVIDIA binary driver - version 396.24.02
ii  nvidia-opencl-icd-396                 396.24.02-0ubuntu0~gpu16.04.1              amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       396.24-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

EGL 仍然没有工作。

我还尝试了 384.130(2018 年 3 月 29 日发布),这是“旧的长期分支版本”:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-384
$ sudo reboot
[after reboot]
$ dpkg -l | grep nvidia
ii  nvidia-384                            384.130-0ubuntu0.16.04.1                   amd64        NVIDIA binary driver - version 384.130
ii  nvidia-opencl-icd-384                 384.130-0ubuntu0.16.04.1                   amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       396.24-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

EGL 仍然没有工作。

我今天再次尝试这些的原因是 EGL 在重新启动后停止在我的服务器上工作。

手动安装旧的 384.90 驱动程序(之前对我有用,如之前的更新中所述)将失败,并在 /var/log/nvidia-installer.log 中出现以下错误:

/tmp/selfgz3957/NVIDIA-Linux-x86_64-384.90-no-compat32/kernel/nvidia/nv.c: In function ‘nv_start_rc_timer’:
/tmp/selfgz3957/NVIDIA-Linux-x86_64-384.90-no-compat32/kernel/nvidia/nv.c:3206:5: error: implicit declaration of function ‘init_timer’ [-Werror=implicit-function-declaration]
     init_timer(&nvl->rc_timer);
     ^
/tmp/selfgz3957/NVIDIA-Linux-x86_64-384.90-no-compat32/kernel/nvidia/nv.c:3207:28: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
     nvl->rc_timer.function = nvidia_rc_timer;
                            ^
/tmp/selfgz3957/NVIDIA-Linux-x86_64-384.90-no-compat32/kernel/nvidia/nv.c:3208:18: error: ‘struct timer_list’ has no member named ‘data’
     nvl->rc_timer.data = (unsigned long) nvl;

此错误是因为内核 4.15 中更改了 Linux 计时器 API:

https://lwn.net/Articles/735887/

https://github.com/torvalds/linux/commit/513ae785c63c30741e46f43960213d4ae5382ec0#diff-ba8897e9349509c7ca4d37b0704bee9c

我的服务器最近升级到内核 4.15:

$ uname -r
4.15.0-1013-azure

$ grep install /var/log/dpkg.log | grep linux-image
2018-06-18 04:13:09 install linux-image-4.15.0-1013-azure:amd64 <none> 4.15.0-1013.13~16.04.2
2018-06-18 04:13:09 status half-installed linux-image-4.15.0-1013-azure:amd64 4.15.0-1013.13~16.04.2
2018-06-18 04:13:10 status half-installed linux-image-azure:amd64 4.13.0.1018.19
2018-06-18 04:13:10 status half-installed linux-image-azure:amd64 4.13.0.1018.19
2018-06-18 04:13:58 status installed linux-image-4.15.0-1013-azure:amd64 4.15.0-1013.13~16.04.2
2018-06-18 04:13:59 status installed linux-image-azure:amd64 4.15.0.1013.20
2018-06-18 04:14:13 status installed linux-image-4.15.0-1013-azure:amd64 4.15.0-1013.13~16.04.2

为了让旧驱动程序能够工作,我通过使用这些说明更改 grub 配置恢复到内核 4.13 。首先,我检查了可用的 grub 菜单项:

$ grep menuentry /boot/grub/grub.cfg
if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
  menuentry_id_option=""
export menuentry_id_option
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.15.0-1013-azure' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-1013-azure-advanced-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.15.0-1013-azure (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-1013-azure-init-upstart-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.15.0-1013-azure (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.15.0-1013-azure-recovery-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.13.0-1018-azure' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-1018-azure-advanced-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.13.0-1018-azure (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-1018-azure-init-upstart-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.13.0-1018-azure (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-1018-azure-recovery-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.13.0-1016-azure' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-1016-azure-advanced-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.13.0-1016-azure (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-1016-azure-init-upstart-dfb884db-c6ad-4c7a-8075-98cf640a2892' {
    menuentry 'Ubuntu, with Linux 4.13.0-1016-azure (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.13.0-1016-azure-recovery-dfb884db-c6ad-4c7a-8075-98cf640a2892' {

我想要的内核Ubuntu, with Linux 4.13.0-1018-azureAdvanced options for Ubuntu子菜单下。

所以我编辑 /etc/default/grub 将 GRUB_DEFAULT 行更改为:

GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.13.0-1018-azure"

然后:

$ sudo update-grub

然后重启,检查内核:

$ uname -r
4.13.0-1018-azure

然后我能够让 EGL 再次使用旧的 384.90 驱动程序。

2019 年 1 月 8 日更新:

来自https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa的最新版本现在是 410.78(长期分支,2018 年 11 月 26 日发布)和 415.25(2018 年 12 月 20 日发布)。

我试过 410.78:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-410
$ sudo reboot
[after reboot]
$ dpkg -l | grep nvidia
ii  nvidia-410                            410.78-0ubuntu0~gpu16.04.1                 amd64        NVIDIA binary driver - version 410.78
ii  nvidia-opencl-icd-410                 410.78-0ubuntu0~gpu16.04.1                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       415.25-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

EGL 仍然没有工作。

我试过 415.25:

$ sudo apt-get purge nvidia*
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-415
$ sudo reboot
[after reboot]
$ dpkg -l | grep nvidia
ii  nvidia-415                            415.25-0ubuntu0~gpu16.04.1                 amd64        NVIDIA binary driver - version 415.25
ii  nvidia-opencl-icd-415                 415.25-0ubuntu0~gpu16.04.1                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       415.25-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

EGL 仍然没有工作。

对于不同的方法,我还尝试通过 cuda 驱动程序包安装驱动程序,基于https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html中描述的步骤:

$ sudo apt-get purge nvidia*
$ wget https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda-repo-ubuntu1604-10-0-local-10.0.130-410.48_1.0-1_amd64
$ mv cuda-repo-ubuntu1604-10-0-local-10.0.130-410.48_1.0-1_amd64 cuda-repo-ubuntu1604-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1604-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
$ sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
$ sudo apt-get update
$ sudo apt-get install cuda
$ sudo reboot
[after reboot]
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  410.78  Sat Nov 10 22:09:04 CST 2018
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10) 
$ dpkg -l | grep nvidia
ii  nvidia-410                                      410.78-0ubuntu0~gpu16.04.1                 amd64        NVIDIA binary driver - version 410.78
ii  nvidia-410-dev                                  410.78-0ubuntu0~gpu16.04.1                 amd64        NVIDIA binary Xorg driver development files
ii  nvidia-modprobe                                 410.48-0ubuntu1                            amd64        Load the NVIDIA kernel driver and create device files
ii  nvidia-opencl-icd-410                           410.78-0ubuntu0~gpu16.04.1                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                                    0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                                 415.25-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver

EGL 仍然没有工作。

我做了以下操作来删除 cuda 安装:

$ sudo apt-get purge nvidia*
$ sudo apt-get purge cuda*

手动安装旧的 384.90 驱动程序仍然有效。

2018 年 8 月对原始错误报告的评论说:

Matthew Matl (mmatl) 在 2018-08-27 上写道:

这在使用 runfile 方法安装时有效,但对于打包的驱动程序失败。因此,这绝对是 Ubuntu 特有的打包问题。确认也可以使用 390 系列驱动程序在 Fedora 和 Arch 上工作。

为了测试这一点,我尝试从https://www.nvidia.com/object/unix.html手动安装最新的驱动程序 (目前是长寿分支上的 410.93):

$ wget -L http://us.download.nvidia.com/XFree86/Linux-x86_64/410.93/NVIDIA-Linux-x86_64-410.93.run
$ sudo sh NVIDIA-Linux-x86_64-410.93.run
$ sudo reboot
[after reboot]
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  410.93  Thu Dec 20 17:01:16 CST 2018
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)

从原始错误报告运行测试用例现在可以工作了!

$ wget https://gist.githubusercontent.com/funchal/bff0a8d6dae5b3ace1a88c392416b5bc/raw/1427821a2390a30779881ab59c55b5550a468919/main.c
$ gcc main.c -lGL -lEGL
$ ./a.out
egl 1.5
renderer: Tesla K80/PCIe/SSE2
version: 4.6.0 NVIDIA 410.93

当我恢复以前必须禁用的 4.15 内核时,它甚至可以工作。

卸载此手动安装的驱动程序需要执行以下操作:

$ sudo nvidia-uninstall

为了比较,我还尝试使用 runfile 而不是 package 方法手动安装最新的 CUDA 驱动程序(包括版本 410.48 的 nvidia 驱动程序):

$ wget -L https://developer.nvidia.com/compute/cuda/10.0/Prod/local_installers/cuda_10.0.130_410.48_linux
$ mv cuda_10.0.130_410.48_linux cuda_10.0.130_410.48_linux.run
$ sudo sh cuda_10.0.130_410.48_linux.run

Do you accept the previously read EULA?
accept/decline/quit: accept

Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48?
(y)es/(n)o/(q)uit: y

Do you want to install the OpenGL libraries?
(y)es/(n)o/(q)uit [ default is yes ]: y

Do you want to run nvidia-xconfig?
This will update the system X configuration file so that the NVIDIA X driver
is used. The pre-existing X configuration file will be backed up.
This option should not be used on systems that require a custom
X configuration, such as systems with multiple GPU vendors.
(y)es/(n)o/(q)uit [ default is no ]: n

Install the CUDA 10.0 Toolkit?
(y)es/(n)o/(q)uit: n

Install the CUDA 10.0 Samples?
(y)es/(n)o/(q)uit: n

$ sudo reboot
[after reboot]
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  410.48  Thu Sep  6 06:36:33 CDT 2018
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)

这也奏效了。

2019 年 2 月 13 日更新:

我达到了这个答案的 30,000 个字符的限制,并且不得不在单独的答案中继续。

于 2017-11-28T08:32:14.537 回答
8

2019 年 2 月 13 日更新:

我在另一个答案中达到了 30,000 个字符的限制,因此不得不将其作为单独的答案发布。

我遇到了这篇关于Linking OpenGL for Server-Side Rendering 的nvidia 博客文章。

这包括以下内容(强调我的):

17 年前引入经典的 OpenGL 应用程序二进制接口 (ABI) 时,Linux 上唯一广泛采用的窗口和显示管理系统是 X11。OpenGL 上下文管理不是 OpenGL 本身的一部分,因此与 glX API 同义。由于在 Linux 上使用 OpenGL 的唯一方法是通过 glX,因此 OpenGL 和 glX 的函数被捆绑到同一个库 libGL.so 中。

链接 OpenGL 应用程序很简单:您只需要链接 libGL.so。

多年来,情况发生了变化,出现了各种各样的显示管理器。人们希望在与 Wayland 相同的系统上拥有基于 X11 的显示管理器,或者在与软件模拟 OpenGL 相同的系统上使用硬件加速的 OpenGL。这需要在 OpenGL 库和 OpenGL 上下文管理库之间进行更清晰的分离。

GLVND,即适用于 Linux 的 OpenGL Vendor Neutral Dispatch,就是为了满足这一要求而诞生的。

今天要使用 glX 和 OpenGL,您应该链接 libOpenGL.so 和 libGLX.so。第一个包含 OpenGL 符号,后者包含 GLX 符号。如果您想改用 EGL 上下文管理,请链接 libOpenGL.so 和 libEGL.so。

因此,这表明要使用 EGL,我应该链接 libOpenGL.so 而不是 libGL.so。

为了测试这一点,我首先使用包管理器安装了驱动程序:

$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-410
$ sudo reboot
[after reboot]
$ dpkg -l | grep nvidia
ii  nvidia-410                            410.78-0ubuntu0~gpu16.04.1                 amd64        NVIDIA binary driver - version 410.78
ii  nvidia-opencl-icd-410                 410.78-0ubuntu0~gpu16.04.1                 amd64        NVIDIA OpenCL ICD
ii  nvidia-prime                          0.8.2                                      amd64        Tools to enable NVIDIA's Prime
ii  nvidia-settings                       415.27-0ubuntu0~gpu16.04.1                 amd64        Tool for configuring the NVIDIA graphics driver
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  410.78  Sat Nov 10 22:09:04 CST 2018
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.11)

如前所述,在将测试应用程序与 libGL.so 链接时,EGL 因打包驱动程序而失败:

$ wget https://gist.githubusercontent.com/funchal/bff0a8d6dae5b3ace1a88c392416b5bc/raw/1427821a2390a30779881ab59c55b5550a468919/main.c
$ gcc main.c -lGL -lEGL
$ ./a.out
egl 1.5
a.out: main.c:53: main: Assertion `renderer' failed.
Aborted (core dumped)

该机器包含 libGL.so 和 libOpenGL.so:

$ sudo find /usr -name libGL.so
/usr/lib32/nvidia-410/libGL.so
/usr/lib/nvidia-410/libGL.so
/usr/lib/x86_64-linux-gnu/mesa/libGL.so
/usr/lib/x86_64-linux-gnu/libGL.so
$ sudo find /usr -name libOpenGL.so
/usr/lib32/nvidia-410/libOpenGL.so
/usr/lib/nvidia-410/libOpenGL.so
$ sudo find /usr -name libEGL.so
/usr/lib32/nvidia-410/libEGL.so
/usr/lib/nvidia-410/libEGL.so
/usr/lib/x86_64-linux-gnu/mesa-egl/libEGL.so
/usr/lib/x86_64-linux-gnu/libEGL.so

将测试应用程序与 libOpenGL.so 链接有效!

$ wget https://gist.githubusercontent.com/funchal/bff0a8d6dae5b3ace1a88c392416b5bc/raw/1427821a2390a30779881ab59c55b5550a468919/main.c
$ gcc main.c -L/usr/lib/nvidia-410 -lOpenGL -lEGL
$ ./a.out
egl 1.5
renderer: Tesla K80/PCIe/SSE2
version: 4.6.0 NVIDIA 410.78

然后我通过运行文件测试了安装驱动程序:

$ wget -L http://us.download.nvidia.com/XFree86/Linux-x86_64/410.93/NVIDIA-Linux-x86_64-410.93.run
$ sudo sh NVIDIA-Linux-x86_64-410.93.run
$ sudo reboot
[after reboot]
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module  410.93  Thu Dec 20 17:01:16 CST 2018
GCC version:  gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10)

这些是可用的库:

$ sudo find /usr -name libGL.so
/usr/lib32/libGL.so
/usr/lib/x86_64-linux-gnu/libGL.so
$ sudo find /usr -name libOpenGL.so
/usr/lib32/libOpenGL.so
/usr/lib/x86_64-linux-gnu/libOpenGL.so
$ sudo find /usr -name libEGL.so
/usr/lib32/libEGL.so
/usr/lib/x86_64-linux-gnu/libEGL.so

从 1 月 8 日的上一次更新中可以看出,通过运行文件安装驱动程序,EGL 确实可以与 libGL.so 一起使用:

$ wget https://gist.githubusercontent.com/funchal/bff0a8d6dae5b3ace1a88c392416b5bc/raw/1427821a2390a30779881ab59c55b5550a468919/main.c
$ gcc main.c -lGL -lEGL
$ ./a.out
egl 1.5
renderer: Tesla K80/PCIe/SSE2
version: 4.6.0 NVIDIA 410.93

EGL 在链接 libOpenGL.so 时也有效:

$ wget https://gist.githubusercontent.com/funchal/bff0a8d6dae5b3ace1a88c392416b5bc/raw/1427821a2390a30779881ab59c55b5550a468919/main.c
$ gcc main.c -lOpenGL -lEGL
$ ./a.out
egl 1.5
renderer: Tesla K80/PCIe/SSE2
version: 4.6.0 NVIDIA 410.93

我不确定这是否相关,但我注意到运行文件和打包的驱动程序具有链接到 libGL.so 的不同依赖项。运行文件安装的驱动有以下依赖,包括libGLX.so:

$ ldd /usr/lib/x86_64-linux-gnu/libGL.so
    linux-vdso.so.1 =>  (0x00007fff28ce5000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fda5af05000)
    libGLX.so.0 => /usr/lib/x86_64-linux-gnu/libGLX.so.0 (0x00007fda5acd5000)
    libGLdispatch.so.0 => /usr/lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x00007fda5aa02000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fda5a638000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fda5b3b2000)
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fda5a2fe000)
    libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fda5a0ec000)
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fda59eca000)
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fda59cc6000)
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fda59ac0000)

虽然包安装的驱动程序不依赖于 libGLX.so,但具有 libnvidia-tls.so 和 libnvidia-glcore.so 作为依赖项:

$ ldd /usr/lib/nvidia-410/libGL.so
    linux-vdso.so.1 =>  (0x00007fff139dd000)
    libnvidia-tls.so.410.78 => /usr/lib/nvidia-410/tls/libnvidia-tls.so.410.78 (0x00007fed5efef000)
    libnvidia-glcore.so.410.78 => /usr/lib/nvidia-410/libnvidia-glcore.so.410.78 (0x00007fed5d414000)
    libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007fed5d0da000)
    libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007fed5cec8000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fed5cafe000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fed5c8fa000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fed5c5f1000)
    libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007fed5c3cf000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fed5f531000)
    libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007fed5c1cb000)
    libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007fed5bfc5000)

总结这个问题的最终修复:

链接到 libOpenGL.so 而不是 libGL.so!

于 2019-02-13T10:44:00.233 回答
5

#define GLEW_EGL在 gcc 命令行上,以便glew.c使用eglGetProcAddress()而不是glXGetProcAddressARB()

g++ -DGLEW_EGL -DGLEW_STATIC -Iglew-2.1.0/include main.cpp glew-2.1.0/src/glew.c -lGL -lEGL
    ^^^^^^^^^^ this is where the magic happens

使用最新的 GLEW 2.1.0 tarball 构建此代码:

#include <GL/glew.h>
#include <EGL/egl.h>
#include <iostream>

int main(int argc, char **argv)
{
    EGLDisplay display = eglGetDisplay( EGL_DEFAULT_DISPLAY ) ;
    if( display == EGL_NO_DISPLAY )
    {
        std:: cout << "ERROR: EGL could not be initialized"<< std::endl;
        exit(EXIT_FAILURE);
    }

    if( eglInitialize( display, nullptr, nullptr ) != EGL_TRUE )
    {
        std:: cout << "ERROR: Could not start EGL display connection"<< std::endl;
        exit(EXIT_FAILURE);
    }

    EGLConfig config;
    EGLint num_config = 0;
    if( eglChooseConfig( display, nullptr, &config, 1, &num_config ) != EGL_TRUE )
    {
        std:: cout << "ERROR: Configuration selection failed" << std::endl;
        exit(EXIT_FAILURE);
    }
    if( num_config == 0 )
    {
        std:: cout << "ERROR: No configurations" << std::endl;
        exit(EXIT_FAILURE);
    }

    eglBindAPI( EGL_OPENGL_API );
    EGLContext context = eglCreateContext( display, config, EGL_NO_CONTEXT, NULL );
    if( eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, context) != EGL_TRUE )
    {
        std:: cout << "ERROR: Display was not made current one"<< std::endl;
        exit(EXIT_FAILURE);
    }

    GLenum err = glewInit();
    if (GLEW_OK != err)
    {
        std:: cout << "GLEW Error: " << glewGetErrorString(err) << std::endl;
        exit(EXIT_FAILURE);
    }

    std::cout << glGetString( GL_VERSION ) << std::endl;
    std::cout << glGetString( GL_VENDOR ) << std::endl;
    std::cout << glGetString( GL_RENDERER ) << std::endl;

    return 0;
}

...在我的 X11 中的 Debian Stretch 系统上给了我这个:

3.0 Mesa 13.0.6
Intel Open Source Technology Center
Mesa DRI Intel(R) Kabylake GT2 
于 2017-11-24T21:33:37.160 回答