Search code examples
c++openglgleweglwindowless

"Missing GL version" from glewInit() using EGL?


I just try to run this:

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
}

But when running it I have:

GLEW Error: Missing GL version

It looks like my glewInit() fails with the GL context but I don't understand why, because my glewInit() is called after context creation. And there is no error from EGL.

The purpose of this code is to be able to have an Opengl context without any window. This code was working in the past but not since I upgraded my Ubuntu 17.10 with Nvidia 384, working on Quadro K2000M.

Here is my 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

Any clue? Am I doing something wrong?

Edit:

From 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

I removed extensions. Limitation of stackoverflow


Solution

  • ORIGINAL ANSWER 28th Nov 2017:

    I think this is a bug in a recent version of the nvidia package:

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

    Release: Ubuntu 16.04.3 LTS

    Package version: 384.90-0ubuntu0.16.04.2

    In the latest driver 384.90-0ubuntu0.16.04.2, EGL initialisation is now broken and the GL context returned is inconsistent leading to crashes. I have prepared a minimised testcase that showcases the problem with the latest driver. I have also made sure it works fine with both previous versions 384.90-0ubuntu0.16.04.1 and 384.81-0ubuntu1 in a clean install.

    My EGL program works fine for me on my prod server, where I have these nvidia packages:

    $ 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
    

    But it started failing on my test server after installing updates (apt-get update followed by apt-get upgrade), where I then had these nvidia packages:

    $ 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
    

    I downgraded the nvidia-384 package to the older version:

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

    Then rebooted. After that I now have this:

    $ 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
    

    And now my EGL program works again!

    UPDATE 15th Jan 2018:

    A few days ago Ubuntu released the 384.111 update, which contains a fix for one of the Spectre vulnerabilities:

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

    According to http://nvidia.custhelp.com/app/answers/detail/a_id/4611 the NVIDIA driver needs to be updated to 384.111 to fix the Spectre vulnerabilities in the NVIDIA kernel modules (along with the upcoming Kernel security patches).

    This update was auto-applied and again broke EGL on my server, with the following packages installed:

    $ 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
    

    The previous fix to downgrade to 384.90-0ubuntu0.16.04.1 no longer works:

    $ 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
    

    This is because it was superseded and removed on the 10th of Jan 2018:

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

    I was able to work around this by removing all NVIDIA packages:

    $ sudo apt-get purge nvidia*
    

    And then manually installing the 384.90 driver:

    $ 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
    

    My EGL program now worked again. However note that it is now running an unpatched driver, so this may not be suitable for you as it may open your system to vulnerabilities.

    UPDATE 15th Jan 2018 (part 2):

    Just for some extra background / reference, I have also tried the beta of 390.12 from here, which was released on the 13th of Jan:

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

    I did the following:

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

    Which results in the following list of installed packages:

    $ 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
    

    However EGL still doesn't work.

    UPDATE 16th Mar 2018:

    The beta of 390.25 was released on the 30th of Jan. To try that I did the following again:

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

    Which results in the following list of installed packages:

    $ 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
    

    However EGL still doesn't work.

    UPDATE 17th May 2018:

    I was setting up a new server, and so tried this again.

    From https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa the 'long-lived branch release' is now at 390.48 (released 18th April), and the 'short-lived branch release' is now at 396.24 (released 3rd May).

    I tried 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
    

    Which resulted in the following list of installed packages:

    $ 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
    

    However EGL still doesn't work.

    I tried 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
    

    Which resulted in the following list of installed packages:

    $ 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
    

    However EGL still doesn't work.

    Manually installing the 384.90 driver still works.

    I had previously been installing on AWS g2.2xlarge servers. This time I was installing on an Azure NC6 server, and I had to disable unified memory or else the installation would fail, ie:

    $ 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
    

    Note that without unified memory, CUDA is not available.

    Also note as mentioned above, this is still an unpatched driver from before the Spectre vulnerability patches.

    UPDATE 25th June 2018:

    From https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa the latest versions are now 390.67 (released 7th June), and 396.24.02 (released 4th June).

    I tried 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 still didn't work.

    I tried 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 still didn't work.

    I also tried 384.130 (released 29th March 2018), which is the "old long-lived branch release":

    $ 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 still didn't work.

    The reason I tried these again today is that EGL stopped working on my server after a reboot.

    A manual install of the old 384.90 driver (which had worked for me before as described in the earlier updates) would fail with the following errors in /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;
    

    This error was because the Linux timers API was changed in kernel 4.15:

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

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

    And my server had recently upgraded to kernel 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
    

    To allow the old driver to work, I reverted back to kernel 4.13 by using these instructions to change the grub config. First I checked what grub menu items were available:

    $ 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' {
    

    The kernel I wanted was Ubuntu, with Linux 4.13.0-1018-azure under the Advanced options for Ubuntu submenu.

    So I edited /etc/default/grub to change the GRUB_DEFAULT line to:

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

    Then:

    $ sudo update-grub
    

    Then reboot, and check the kernel:

    $ uname -r
    4.13.0-1018-azure
    

    I was then able to get EGL to work again with the old 384.90 driver.

    UPDATE 8th January 2019:

    From https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa the latest versions are now 410.78 (long-lived branch, released 26th November 2018), and 415.25 (released 20th December 2018).

    I tried 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 still didn't work.

    I tried 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 still didn't work.

    For a different approach, I also tried installing the drivers via the cuda drivers package, based on the steps described at 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 still didn't work.

    I did the following to remove the cuda installation:

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

    Manually installing the old 384.90 driver still worked.

    A comment from August 2018 on the original bug report says:

    Matthew Matl (mmatl) wrote on 2018-08-27:

    This works when installing using the runfile method, but fails for the packaged drivers. So it definitely appears to be a packaging issue specific to Ubuntu. Confirmed to work on Fedora and Arch with 390-series drivers as well.

    To test this I tried manually installing the latest driver from https://www.nvidia.com/object/unix.html (currently 410.93 on the long-lived branch):

    $ 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)
    

    Running the test case from the original bug report now worked!

    $ 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
    

    It even worked when I reinstated the 4.15 kernel that I had previously had to disable.

    The following is required to uninstall this manually-installed driver:

    $ sudo nvidia-uninstall
    

    For comparison I also tried a manual install of the latest CUDA driver (which includes version 410.48 of the nvidia driver) using the runfile instead of the package method:

    $ 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)
    

    This also worked.

    UPDATE 13th February 2019:

    I hit the 30,000 character limit for this answer, and had to continue in a separate answer.