diff --git a/CMakeLists.txt b/CMakeLists.txt
index a95ad255d..fc93e954d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,6 +4,14 @@ project(duckstation C CXX)
# Pull in modules.
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMakeModules/")
+# Platform detection.
+if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
+ set(LINUX TRUE)
+ set(SUPPORTS_X11 TRUE)
+endif()
+
+
+# Global options.
if(NOT ANDROID)
option(BUILD_SDL_FRONTEND "Build the SDL frontend" ON)
option(BUILD_QT_FRONTEND "Build the Qt frontend" ON)
@@ -12,6 +20,15 @@ if(NOT ANDROID)
endif()
+# OpenGL context creation methods.
+if(SUPPORTS_X11)
+ option(USE_X11 "Support X11 window system" ON)
+endif()
+if(LINUX OR ANDROID)
+ option(USE_EGL "Support EGL OpenGL context creation" ON)
+endif()
+
+
# Common include/library directories on Windows.
if(WIN32)
set(SDL2_FOUND TRUE)
@@ -40,12 +57,12 @@ if(NOT ANDROID)
endif()
endif()
-if(ANDROID)
+if(USE_EGL)
find_package(EGL REQUIRED)
-else()
- find_package(OpenGL COMPONENTS EGL GLX OpenGL)
endif()
-
+if(USE_X11)
+ find_package(X11 REQUIRED)
+endif()
# Set _DEBUG macro for Debug builds.
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -D_DEBUG")
diff --git a/dep/glad/CMakeLists.txt b/dep/glad/CMakeLists.txt
index 609a244c1..f951c4cec 100644
--- a/dep/glad/CMakeLists.txt
+++ b/dep/glad/CMakeLists.txt
@@ -2,7 +2,25 @@ set(SRCS
src/glad.c
)
-add_library(glad ${SRCS})
+# Linking as a static library breaks on macOS, see https://github.com/libigl/libigl/issues/751
+if(APPLE)
+ add_library(glad OBJECT ${SRCS})
+else()
+ add_library(glad ${SRCS})
+endif()
+
target_include_directories(glad PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include")
target_include_directories(glad INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include")
-target_link_libraries(glad Threads::Threads "${CMAKE_DL_LIBS}")
+target_link_libraries(glad PRIVATE Threads::Threads "${CMAKE_DL_LIBS}")
+
+if(WIN32)
+ target_sources(glad PRIVATE src/glad_wgl.c)
+else()
+ if(USE_EGL)
+ target_sources(glad PRIVATE src/glad_egl.c)
+ target_link_libraries(glad PRIVATE EGL::EGL)
+ endif()
+ if(SUPPORTS_X11)
+ target_sources(glad PRIVATE src/glad_glx.c)
+ endif()
+endif()
diff --git a/dep/glad/glad.vcxproj b/dep/glad/glad.vcxproj
index 9f475f04d..6b624c899 100644
--- a/dep/glad/glad.vcxproj
+++ b/dep/glad/glad.vcxproj
@@ -36,9 +36,11 @@
+
+
diff --git a/dep/glad/glad.vcxproj.filters b/dep/glad/glad.vcxproj.filters
index c383c2404..47587edc7 100644
--- a/dep/glad/glad.vcxproj.filters
+++ b/dep/glad/glad.vcxproj.filters
@@ -2,9 +2,11 @@
+
+
\ No newline at end of file
diff --git a/dep/glad/include/glad_egl.h b/dep/glad/include/glad_egl.h
new file mode 100644
index 000000000..741f0a536
--- /dev/null
+++ b/dep/glad/include/glad_egl.h
@@ -0,0 +1,1619 @@
+/*
+
+ EGL loader generated by glad 0.1.33 on Sun May 3 16:34:53 2020.
+
+ Language/Generator: C/C++
+ Specification: egl
+ APIs: egl=1.5
+ Profile: -
+ Extensions:
+ EGL_ANDROID_GLES_layers,
+ EGL_ANDROID_blob_cache,
+ EGL_ANDROID_create_native_client_buffer,
+ EGL_ANDROID_framebuffer_target,
+ EGL_ANDROID_front_buffer_auto_refresh,
+ EGL_ANDROID_get_frame_timestamps,
+ EGL_ANDROID_get_native_client_buffer,
+ EGL_ANDROID_image_native_buffer,
+ EGL_ANDROID_native_fence_sync,
+ EGL_ANDROID_presentation_time,
+ EGL_ANDROID_recordable,
+ EGL_ANGLE_d3d_share_handle_client_buffer,
+ EGL_ANGLE_device_d3d,
+ EGL_ANGLE_query_surface_pointer,
+ EGL_ANGLE_surface_d3d_texture_2d_share_handle,
+ EGL_ANGLE_window_fixed_size,
+ EGL_ARM_image_format,
+ EGL_ARM_implicit_external_sync,
+ EGL_ARM_pixmap_multisample_discard,
+ EGL_EXT_bind_to_front,
+ EGL_EXT_buffer_age,
+ EGL_EXT_client_extensions,
+ EGL_EXT_client_sync,
+ EGL_EXT_compositor,
+ EGL_EXT_create_context_robustness,
+ EGL_EXT_device_base,
+ EGL_EXT_device_drm,
+ EGL_EXT_device_enumeration,
+ EGL_EXT_device_openwf,
+ EGL_EXT_device_query,
+ EGL_EXT_gl_colorspace_bt2020_linear,
+ EGL_EXT_gl_colorspace_bt2020_pq,
+ EGL_EXT_gl_colorspace_display_p3,
+ EGL_EXT_gl_colorspace_display_p3_linear,
+ EGL_EXT_gl_colorspace_display_p3_passthrough,
+ EGL_EXT_gl_colorspace_scrgb,
+ EGL_EXT_gl_colorspace_scrgb_linear,
+ EGL_EXT_image_dma_buf_import,
+ EGL_EXT_image_dma_buf_import_modifiers,
+ EGL_EXT_image_gl_colorspace,
+ EGL_EXT_image_implicit_sync_control,
+ EGL_EXT_multiview_window,
+ EGL_EXT_output_base,
+ EGL_EXT_output_drm,
+ EGL_EXT_output_openwf,
+ EGL_EXT_pixel_format_float,
+ EGL_EXT_platform_base,
+ EGL_EXT_platform_device,
+ EGL_EXT_platform_wayland,
+ EGL_EXT_platform_x11,
+ EGL_EXT_protected_content,
+ EGL_EXT_protected_surface,
+ EGL_EXT_stream_consumer_egloutput,
+ EGL_EXT_surface_CTA861_3_metadata,
+ EGL_EXT_surface_SMPTE2086_metadata,
+ EGL_EXT_swap_buffers_with_damage,
+ EGL_EXT_sync_reuse,
+ EGL_EXT_yuv_surface,
+ EGL_HI_clientpixmap,
+ EGL_HI_colorformats,
+ EGL_IMG_context_priority,
+ EGL_IMG_image_plane_attribs,
+ EGL_KHR_cl_event,
+ EGL_KHR_cl_event2,
+ EGL_KHR_client_get_all_proc_addresses,
+ EGL_KHR_config_attribs,
+ EGL_KHR_context_flush_control,
+ EGL_KHR_create_context,
+ EGL_KHR_create_context_no_error,
+ EGL_KHR_debug,
+ EGL_KHR_display_reference,
+ EGL_KHR_fence_sync,
+ EGL_KHR_get_all_proc_addresses,
+ EGL_KHR_gl_colorspace,
+ EGL_KHR_gl_renderbuffer_image,
+ EGL_KHR_gl_texture_2D_image,
+ EGL_KHR_gl_texture_3D_image,
+ EGL_KHR_gl_texture_cubemap_image,
+ EGL_KHR_image,
+ EGL_KHR_image_base,
+ EGL_KHR_image_pixmap,
+ EGL_KHR_lock_surface,
+ EGL_KHR_lock_surface2,
+ EGL_KHR_lock_surface3,
+ EGL_KHR_mutable_render_buffer,
+ EGL_KHR_no_config_context,
+ EGL_KHR_partial_update,
+ EGL_KHR_platform_android,
+ EGL_KHR_platform_gbm,
+ EGL_KHR_platform_wayland,
+ EGL_KHR_platform_x11,
+ EGL_KHR_reusable_sync,
+ EGL_KHR_stream,
+ EGL_KHR_stream_attrib,
+ EGL_KHR_stream_consumer_gltexture,
+ EGL_KHR_stream_cross_process_fd,
+ EGL_KHR_stream_fifo,
+ EGL_KHR_stream_producer_aldatalocator,
+ EGL_KHR_stream_producer_eglsurface,
+ EGL_KHR_surfaceless_context,
+ EGL_KHR_swap_buffers_with_damage,
+ EGL_KHR_vg_parent_image,
+ EGL_KHR_wait_sync,
+ EGL_MESA_drm_image,
+ EGL_MESA_image_dma_buf_export,
+ EGL_MESA_platform_gbm,
+ EGL_MESA_platform_surfaceless,
+ EGL_MESA_query_driver,
+ EGL_NOK_swap_region,
+ EGL_NOK_swap_region2,
+ EGL_NOK_texture_from_pixmap,
+ EGL_NV_3dvision_surface,
+ EGL_NV_context_priority_realtime,
+ EGL_NV_coverage_sample,
+ EGL_NV_coverage_sample_resolve,
+ EGL_NV_cuda_event,
+ EGL_NV_depth_nonlinear,
+ EGL_NV_device_cuda,
+ EGL_NV_native_query,
+ EGL_NV_post_convert_rounding,
+ EGL_NV_post_sub_buffer,
+ EGL_NV_quadruple_buffer,
+ EGL_NV_robustness_video_memory_purge,
+ EGL_NV_stream_consumer_gltexture_yuv,
+ EGL_NV_stream_cross_display,
+ EGL_NV_stream_cross_object,
+ EGL_NV_stream_cross_partition,
+ EGL_NV_stream_cross_process,
+ EGL_NV_stream_cross_system,
+ EGL_NV_stream_dma,
+ EGL_NV_stream_fifo_next,
+ EGL_NV_stream_fifo_synchronous,
+ EGL_NV_stream_flush,
+ EGL_NV_stream_frame_limits,
+ EGL_NV_stream_metadata,
+ EGL_NV_stream_origin,
+ EGL_NV_stream_remote,
+ EGL_NV_stream_reset,
+ EGL_NV_stream_socket,
+ EGL_NV_stream_socket_inet,
+ EGL_NV_stream_socket_unix,
+ EGL_NV_stream_sync,
+ EGL_NV_sync,
+ EGL_NV_system_time,
+ EGL_NV_triple_buffer,
+ EGL_TIZEN_image_native_buffer,
+ EGL_TIZEN_image_native_surface,
+ EGL_WL_bind_wayland_display,
+ EGL_WL_create_wayland_buffer_from_image
+ Loader: True
+ Local files: False
+ Omit khrplatform: False
+ Reproducible: False
+
+ Commandline:
+ --api="egl=1.5" --generator="c" --spec="egl" --extensions="EGL_ANDROID_GLES_layers,EGL_ANDROID_blob_cache,EGL_ANDROID_create_native_client_buffer,EGL_ANDROID_framebuffer_target,EGL_ANDROID_front_buffer_auto_refresh,EGL_ANDROID_get_frame_timestamps,EGL_ANDROID_get_native_client_buffer,EGL_ANDROID_image_native_buffer,EGL_ANDROID_native_fence_sync,EGL_ANDROID_presentation_time,EGL_ANDROID_recordable,EGL_ANGLE_d3d_share_handle_client_buffer,EGL_ANGLE_device_d3d,EGL_ANGLE_query_surface_pointer,EGL_ANGLE_surface_d3d_texture_2d_share_handle,EGL_ANGLE_window_fixed_size,EGL_ARM_image_format,EGL_ARM_implicit_external_sync,EGL_ARM_pixmap_multisample_discard,EGL_EXT_bind_to_front,EGL_EXT_buffer_age,EGL_EXT_client_extensions,EGL_EXT_client_sync,EGL_EXT_compositor,EGL_EXT_create_context_robustness,EGL_EXT_device_base,EGL_EXT_device_drm,EGL_EXT_device_enumeration,EGL_EXT_device_openwf,EGL_EXT_device_query,EGL_EXT_gl_colorspace_bt2020_linear,EGL_EXT_gl_colorspace_bt2020_pq,EGL_EXT_gl_colorspace_display_p3,EGL_EXT_gl_colorspace_display_p3_linear,EGL_EXT_gl_colorspace_display_p3_passthrough,EGL_EXT_gl_colorspace_scrgb,EGL_EXT_gl_colorspace_scrgb_linear,EGL_EXT_image_dma_buf_import,EGL_EXT_image_dma_buf_import_modifiers,EGL_EXT_image_gl_colorspace,EGL_EXT_image_implicit_sync_control,EGL_EXT_multiview_window,EGL_EXT_output_base,EGL_EXT_output_drm,EGL_EXT_output_openwf,EGL_EXT_pixel_format_float,EGL_EXT_platform_base,EGL_EXT_platform_device,EGL_EXT_platform_wayland,EGL_EXT_platform_x11,EGL_EXT_protected_content,EGL_EXT_protected_surface,EGL_EXT_stream_consumer_egloutput,EGL_EXT_surface_CTA861_3_metadata,EGL_EXT_surface_SMPTE2086_metadata,EGL_EXT_swap_buffers_with_damage,EGL_EXT_sync_reuse,EGL_EXT_yuv_surface,EGL_HI_clientpixmap,EGL_HI_colorformats,EGL_IMG_context_priority,EGL_IMG_image_plane_attribs,EGL_KHR_cl_event,EGL_KHR_cl_event2,EGL_KHR_client_get_all_proc_addresses,EGL_KHR_config_attribs,EGL_KHR_context_flush_control,EGL_KHR_create_context,EGL_KHR_create_context_no_error,EGL_KHR_debug,EGL_KHR_display_reference,EGL_KHR_fence_sync,EGL_KHR_get_all_proc_addresses,EGL_KHR_gl_colorspace,EGL_KHR_gl_renderbuffer_image,EGL_KHR_gl_texture_2D_image,EGL_KHR_gl_texture_3D_image,EGL_KHR_gl_texture_cubemap_image,EGL_KHR_image,EGL_KHR_image_base,EGL_KHR_image_pixmap,EGL_KHR_lock_surface,EGL_KHR_lock_surface2,EGL_KHR_lock_surface3,EGL_KHR_mutable_render_buffer,EGL_KHR_no_config_context,EGL_KHR_partial_update,EGL_KHR_platform_android,EGL_KHR_platform_gbm,EGL_KHR_platform_wayland,EGL_KHR_platform_x11,EGL_KHR_reusable_sync,EGL_KHR_stream,EGL_KHR_stream_attrib,EGL_KHR_stream_consumer_gltexture,EGL_KHR_stream_cross_process_fd,EGL_KHR_stream_fifo,EGL_KHR_stream_producer_aldatalocator,EGL_KHR_stream_producer_eglsurface,EGL_KHR_surfaceless_context,EGL_KHR_swap_buffers_with_damage,EGL_KHR_vg_parent_image,EGL_KHR_wait_sync,EGL_MESA_drm_image,EGL_MESA_image_dma_buf_export,EGL_MESA_platform_gbm,EGL_MESA_platform_surfaceless,EGL_MESA_query_driver,EGL_NOK_swap_region,EGL_NOK_swap_region2,EGL_NOK_texture_from_pixmap,EGL_NV_3dvision_surface,EGL_NV_context_priority_realtime,EGL_NV_coverage_sample,EGL_NV_coverage_sample_resolve,EGL_NV_cuda_event,EGL_NV_depth_nonlinear,EGL_NV_device_cuda,EGL_NV_native_query,EGL_NV_post_convert_rounding,EGL_NV_post_sub_buffer,EGL_NV_quadruple_buffer,EGL_NV_robustness_video_memory_purge,EGL_NV_stream_consumer_gltexture_yuv,EGL_NV_stream_cross_display,EGL_NV_stream_cross_object,EGL_NV_stream_cross_partition,EGL_NV_stream_cross_process,EGL_NV_stream_cross_system,EGL_NV_stream_dma,EGL_NV_stream_fifo_next,EGL_NV_stream_fifo_synchronous,EGL_NV_stream_flush,EGL_NV_stream_frame_limits,EGL_NV_stream_metadata,EGL_NV_stream_origin,EGL_NV_stream_remote,EGL_NV_stream_reset,EGL_NV_stream_socket,EGL_NV_stream_socket_inet,EGL_NV_stream_socket_unix,EGL_NV_stream_sync,EGL_NV_sync,EGL_NV_system_time,EGL_NV_triple_buffer,EGL_TIZEN_image_native_buffer,EGL_TIZEN_image_native_surface,EGL_WL_bind_wayland_display,EGL_WL_create_wayland_buffer_from_image"
+ Online:
+ Too many extensions
+*/
+
+
+#ifndef __glad_egl_h_
+
+#ifdef __egl_h_
+#error EGL header already included, remove this include, glad already provides it
+#endif
+
+#define __glad_egl_h_
+#define __egl_h_
+
+#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
+#define APIENTRY __stdcall
+#endif
+
+#ifndef APIENTRY
+#define APIENTRY
+#endif
+#ifndef APIENTRYP
+#define APIENTRYP APIENTRY *
+#endif
+#ifndef GLAPI
+#define GLAPI extern
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void* (* GLADloadproc)(const char *name);
+
+GLAPI int gladLoadEGL(void);
+GLAPI int gladLoadEGLLoader(GLADloadproc);
+
+#include
+#include
+struct AHardwareBuffer;
+struct wl_buffer;
+struct wl_display;
+struct wl_resource;
+typedef unsigned int EGLBoolean;
+typedef unsigned int EGLenum;
+typedef intptr_t EGLAttribKHR;
+typedef intptr_t EGLAttrib;
+typedef void *EGLClientBuffer;
+typedef void *EGLConfig;
+typedef void *EGLContext;
+typedef void *EGLDeviceEXT;
+typedef void *EGLDisplay;
+typedef void *EGLImage;
+typedef void *EGLImageKHR;
+typedef void *EGLLabelKHR;
+typedef void *EGLObjectKHR;
+typedef void *EGLOutputLayerEXT;
+typedef void *EGLOutputPortEXT;
+typedef void *EGLStreamKHR;
+typedef void *EGLSurface;
+typedef void *EGLSync;
+typedef void *EGLSyncKHR;
+typedef void *EGLSyncNV;
+typedef void (*__eglMustCastToProperFunctionPointerType)(void);
+typedef khronos_utime_nanoseconds_t EGLTimeKHR;
+typedef khronos_utime_nanoseconds_t EGLTime;
+typedef khronos_utime_nanoseconds_t EGLTimeNV;
+typedef khronos_utime_nanoseconds_t EGLuint64NV;
+typedef khronos_uint64_t EGLuint64KHR;
+typedef khronos_stime_nanoseconds_t EGLnsecsANDROID;
+typedef int EGLNativeFileDescriptorKHR;
+typedef khronos_ssize_t EGLsizeiANDROID;
+typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize);
+typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize);
+struct EGLClientPixmapHI {
+ void *pData;
+ EGLint iWidth;
+ EGLint iHeight;
+ EGLint iStride;
+};
+typedef void (APIENTRY *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message);
+#define PFNEGLBINDWAYLANDDISPLAYWL PFNEGLBINDWAYLANDDISPLAYWLPROC
+#define PFNEGLUNBINDWAYLANDDISPLAYWL PFNEGLUNBINDWAYLANDDISPLAYWLPROC
+#define PFNEGLQUERYWAYLANDBUFFERWL PFNEGLQUERYWAYLANDBUFFERWLPROC
+#define PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWL PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC
+#define EGL_ALPHA_SIZE 0x3021
+#define EGL_BAD_ACCESS 0x3002
+#define EGL_BAD_ALLOC 0x3003
+#define EGL_BAD_ATTRIBUTE 0x3004
+#define EGL_BAD_CONFIG 0x3005
+#define EGL_BAD_CONTEXT 0x3006
+#define EGL_BAD_CURRENT_SURFACE 0x3007
+#define EGL_BAD_DISPLAY 0x3008
+#define EGL_BAD_MATCH 0x3009
+#define EGL_BAD_NATIVE_PIXMAP 0x300A
+#define EGL_BAD_NATIVE_WINDOW 0x300B
+#define EGL_BAD_PARAMETER 0x300C
+#define EGL_BAD_SURFACE 0x300D
+#define EGL_BLUE_SIZE 0x3022
+#define EGL_BUFFER_SIZE 0x3020
+#define EGL_CONFIG_CAVEAT 0x3027
+#define EGL_CONFIG_ID 0x3028
+#define EGL_CORE_NATIVE_ENGINE 0x305B
+#define EGL_DEPTH_SIZE 0x3025
+#define EGL_DONT_CARE EGL_CAST(EGLint,-1)
+#define EGL_DRAW 0x3059
+#define EGL_EXTENSIONS 0x3055
+#define EGL_FALSE 0
+#define EGL_GREEN_SIZE 0x3023
+#define EGL_HEIGHT 0x3056
+#define EGL_LARGEST_PBUFFER 0x3058
+#define EGL_LEVEL 0x3029
+#define EGL_MAX_PBUFFER_HEIGHT 0x302A
+#define EGL_MAX_PBUFFER_PIXELS 0x302B
+#define EGL_MAX_PBUFFER_WIDTH 0x302C
+#define EGL_NATIVE_RENDERABLE 0x302D
+#define EGL_NATIVE_VISUAL_ID 0x302E
+#define EGL_NATIVE_VISUAL_TYPE 0x302F
+#define EGL_NONE 0x3038
+#define EGL_NON_CONFORMANT_CONFIG 0x3051
+#define EGL_NOT_INITIALIZED 0x3001
+#define EGL_NO_CONTEXT EGL_CAST(EGLContext,0)
+#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0)
+#define EGL_NO_SURFACE EGL_CAST(EGLSurface,0)
+#define EGL_PBUFFER_BIT 0x0001
+#define EGL_PIXMAP_BIT 0x0002
+#define EGL_READ 0x305A
+#define EGL_RED_SIZE 0x3024
+#define EGL_SAMPLES 0x3031
+#define EGL_SAMPLE_BUFFERS 0x3032
+#define EGL_SLOW_CONFIG 0x3050
+#define EGL_STENCIL_SIZE 0x3026
+#define EGL_SUCCESS 0x3000
+#define EGL_SURFACE_TYPE 0x3033
+#define EGL_TRANSPARENT_BLUE_VALUE 0x3035
+#define EGL_TRANSPARENT_GREEN_VALUE 0x3036
+#define EGL_TRANSPARENT_RED_VALUE 0x3037
+#define EGL_TRANSPARENT_RGB 0x3052
+#define EGL_TRANSPARENT_TYPE 0x3034
+#define EGL_TRUE 1
+#define EGL_VENDOR 0x3053
+#define EGL_VERSION 0x3054
+#define EGL_WIDTH 0x3057
+#define EGL_WINDOW_BIT 0x0004
+#define EGL_BACK_BUFFER 0x3084
+#define EGL_BIND_TO_TEXTURE_RGB 0x3039
+#define EGL_BIND_TO_TEXTURE_RGBA 0x303A
+#define EGL_CONTEXT_LOST 0x300E
+#define EGL_MIN_SWAP_INTERVAL 0x303B
+#define EGL_MAX_SWAP_INTERVAL 0x303C
+#define EGL_MIPMAP_TEXTURE 0x3082
+#define EGL_MIPMAP_LEVEL 0x3083
+#define EGL_NO_TEXTURE 0x305C
+#define EGL_TEXTURE_2D 0x305F
+#define EGL_TEXTURE_FORMAT 0x3080
+#define EGL_TEXTURE_RGB 0x305D
+#define EGL_TEXTURE_RGBA 0x305E
+#define EGL_TEXTURE_TARGET 0x3081
+#define EGL_ALPHA_FORMAT 0x3088
+#define EGL_ALPHA_FORMAT_NONPRE 0x308B
+#define EGL_ALPHA_FORMAT_PRE 0x308C
+#define EGL_ALPHA_MASK_SIZE 0x303E
+#define EGL_BUFFER_PRESERVED 0x3094
+#define EGL_BUFFER_DESTROYED 0x3095
+#define EGL_CLIENT_APIS 0x308D
+#define EGL_COLORSPACE 0x3087
+#define EGL_COLORSPACE_sRGB 0x3089
+#define EGL_COLORSPACE_LINEAR 0x308A
+#define EGL_COLOR_BUFFER_TYPE 0x303F
+#define EGL_CONTEXT_CLIENT_TYPE 0x3097
+#define EGL_DISPLAY_SCALING 10000
+#define EGL_HORIZONTAL_RESOLUTION 0x3090
+#define EGL_LUMINANCE_BUFFER 0x308F
+#define EGL_LUMINANCE_SIZE 0x303D
+#define EGL_OPENGL_ES_BIT 0x0001
+#define EGL_OPENVG_BIT 0x0002
+#define EGL_OPENGL_ES_API 0x30A0
+#define EGL_OPENVG_API 0x30A1
+#define EGL_OPENVG_IMAGE 0x3096
+#define EGL_PIXEL_ASPECT_RATIO 0x3092
+#define EGL_RENDERABLE_TYPE 0x3040
+#define EGL_RENDER_BUFFER 0x3086
+#define EGL_RGB_BUFFER 0x308E
+#define EGL_SINGLE_BUFFER 0x3085
+#define EGL_SWAP_BEHAVIOR 0x3093
+#define EGL_UNKNOWN EGL_CAST(EGLint,-1)
+#define EGL_VERTICAL_RESOLUTION 0x3091
+#define EGL_CONFORMANT 0x3042
+#define EGL_CONTEXT_CLIENT_VERSION 0x3098
+#define EGL_MATCH_NATIVE_PIXMAP 0x3041
+#define EGL_OPENGL_ES2_BIT 0x0004
+#define EGL_VG_ALPHA_FORMAT 0x3088
+#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B
+#define EGL_VG_ALPHA_FORMAT_PRE 0x308C
+#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040
+#define EGL_VG_COLORSPACE 0x3087
+#define EGL_VG_COLORSPACE_sRGB 0x3089
+#define EGL_VG_COLORSPACE_LINEAR 0x308A
+#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020
+#define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType,0)
+#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200
+#define EGL_MULTISAMPLE_RESOLVE 0x3099
+#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A
+#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B
+#define EGL_OPENGL_API 0x30A2
+#define EGL_OPENGL_BIT 0x0008
+#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400
+#define EGL_CONTEXT_MAJOR_VERSION 0x3098
+#define EGL_CONTEXT_MINOR_VERSION 0x30FB
+#define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD
+#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD
+#define EGL_NO_RESET_NOTIFICATION 0x31BE
+#define EGL_LOSE_CONTEXT_ON_RESET 0x31BF
+#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001
+#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002
+#define EGL_CONTEXT_OPENGL_DEBUG 0x31B0
+#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1
+#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2
+#define EGL_OPENGL_ES3_BIT 0x00000040
+#define EGL_CL_EVENT_HANDLE 0x309C
+#define EGL_SYNC_CL_EVENT 0x30FE
+#define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF
+#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0
+#define EGL_SYNC_TYPE 0x30F7
+#define EGL_SYNC_STATUS 0x30F1
+#define EGL_SYNC_CONDITION 0x30F8
+#define EGL_SIGNALED 0x30F2
+#define EGL_UNSIGNALED 0x30F3
+#define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001
+#define EGL_FOREVER 0xFFFFFFFFFFFFFFFF
+#define EGL_TIMEOUT_EXPIRED 0x30F5
+#define EGL_CONDITION_SATISFIED 0x30F6
+#define EGL_NO_SYNC EGL_CAST(EGLSync,0)
+#define EGL_SYNC_FENCE 0x30F9
+#define EGL_GL_COLORSPACE 0x309D
+#define EGL_GL_COLORSPACE_SRGB 0x3089
+#define EGL_GL_COLORSPACE_LINEAR 0x308A
+#define EGL_GL_RENDERBUFFER 0x30B9
+#define EGL_GL_TEXTURE_2D 0x30B1
+#define EGL_GL_TEXTURE_LEVEL 0x30BC
+#define EGL_GL_TEXTURE_3D 0x30B2
+#define EGL_GL_TEXTURE_ZOFFSET 0x30BD
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8
+#define EGL_IMAGE_PRESERVED 0x30D2
+#define EGL_NO_IMAGE EGL_CAST(EGLImage,0)
+EGLBoolean eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
+EGLBoolean eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
+EGLContext eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
+EGLSurface eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
+EGLSurface eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list);
+EGLSurface eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list);
+EGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx);
+EGLBoolean eglDestroySurface(EGLDisplay dpy, EGLSurface surface);
+EGLBoolean eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
+EGLBoolean eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
+EGLDisplay eglGetCurrentDisplay(void);
+EGLSurface eglGetCurrentSurface(EGLint readdraw);
+EGLDisplay eglGetDisplay(EGLNativeDisplayType display_id);
+EGLint eglGetError(void);
+__eglMustCastToProperFunctionPointerType eglGetProcAddress(const char *procname);
+EGLBoolean eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor);
+EGLBoolean eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
+EGLBoolean eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
+const char *eglQueryString(EGLDisplay dpy, EGLint name);
+EGLBoolean eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
+EGLBoolean eglSwapBuffers(EGLDisplay dpy, EGLSurface surface);
+EGLBoolean eglTerminate(EGLDisplay dpy);
+EGLBoolean eglWaitGL(void);
+EGLBoolean eglWaitNative(EGLint engine);
+EGLBoolean eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
+EGLBoolean eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
+EGLBoolean eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
+EGLBoolean eglSwapInterval(EGLDisplay dpy, EGLint interval);
+EGLBoolean eglBindAPI(EGLenum api);
+EGLenum eglQueryAPI(void);
+EGLSurface eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);
+EGLBoolean eglReleaseThread(void);
+EGLBoolean eglWaitClient(void);
+EGLContext eglGetCurrentContext(void);
+EGLSync eglCreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list);
+EGLBoolean eglDestroySync(EGLDisplay dpy, EGLSync sync);
+EGLint eglClientWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout);
+EGLBoolean eglGetSyncAttrib(EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value);
+EGLImage eglCreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list);
+EGLBoolean eglDestroyImage(EGLDisplay dpy, EGLImage image);
+EGLDisplay eglGetPlatformDisplay(EGLenum platform, void *native_display, const EGLAttrib *attrib_list);
+EGLSurface eglCreatePlatformWindowSurface(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list);
+EGLSurface eglCreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list);
+EGLBoolean eglWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags);
+#define EGL_NATIVE_BUFFER_USAGE_ANDROID 0x3143
+#define EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID 0x00000001
+#define EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID 0x00000002
+#define EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID 0x00000004
+#define EGL_FRAMEBUFFER_TARGET_ANDROID 0x3147
+#define EGL_FRONT_BUFFER_AUTO_REFRESH_ANDROID 0x314C
+#define EGL_TIMESTAMP_PENDING_ANDROID EGL_CAST(EGLnsecsANDROID,-2)
+#define EGL_TIMESTAMP_INVALID_ANDROID EGL_CAST(EGLnsecsANDROID,-1)
+#define EGL_TIMESTAMPS_ANDROID 0x3430
+#define EGL_COMPOSITE_DEADLINE_ANDROID 0x3431
+#define EGL_COMPOSITE_INTERVAL_ANDROID 0x3432
+#define EGL_COMPOSITE_TO_PRESENT_LATENCY_ANDROID 0x3433
+#define EGL_REQUESTED_PRESENT_TIME_ANDROID 0x3434
+#define EGL_RENDERING_COMPLETE_TIME_ANDROID 0x3435
+#define EGL_COMPOSITION_LATCH_TIME_ANDROID 0x3436
+#define EGL_FIRST_COMPOSITION_START_TIME_ANDROID 0x3437
+#define EGL_LAST_COMPOSITION_START_TIME_ANDROID 0x3438
+#define EGL_FIRST_COMPOSITION_GPU_FINISHED_TIME_ANDROID 0x3439
+#define EGL_DISPLAY_PRESENT_TIME_ANDROID 0x343A
+#define EGL_DEQUEUE_READY_TIME_ANDROID 0x343B
+#define EGL_READS_DONE_TIME_ANDROID 0x343C
+#define EGL_NATIVE_BUFFER_ANDROID 0x3140
+#define EGL_SYNC_NATIVE_FENCE_ANDROID 0x3144
+#define EGL_SYNC_NATIVE_FENCE_FD_ANDROID 0x3145
+#define EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID 0x3146
+#define EGL_NO_NATIVE_FENCE_FD_ANDROID -1
+#define EGL_RECORDABLE_ANDROID 0x3142
+#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200
+#define EGL_D3D9_DEVICE_ANGLE 0x33A0
+#define EGL_D3D11_DEVICE_ANGLE 0x33A1
+#define EGL_FIXED_SIZE_ANGLE 0x3201
+#define EGL_COLOR_COMPONENT_TYPE_UNSIGNED_INTEGER_ARM 0x3287
+#define EGL_COLOR_COMPONENT_TYPE_INTEGER_ARM 0x3288
+#define EGL_SYNC_PRIOR_COMMANDS_IMPLICIT_EXTERNAL_ARM 0x328A
+#define EGL_DISCARD_SAMPLES_ARM 0x3286
+#define EGL_FRONT_BUFFER_EXT 0x3464
+#define EGL_BUFFER_AGE_EXT 0x313D
+#define EGL_SYNC_CLIENT_EXT 0x3364
+#define EGL_SYNC_CLIENT_SIGNAL_EXT 0x3365
+#define EGL_PRIMARY_COMPOSITOR_CONTEXT_EXT 0x3460
+#define EGL_EXTERNAL_REF_ID_EXT 0x3461
+#define EGL_COMPOSITOR_DROP_NEWEST_FRAME_EXT 0x3462
+#define EGL_COMPOSITOR_KEEP_NEWEST_FRAME_EXT 0x3463
+#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT 0x30BF
+#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT 0x3138
+#define EGL_NO_RESET_NOTIFICATION_EXT 0x31BE
+#define EGL_LOSE_CONTEXT_ON_RESET_EXT 0x31BF
+#define EGL_NO_DEVICE_EXT EGL_CAST(EGLDeviceEXT,0)
+#define EGL_BAD_DEVICE_EXT 0x322B
+#define EGL_DEVICE_EXT 0x322C
+#define EGL_DRM_DEVICE_FILE_EXT 0x3233
+#define EGL_DRM_MASTER_FD_EXT 0x333C
+#define EGL_OPENWF_DEVICE_ID_EXT 0x3237
+#define EGL_GL_COLORSPACE_BT2020_LINEAR_EXT 0x333F
+#define EGL_GL_COLORSPACE_BT2020_PQ_EXT 0x3340
+#define EGL_GL_COLORSPACE_DISPLAY_P3_EXT 0x3363
+#define EGL_GL_COLORSPACE_DISPLAY_P3_LINEAR_EXT 0x3362
+#define EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT 0x3490
+#define EGL_GL_COLORSPACE_SCRGB_EXT 0x3351
+#define EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT 0x3350
+#define EGL_LINUX_DMA_BUF_EXT 0x3270
+#define EGL_LINUX_DRM_FOURCC_EXT 0x3271
+#define EGL_DMA_BUF_PLANE0_FD_EXT 0x3272
+#define EGL_DMA_BUF_PLANE0_OFFSET_EXT 0x3273
+#define EGL_DMA_BUF_PLANE0_PITCH_EXT 0x3274
+#define EGL_DMA_BUF_PLANE1_FD_EXT 0x3275
+#define EGL_DMA_BUF_PLANE1_OFFSET_EXT 0x3276
+#define EGL_DMA_BUF_PLANE1_PITCH_EXT 0x3277
+#define EGL_DMA_BUF_PLANE2_FD_EXT 0x3278
+#define EGL_DMA_BUF_PLANE2_OFFSET_EXT 0x3279
+#define EGL_DMA_BUF_PLANE2_PITCH_EXT 0x327A
+#define EGL_YUV_COLOR_SPACE_HINT_EXT 0x327B
+#define EGL_SAMPLE_RANGE_HINT_EXT 0x327C
+#define EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT 0x327D
+#define EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT 0x327E
+#define EGL_ITU_REC601_EXT 0x327F
+#define EGL_ITU_REC709_EXT 0x3280
+#define EGL_ITU_REC2020_EXT 0x3281
+#define EGL_YUV_FULL_RANGE_EXT 0x3282
+#define EGL_YUV_NARROW_RANGE_EXT 0x3283
+#define EGL_YUV_CHROMA_SITING_0_EXT 0x3284
+#define EGL_YUV_CHROMA_SITING_0_5_EXT 0x3285
+#define EGL_DMA_BUF_PLANE3_FD_EXT 0x3440
+#define EGL_DMA_BUF_PLANE3_OFFSET_EXT 0x3441
+#define EGL_DMA_BUF_PLANE3_PITCH_EXT 0x3442
+#define EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT 0x3443
+#define EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT 0x3444
+#define EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT 0x3445
+#define EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT 0x3446
+#define EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT 0x3447
+#define EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT 0x3448
+#define EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT 0x3449
+#define EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT 0x344A
+#define EGL_GL_COLORSPACE_DEFAULT_EXT 0x314D
+#define EGL_IMPORT_SYNC_TYPE_EXT 0x3470
+#define EGL_IMPORT_IMPLICIT_SYNC_EXT 0x3471
+#define EGL_IMPORT_EXPLICIT_SYNC_EXT 0x3472
+#define EGL_MULTIVIEW_VIEW_COUNT_EXT 0x3134
+#define EGL_NO_OUTPUT_LAYER_EXT EGL_CAST(EGLOutputLayerEXT,0)
+#define EGL_NO_OUTPUT_PORT_EXT EGL_CAST(EGLOutputPortEXT,0)
+#define EGL_BAD_OUTPUT_LAYER_EXT 0x322D
+#define EGL_BAD_OUTPUT_PORT_EXT 0x322E
+#define EGL_SWAP_INTERVAL_EXT 0x322F
+#define EGL_DRM_CRTC_EXT 0x3234
+#define EGL_DRM_PLANE_EXT 0x3235
+#define EGL_DRM_CONNECTOR_EXT 0x3236
+#define EGL_OPENWF_PIPELINE_ID_EXT 0x3238
+#define EGL_OPENWF_PORT_ID_EXT 0x3239
+#define EGL_COLOR_COMPONENT_TYPE_EXT 0x3339
+#define EGL_COLOR_COMPONENT_TYPE_FIXED_EXT 0x333A
+#define EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT 0x333B
+#define EGL_PLATFORM_DEVICE_EXT 0x313F
+#define EGL_PLATFORM_WAYLAND_EXT 0x31D8
+#define EGL_PLATFORM_X11_EXT 0x31D5
+#define EGL_PLATFORM_X11_SCREEN_EXT 0x31D6
+#define EGL_PROTECTED_CONTENT_EXT 0x32C0
+#define EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT 0x3360
+#define EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT 0x3361
+#define EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT 0x3341
+#define EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT 0x3342
+#define EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT 0x3343
+#define EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT 0x3344
+#define EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT 0x3345
+#define EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT 0x3346
+#define EGL_SMPTE2086_WHITE_POINT_X_EXT 0x3347
+#define EGL_SMPTE2086_WHITE_POINT_Y_EXT 0x3348
+#define EGL_SMPTE2086_MAX_LUMINANCE_EXT 0x3349
+#define EGL_SMPTE2086_MIN_LUMINANCE_EXT 0x334A
+#define EGL_METADATA_SCALING_EXT 50000
+#define EGL_YUV_ORDER_EXT 0x3301
+#define EGL_YUV_NUMBER_OF_PLANES_EXT 0x3311
+#define EGL_YUV_SUBSAMPLE_EXT 0x3312
+#define EGL_YUV_DEPTH_RANGE_EXT 0x3317
+#define EGL_YUV_CSC_STANDARD_EXT 0x330A
+#define EGL_YUV_PLANE_BPP_EXT 0x331A
+#define EGL_YUV_BUFFER_EXT 0x3300
+#define EGL_YUV_ORDER_YUV_EXT 0x3302
+#define EGL_YUV_ORDER_YVU_EXT 0x3303
+#define EGL_YUV_ORDER_YUYV_EXT 0x3304
+#define EGL_YUV_ORDER_UYVY_EXT 0x3305
+#define EGL_YUV_ORDER_YVYU_EXT 0x3306
+#define EGL_YUV_ORDER_VYUY_EXT 0x3307
+#define EGL_YUV_ORDER_AYUV_EXT 0x3308
+#define EGL_YUV_SUBSAMPLE_4_2_0_EXT 0x3313
+#define EGL_YUV_SUBSAMPLE_4_2_2_EXT 0x3314
+#define EGL_YUV_SUBSAMPLE_4_4_4_EXT 0x3315
+#define EGL_YUV_DEPTH_RANGE_LIMITED_EXT 0x3318
+#define EGL_YUV_DEPTH_RANGE_FULL_EXT 0x3319
+#define EGL_YUV_CSC_STANDARD_601_EXT 0x330B
+#define EGL_YUV_CSC_STANDARD_709_EXT 0x330C
+#define EGL_YUV_CSC_STANDARD_2020_EXT 0x330D
+#define EGL_YUV_PLANE_BPP_0_EXT 0x331B
+#define EGL_YUV_PLANE_BPP_8_EXT 0x331C
+#define EGL_YUV_PLANE_BPP_10_EXT 0x331D
+#define EGL_CLIENT_PIXMAP_POINTER_HI 0x8F74
+#define EGL_COLOR_FORMAT_HI 0x8F70
+#define EGL_COLOR_RGB_HI 0x8F71
+#define EGL_COLOR_RGBA_HI 0x8F72
+#define EGL_COLOR_ARGB_HI 0x8F73
+#define EGL_CONTEXT_PRIORITY_LEVEL_IMG 0x3100
+#define EGL_CONTEXT_PRIORITY_HIGH_IMG 0x3101
+#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG 0x3102
+#define EGL_CONTEXT_PRIORITY_LOW_IMG 0x3103
+#define EGL_NATIVE_BUFFER_MULTIPLANE_SEPARATE_IMG 0x3105
+#define EGL_NATIVE_BUFFER_PLANE_OFFSET_IMG 0x3106
+#define EGL_CL_EVENT_HANDLE_KHR 0x309C
+#define EGL_SYNC_CL_EVENT_KHR 0x30FE
+#define EGL_SYNC_CL_EVENT_COMPLETE_KHR 0x30FF
+#define EGL_CONFORMANT_KHR 0x3042
+#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR 0x0020
+#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR 0x0040
+#define EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR 0
+#define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x2097
+#define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098
+#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098
+#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB
+#define EGL_CONTEXT_FLAGS_KHR 0x30FC
+#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD
+#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31BD
+#define EGL_NO_RESET_NOTIFICATION_KHR 0x31BE
+#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31BF
+#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001
+#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002
+#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004
+#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001
+#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002
+#define EGL_OPENGL_ES3_BIT_KHR 0x00000040
+#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31B3
+#define EGL_OBJECT_THREAD_KHR 0x33B0
+#define EGL_OBJECT_DISPLAY_KHR 0x33B1
+#define EGL_OBJECT_CONTEXT_KHR 0x33B2
+#define EGL_OBJECT_SURFACE_KHR 0x33B3
+#define EGL_OBJECT_IMAGE_KHR 0x33B4
+#define EGL_OBJECT_SYNC_KHR 0x33B5
+#define EGL_OBJECT_STREAM_KHR 0x33B6
+#define EGL_DEBUG_MSG_CRITICAL_KHR 0x33B9
+#define EGL_DEBUG_MSG_ERROR_KHR 0x33BA
+#define EGL_DEBUG_MSG_WARN_KHR 0x33BB
+#define EGL_DEBUG_MSG_INFO_KHR 0x33BC
+#define EGL_DEBUG_CALLBACK_KHR 0x33B8
+#define EGL_TRACK_REFERENCES_KHR 0x3352
+#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0
+#define EGL_SYNC_CONDITION_KHR 0x30F8
+#define EGL_SYNC_FENCE_KHR 0x30F9
+#define EGL_GL_COLORSPACE_KHR 0x309D
+#define EGL_GL_COLORSPACE_SRGB_KHR 0x3089
+#define EGL_GL_COLORSPACE_LINEAR_KHR 0x308A
+#define EGL_GL_RENDERBUFFER_KHR 0x30B9
+#define EGL_GL_TEXTURE_2D_KHR 0x30B1
+#define EGL_GL_TEXTURE_LEVEL_KHR 0x30BC
+#define EGL_GL_TEXTURE_3D_KHR 0x30B2
+#define EGL_GL_TEXTURE_ZOFFSET_KHR 0x30BD
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR 0x30B3
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR 0x30B4
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR 0x30B5
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR 0x30B6
+#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR 0x30B7
+#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR 0x30B8
+#define EGL_NATIVE_PIXMAP_KHR 0x30B0
+#define EGL_NO_IMAGE_KHR EGL_CAST(EGLImageKHR,0)
+#define EGL_IMAGE_PRESERVED_KHR 0x30D2
+#define EGL_READ_SURFACE_BIT_KHR 0x0001
+#define EGL_WRITE_SURFACE_BIT_KHR 0x0002
+#define EGL_LOCK_SURFACE_BIT_KHR 0x0080
+#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100
+#define EGL_MATCH_FORMAT_KHR 0x3043
+#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0
+#define EGL_FORMAT_RGB_565_KHR 0x30C1
+#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2
+#define EGL_FORMAT_RGBA_8888_KHR 0x30C3
+#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4
+#define EGL_LOCK_USAGE_HINT_KHR 0x30C5
+#define EGL_BITMAP_POINTER_KHR 0x30C6
+#define EGL_BITMAP_PITCH_KHR 0x30C7
+#define EGL_BITMAP_ORIGIN_KHR 0x30C8
+#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9
+#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA
+#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB
+#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC
+#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD
+#define EGL_LOWER_LEFT_KHR 0x30CE
+#define EGL_UPPER_LEFT_KHR 0x30CF
+#define EGL_BITMAP_PIXEL_SIZE_KHR 0x3110
+#define EGL_MUTABLE_RENDER_BUFFER_BIT_KHR 0x1000
+#define EGL_NO_CONFIG_KHR EGL_CAST(EGLConfig,0)
+#define EGL_BUFFER_AGE_KHR 0x313D
+#define EGL_PLATFORM_ANDROID_KHR 0x3141
+#define EGL_PLATFORM_GBM_KHR 0x31D7
+#define EGL_PLATFORM_WAYLAND_KHR 0x31D8
+#define EGL_PLATFORM_X11_KHR 0x31D5
+#define EGL_PLATFORM_X11_SCREEN_KHR 0x31D6
+#define EGL_SYNC_STATUS_KHR 0x30F1
+#define EGL_SIGNALED_KHR 0x30F2
+#define EGL_UNSIGNALED_KHR 0x30F3
+#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5
+#define EGL_CONDITION_SATISFIED_KHR 0x30F6
+#define EGL_SYNC_TYPE_KHR 0x30F7
+#define EGL_SYNC_REUSABLE_KHR 0x30FA
+#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001
+#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFF
+#define EGL_NO_SYNC_KHR EGL_CAST(EGLSyncKHR,0)
+#define EGL_NO_STREAM_KHR EGL_CAST(EGLStreamKHR,0)
+#define EGL_CONSUMER_LATENCY_USEC_KHR 0x3210
+#define EGL_PRODUCER_FRAME_KHR 0x3212
+#define EGL_CONSUMER_FRAME_KHR 0x3213
+#define EGL_STREAM_STATE_KHR 0x3214
+#define EGL_STREAM_STATE_CREATED_KHR 0x3215
+#define EGL_STREAM_STATE_CONNECTING_KHR 0x3216
+#define EGL_STREAM_STATE_EMPTY_KHR 0x3217
+#define EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR 0x3218
+#define EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR 0x3219
+#define EGL_STREAM_STATE_DISCONNECTED_KHR 0x321A
+#define EGL_BAD_STREAM_KHR 0x321B
+#define EGL_BAD_STATE_KHR 0x321C
+#define EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR 0x321E
+#define EGL_NO_FILE_DESCRIPTOR_KHR EGL_CAST(EGLNativeFileDescriptorKHR,-1)
+#define EGL_STREAM_FIFO_LENGTH_KHR 0x31FC
+#define EGL_STREAM_TIME_NOW_KHR 0x31FD
+#define EGL_STREAM_TIME_CONSUMER_KHR 0x31FE
+#define EGL_STREAM_TIME_PRODUCER_KHR 0x31FF
+#define EGL_STREAM_BIT_KHR 0x0800
+#define EGL_VG_PARENT_IMAGE_KHR 0x30BA
+#define EGL_DRM_BUFFER_FORMAT_MESA 0x31D0
+#define EGL_DRM_BUFFER_USE_MESA 0x31D1
+#define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2
+#define EGL_DRM_BUFFER_MESA 0x31D3
+#define EGL_DRM_BUFFER_STRIDE_MESA 0x31D4
+#define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x00000001
+#define EGL_DRM_BUFFER_USE_SHARE_MESA 0x00000002
+#define EGL_DRM_BUFFER_USE_CURSOR_MESA 0x00000004
+#define EGL_PLATFORM_GBM_MESA 0x31D7
+#define EGL_PLATFORM_SURFACELESS_MESA 0x31DD
+#define EGL_Y_INVERTED_NOK 0x307F
+#define EGL_AUTO_STEREO_NV 0x3136
+#define EGL_CONTEXT_PRIORITY_REALTIME_NV 0x3357
+#define EGL_COVERAGE_BUFFERS_NV 0x30E0
+#define EGL_COVERAGE_SAMPLES_NV 0x30E1
+#define EGL_COVERAGE_SAMPLE_RESOLVE_NV 0x3131
+#define EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV 0x3132
+#define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV 0x3133
+#define EGL_CUDA_EVENT_HANDLE_NV 0x323B
+#define EGL_SYNC_CUDA_EVENT_NV 0x323C
+#define EGL_SYNC_CUDA_EVENT_COMPLETE_NV 0x323D
+#define EGL_DEPTH_ENCODING_NV 0x30E2
+#define EGL_DEPTH_ENCODING_NONE_NV 0
+#define EGL_DEPTH_ENCODING_NONLINEAR_NV 0x30E3
+#define EGL_CUDA_DEVICE_NV 0x323A
+#define EGL_POST_SUB_BUFFER_SUPPORTED_NV 0x30BE
+#define EGL_QUADRUPLE_BUFFER_NV 0x3231
+#define EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C
+#define EGL_YUV_PLANE0_TEXTURE_UNIT_NV 0x332C
+#define EGL_YUV_PLANE1_TEXTURE_UNIT_NV 0x332D
+#define EGL_YUV_PLANE2_TEXTURE_UNIT_NV 0x332E
+#define EGL_STREAM_CROSS_DISPLAY_NV 0x334E
+#define EGL_STREAM_CROSS_OBJECT_NV 0x334D
+#define EGL_STREAM_CROSS_PARTITION_NV 0x323F
+#define EGL_STREAM_CROSS_PROCESS_NV 0x3245
+#define EGL_STREAM_CROSS_SYSTEM_NV 0x334F
+#define EGL_STREAM_DMA_NV 0x3371
+#define EGL_STREAM_DMA_SERVER_NV 0x3372
+#define EGL_PENDING_FRAME_NV 0x3329
+#define EGL_STREAM_TIME_PENDING_NV 0x332A
+#define EGL_STREAM_FIFO_SYNCHRONOUS_NV 0x3336
+#define EGL_PRODUCER_MAX_FRAME_HINT_NV 0x3337
+#define EGL_CONSUMER_MAX_FRAME_HINT_NV 0x3338
+#define EGL_MAX_STREAM_METADATA_BLOCKS_NV 0x3250
+#define EGL_MAX_STREAM_METADATA_BLOCK_SIZE_NV 0x3251
+#define EGL_MAX_STREAM_METADATA_TOTAL_SIZE_NV 0x3252
+#define EGL_PRODUCER_METADATA_NV 0x3253
+#define EGL_CONSUMER_METADATA_NV 0x3254
+#define EGL_PENDING_METADATA_NV 0x3328
+#define EGL_METADATA0_SIZE_NV 0x3255
+#define EGL_METADATA1_SIZE_NV 0x3256
+#define EGL_METADATA2_SIZE_NV 0x3257
+#define EGL_METADATA3_SIZE_NV 0x3258
+#define EGL_METADATA0_TYPE_NV 0x3259
+#define EGL_METADATA1_TYPE_NV 0x325A
+#define EGL_METADATA2_TYPE_NV 0x325B
+#define EGL_METADATA3_TYPE_NV 0x325C
+#define EGL_STREAM_FRAME_ORIGIN_X_NV 0x3366
+#define EGL_STREAM_FRAME_ORIGIN_Y_NV 0x3367
+#define EGL_STREAM_FRAME_MAJOR_AXIS_NV 0x3368
+#define EGL_CONSUMER_AUTO_ORIENTATION_NV 0x3369
+#define EGL_PRODUCER_AUTO_ORIENTATION_NV 0x336A
+#define EGL_LEFT_NV 0x336B
+#define EGL_RIGHT_NV 0x336C
+#define EGL_TOP_NV 0x336D
+#define EGL_BOTTOM_NV 0x336E
+#define EGL_X_AXIS_NV 0x336F
+#define EGL_Y_AXIS_NV 0x3370
+#define EGL_STREAM_STATE_INITIALIZING_NV 0x3240
+#define EGL_STREAM_TYPE_NV 0x3241
+#define EGL_STREAM_PROTOCOL_NV 0x3242
+#define EGL_STREAM_ENDPOINT_NV 0x3243
+#define EGL_STREAM_LOCAL_NV 0x3244
+#define EGL_STREAM_PRODUCER_NV 0x3247
+#define EGL_STREAM_CONSUMER_NV 0x3248
+#define EGL_STREAM_PROTOCOL_FD_NV 0x3246
+#define EGL_SUPPORT_RESET_NV 0x3334
+#define EGL_SUPPORT_REUSE_NV 0x3335
+#define EGL_STREAM_PROTOCOL_SOCKET_NV 0x324B
+#define EGL_SOCKET_HANDLE_NV 0x324C
+#define EGL_SOCKET_TYPE_NV 0x324D
+#define EGL_SOCKET_TYPE_INET_NV 0x324F
+#define EGL_SOCKET_TYPE_UNIX_NV 0x324E
+#define EGL_SYNC_NEW_FRAME_NV 0x321F
+#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV 0x30E6
+#define EGL_SYNC_STATUS_NV 0x30E7
+#define EGL_SIGNALED_NV 0x30E8
+#define EGL_UNSIGNALED_NV 0x30E9
+#define EGL_SYNC_FLUSH_COMMANDS_BIT_NV 0x0001
+#define EGL_FOREVER_NV 0xFFFFFFFFFFFFFFFF
+#define EGL_ALREADY_SIGNALED_NV 0x30EA
+#define EGL_TIMEOUT_EXPIRED_NV 0x30EB
+#define EGL_CONDITION_SATISFIED_NV 0x30EC
+#define EGL_SYNC_TYPE_NV 0x30ED
+#define EGL_SYNC_CONDITION_NV 0x30EE
+#define EGL_SYNC_FENCE_NV 0x30EF
+#define EGL_NO_SYNC_NV EGL_CAST(EGLSyncNV,0)
+#define EGL_TRIPLE_BUFFER_NV 0x3230
+#define EGL_NATIVE_BUFFER_TIZEN 0x32A0
+#define EGL_NATIVE_SURFACE_TIZEN 0x32A1
+#define EGL_WAYLAND_BUFFER_WL 0x31D5
+#define EGL_WAYLAND_PLANE_WL 0x31D6
+#define EGL_TEXTURE_Y_U_V_WL 0x31D7
+#define EGL_TEXTURE_Y_UV_WL 0x31D8
+#define EGL_TEXTURE_Y_XUXV_WL 0x31D9
+#define EGL_TEXTURE_EXTERNAL_WL 0x31DA
+#define EGL_WAYLAND_Y_INVERTED_WL 0x31DB
+#ifndef EGL_ANDROID_GLES_layers
+#define EGL_ANDROID_GLES_layers 1
+#endif
+#ifndef EGL_ANDROID_blob_cache
+#define EGL_ANDROID_blob_cache 1
+typedef void (APIENTRYP PFNEGLSETBLOBCACHEFUNCSANDROIDPROC)(EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get);
+GLAPI PFNEGLSETBLOBCACHEFUNCSANDROIDPROC glad_eglSetBlobCacheFuncsANDROID;
+#define eglSetBlobCacheFuncsANDROID glad_eglSetBlobCacheFuncsANDROID
+#endif
+#ifndef EGL_ANDROID_create_native_client_buffer
+#define EGL_ANDROID_create_native_client_buffer 1
+typedef EGLClientBuffer (APIENTRYP PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC)(const EGLint *attrib_list);
+GLAPI PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC glad_eglCreateNativeClientBufferANDROID;
+#define eglCreateNativeClientBufferANDROID glad_eglCreateNativeClientBufferANDROID
+#endif
+#ifndef EGL_ANDROID_framebuffer_target
+#define EGL_ANDROID_framebuffer_target 1
+#endif
+#ifndef EGL_ANDROID_front_buffer_auto_refresh
+#define EGL_ANDROID_front_buffer_auto_refresh 1
+#endif
+#ifndef EGL_ANDROID_get_frame_timestamps
+#define EGL_ANDROID_get_frame_timestamps 1
+typedef EGLBoolean (APIENTRYP PFNEGLGETCOMPOSITORTIMINGSUPPORTEDANDROIDPROC)(EGLDisplay dpy, EGLSurface surface, EGLint name);
+GLAPI PFNEGLGETCOMPOSITORTIMINGSUPPORTEDANDROIDPROC glad_eglGetCompositorTimingSupportedANDROID;
+#define eglGetCompositorTimingSupportedANDROID glad_eglGetCompositorTimingSupportedANDROID
+typedef EGLBoolean (APIENTRYP PFNEGLGETCOMPOSITORTIMINGANDROIDPROC)(EGLDisplay dpy, EGLSurface surface, EGLint numTimestamps, const EGLint *names, EGLnsecsANDROID *values);
+GLAPI PFNEGLGETCOMPOSITORTIMINGANDROIDPROC glad_eglGetCompositorTimingANDROID;
+#define eglGetCompositorTimingANDROID glad_eglGetCompositorTimingANDROID
+typedef EGLBoolean (APIENTRYP PFNEGLGETNEXTFRAMEIDANDROIDPROC)(EGLDisplay dpy, EGLSurface surface, EGLuint64KHR *frameId);
+GLAPI PFNEGLGETNEXTFRAMEIDANDROIDPROC glad_eglGetNextFrameIdANDROID;
+#define eglGetNextFrameIdANDROID glad_eglGetNextFrameIdANDROID
+typedef EGLBoolean (APIENTRYP PFNEGLGETFRAMETIMESTAMPSUPPORTEDANDROIDPROC)(EGLDisplay dpy, EGLSurface surface, EGLint timestamp);
+GLAPI PFNEGLGETFRAMETIMESTAMPSUPPORTEDANDROIDPROC glad_eglGetFrameTimestampSupportedANDROID;
+#define eglGetFrameTimestampSupportedANDROID glad_eglGetFrameTimestampSupportedANDROID
+typedef EGLBoolean (APIENTRYP PFNEGLGETFRAMETIMESTAMPSANDROIDPROC)(EGLDisplay dpy, EGLSurface surface, EGLuint64KHR frameId, EGLint numTimestamps, const EGLint *timestamps, EGLnsecsANDROID *values);
+GLAPI PFNEGLGETFRAMETIMESTAMPSANDROIDPROC glad_eglGetFrameTimestampsANDROID;
+#define eglGetFrameTimestampsANDROID glad_eglGetFrameTimestampsANDROID
+#endif
+#ifndef EGL_ANDROID_get_native_client_buffer
+#define EGL_ANDROID_get_native_client_buffer 1
+typedef EGLClientBuffer (APIENTRYP PFNEGLGETNATIVECLIENTBUFFERANDROIDPROC)(const struct AHardwareBuffer *buffer);
+GLAPI PFNEGLGETNATIVECLIENTBUFFERANDROIDPROC glad_eglGetNativeClientBufferANDROID;
+#define eglGetNativeClientBufferANDROID glad_eglGetNativeClientBufferANDROID
+#endif
+#ifndef EGL_ANDROID_image_native_buffer
+#define EGL_ANDROID_image_native_buffer 1
+#endif
+#ifndef EGL_ANDROID_native_fence_sync
+#define EGL_ANDROID_native_fence_sync 1
+typedef EGLint (APIENTRYP PFNEGLDUPNATIVEFENCEFDANDROIDPROC)(EGLDisplay dpy, EGLSyncKHR sync);
+GLAPI PFNEGLDUPNATIVEFENCEFDANDROIDPROC glad_eglDupNativeFenceFDANDROID;
+#define eglDupNativeFenceFDANDROID glad_eglDupNativeFenceFDANDROID
+#endif
+#ifndef EGL_ANDROID_presentation_time
+#define EGL_ANDROID_presentation_time 1
+typedef EGLBoolean (APIENTRYP PFNEGLPRESENTATIONTIMEANDROIDPROC)(EGLDisplay dpy, EGLSurface surface, EGLnsecsANDROID time);
+GLAPI PFNEGLPRESENTATIONTIMEANDROIDPROC glad_eglPresentationTimeANDROID;
+#define eglPresentationTimeANDROID glad_eglPresentationTimeANDROID
+#endif
+#ifndef EGL_ANDROID_recordable
+#define EGL_ANDROID_recordable 1
+#endif
+#ifndef EGL_ANGLE_d3d_share_handle_client_buffer
+#define EGL_ANGLE_d3d_share_handle_client_buffer 1
+#endif
+#ifndef EGL_ANGLE_device_d3d
+#define EGL_ANGLE_device_d3d 1
+#endif
+#ifndef EGL_ANGLE_query_surface_pointer
+#define EGL_ANGLE_query_surface_pointer 1
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYSURFACEPOINTERANGLEPROC)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value);
+GLAPI PFNEGLQUERYSURFACEPOINTERANGLEPROC glad_eglQuerySurfacePointerANGLE;
+#define eglQuerySurfacePointerANGLE glad_eglQuerySurfacePointerANGLE
+#endif
+#ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle
+#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1
+#endif
+#ifndef EGL_ANGLE_window_fixed_size
+#define EGL_ANGLE_window_fixed_size 1
+#endif
+#ifndef EGL_ARM_image_format
+#define EGL_ARM_image_format 1
+#endif
+#ifndef EGL_ARM_implicit_external_sync
+#define EGL_ARM_implicit_external_sync 1
+#endif
+#ifndef EGL_ARM_pixmap_multisample_discard
+#define EGL_ARM_pixmap_multisample_discard 1
+#endif
+#ifndef EGL_EXT_bind_to_front
+#define EGL_EXT_bind_to_front 1
+#endif
+#ifndef EGL_EXT_buffer_age
+#define EGL_EXT_buffer_age 1
+#endif
+#ifndef EGL_EXT_client_extensions
+#define EGL_EXT_client_extensions 1
+#endif
+#ifndef EGL_EXT_client_sync
+#define EGL_EXT_client_sync 1
+typedef EGLBoolean (APIENTRYP PFNEGLCLIENTSIGNALSYNCEXTPROC)(EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list);
+GLAPI PFNEGLCLIENTSIGNALSYNCEXTPROC glad_eglClientSignalSyncEXT;
+#define eglClientSignalSyncEXT glad_eglClientSignalSyncEXT
+#endif
+#ifndef EGL_EXT_compositor
+#define EGL_EXT_compositor 1
+typedef EGLBoolean (APIENTRYP PFNEGLCOMPOSITORSETCONTEXTLISTEXTPROC)(const EGLint *external_ref_ids, EGLint num_entries);
+GLAPI PFNEGLCOMPOSITORSETCONTEXTLISTEXTPROC glad_eglCompositorSetContextListEXT;
+#define eglCompositorSetContextListEXT glad_eglCompositorSetContextListEXT
+typedef EGLBoolean (APIENTRYP PFNEGLCOMPOSITORSETCONTEXTATTRIBUTESEXTPROC)(EGLint external_ref_id, const EGLint *context_attributes, EGLint num_entries);
+GLAPI PFNEGLCOMPOSITORSETCONTEXTATTRIBUTESEXTPROC glad_eglCompositorSetContextAttributesEXT;
+#define eglCompositorSetContextAttributesEXT glad_eglCompositorSetContextAttributesEXT
+typedef EGLBoolean (APIENTRYP PFNEGLCOMPOSITORSETWINDOWLISTEXTPROC)(EGLint external_ref_id, const EGLint *external_win_ids, EGLint num_entries);
+GLAPI PFNEGLCOMPOSITORSETWINDOWLISTEXTPROC glad_eglCompositorSetWindowListEXT;
+#define eglCompositorSetWindowListEXT glad_eglCompositorSetWindowListEXT
+typedef EGLBoolean (APIENTRYP PFNEGLCOMPOSITORSETWINDOWATTRIBUTESEXTPROC)(EGLint external_win_id, const EGLint *window_attributes, EGLint num_entries);
+GLAPI PFNEGLCOMPOSITORSETWINDOWATTRIBUTESEXTPROC glad_eglCompositorSetWindowAttributesEXT;
+#define eglCompositorSetWindowAttributesEXT glad_eglCompositorSetWindowAttributesEXT
+typedef EGLBoolean (APIENTRYP PFNEGLCOMPOSITORBINDTEXWINDOWEXTPROC)(EGLint external_win_id);
+GLAPI PFNEGLCOMPOSITORBINDTEXWINDOWEXTPROC glad_eglCompositorBindTexWindowEXT;
+#define eglCompositorBindTexWindowEXT glad_eglCompositorBindTexWindowEXT
+typedef EGLBoolean (APIENTRYP PFNEGLCOMPOSITORSETSIZEEXTPROC)(EGLint external_win_id, EGLint width, EGLint height);
+GLAPI PFNEGLCOMPOSITORSETSIZEEXTPROC glad_eglCompositorSetSizeEXT;
+#define eglCompositorSetSizeEXT glad_eglCompositorSetSizeEXT
+typedef EGLBoolean (APIENTRYP PFNEGLCOMPOSITORSWAPPOLICYEXTPROC)(EGLint external_win_id, EGLint policy);
+GLAPI PFNEGLCOMPOSITORSWAPPOLICYEXTPROC glad_eglCompositorSwapPolicyEXT;
+#define eglCompositorSwapPolicyEXT glad_eglCompositorSwapPolicyEXT
+#endif
+#ifndef EGL_EXT_create_context_robustness
+#define EGL_EXT_create_context_robustness 1
+#endif
+#ifndef EGL_EXT_device_base
+#define EGL_EXT_device_base 1
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYDEVICEATTRIBEXTPROC)(EGLDeviceEXT device, EGLint attribute, EGLAttrib *value);
+GLAPI PFNEGLQUERYDEVICEATTRIBEXTPROC glad_eglQueryDeviceAttribEXT;
+#define eglQueryDeviceAttribEXT glad_eglQueryDeviceAttribEXT
+typedef const char * (APIENTRYP PFNEGLQUERYDEVICESTRINGEXTPROC)(EGLDeviceEXT device, EGLint name);
+GLAPI PFNEGLQUERYDEVICESTRINGEXTPROC glad_eglQueryDeviceStringEXT;
+#define eglQueryDeviceStringEXT glad_eglQueryDeviceStringEXT
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYDEVICESEXTPROC)(EGLint max_devices, EGLDeviceEXT *devices, EGLint *num_devices);
+GLAPI PFNEGLQUERYDEVICESEXTPROC glad_eglQueryDevicesEXT;
+#define eglQueryDevicesEXT glad_eglQueryDevicesEXT
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYDISPLAYATTRIBEXTPROC)(EGLDisplay dpy, EGLint attribute, EGLAttrib *value);
+GLAPI PFNEGLQUERYDISPLAYATTRIBEXTPROC glad_eglQueryDisplayAttribEXT;
+#define eglQueryDisplayAttribEXT glad_eglQueryDisplayAttribEXT
+#endif
+#ifndef EGL_EXT_device_drm
+#define EGL_EXT_device_drm 1
+#endif
+#ifndef EGL_EXT_device_enumeration
+#define EGL_EXT_device_enumeration 1
+#endif
+#ifndef EGL_EXT_device_openwf
+#define EGL_EXT_device_openwf 1
+#endif
+#ifndef EGL_EXT_device_query
+#define EGL_EXT_device_query 1
+#endif
+#ifndef EGL_EXT_gl_colorspace_bt2020_linear
+#define EGL_EXT_gl_colorspace_bt2020_linear 1
+#endif
+#ifndef EGL_EXT_gl_colorspace_bt2020_pq
+#define EGL_EXT_gl_colorspace_bt2020_pq 1
+#endif
+#ifndef EGL_EXT_gl_colorspace_display_p3
+#define EGL_EXT_gl_colorspace_display_p3 1
+#endif
+#ifndef EGL_EXT_gl_colorspace_display_p3_linear
+#define EGL_EXT_gl_colorspace_display_p3_linear 1
+#endif
+#ifndef EGL_EXT_gl_colorspace_display_p3_passthrough
+#define EGL_EXT_gl_colorspace_display_p3_passthrough 1
+#endif
+#ifndef EGL_EXT_gl_colorspace_scrgb
+#define EGL_EXT_gl_colorspace_scrgb 1
+#endif
+#ifndef EGL_EXT_gl_colorspace_scrgb_linear
+#define EGL_EXT_gl_colorspace_scrgb_linear 1
+#endif
+#ifndef EGL_EXT_image_dma_buf_import
+#define EGL_EXT_image_dma_buf_import 1
+#endif
+#ifndef EGL_EXT_image_dma_buf_import_modifiers
+#define EGL_EXT_image_dma_buf_import_modifiers 1
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYDMABUFFORMATSEXTPROC)(EGLDisplay dpy, EGLint max_formats, EGLint *formats, EGLint *num_formats);
+GLAPI PFNEGLQUERYDMABUFFORMATSEXTPROC glad_eglQueryDmaBufFormatsEXT;
+#define eglQueryDmaBufFormatsEXT glad_eglQueryDmaBufFormatsEXT
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYDMABUFMODIFIERSEXTPROC)(EGLDisplay dpy, EGLint format, EGLint max_modifiers, EGLuint64KHR *modifiers, EGLBoolean *external_only, EGLint *num_modifiers);
+GLAPI PFNEGLQUERYDMABUFMODIFIERSEXTPROC glad_eglQueryDmaBufModifiersEXT;
+#define eglQueryDmaBufModifiersEXT glad_eglQueryDmaBufModifiersEXT
+#endif
+#ifndef EGL_EXT_image_gl_colorspace
+#define EGL_EXT_image_gl_colorspace 1
+#endif
+#ifndef EGL_EXT_image_implicit_sync_control
+#define EGL_EXT_image_implicit_sync_control 1
+#endif
+#ifndef EGL_EXT_multiview_window
+#define EGL_EXT_multiview_window 1
+#endif
+#ifndef EGL_EXT_output_base
+#define EGL_EXT_output_base 1
+typedef EGLBoolean (APIENTRYP PFNEGLGETOUTPUTLAYERSEXTPROC)(EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputLayerEXT *layers, EGLint max_layers, EGLint *num_layers);
+GLAPI PFNEGLGETOUTPUTLAYERSEXTPROC glad_eglGetOutputLayersEXT;
+#define eglGetOutputLayersEXT glad_eglGetOutputLayersEXT
+typedef EGLBoolean (APIENTRYP PFNEGLGETOUTPUTPORTSEXTPROC)(EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputPortEXT *ports, EGLint max_ports, EGLint *num_ports);
+GLAPI PFNEGLGETOUTPUTPORTSEXTPROC glad_eglGetOutputPortsEXT;
+#define eglGetOutputPortsEXT glad_eglGetOutputPortsEXT
+typedef EGLBoolean (APIENTRYP PFNEGLOUTPUTLAYERATTRIBEXTPROC)(EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value);
+GLAPI PFNEGLOUTPUTLAYERATTRIBEXTPROC glad_eglOutputLayerAttribEXT;
+#define eglOutputLayerAttribEXT glad_eglOutputLayerAttribEXT
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC)(EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib *value);
+GLAPI PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC glad_eglQueryOutputLayerAttribEXT;
+#define eglQueryOutputLayerAttribEXT glad_eglQueryOutputLayerAttribEXT
+typedef const char * (APIENTRYP PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC)(EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name);
+GLAPI PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC glad_eglQueryOutputLayerStringEXT;
+#define eglQueryOutputLayerStringEXT glad_eglQueryOutputLayerStringEXT
+typedef EGLBoolean (APIENTRYP PFNEGLOUTPUTPORTATTRIBEXTPROC)(EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value);
+GLAPI PFNEGLOUTPUTPORTATTRIBEXTPROC glad_eglOutputPortAttribEXT;
+#define eglOutputPortAttribEXT glad_eglOutputPortAttribEXT
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC)(EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib *value);
+GLAPI PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC glad_eglQueryOutputPortAttribEXT;
+#define eglQueryOutputPortAttribEXT glad_eglQueryOutputPortAttribEXT
+typedef const char * (APIENTRYP PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC)(EGLDisplay dpy, EGLOutputPortEXT port, EGLint name);
+GLAPI PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC glad_eglQueryOutputPortStringEXT;
+#define eglQueryOutputPortStringEXT glad_eglQueryOutputPortStringEXT
+#endif
+#ifndef EGL_EXT_output_drm
+#define EGL_EXT_output_drm 1
+#endif
+#ifndef EGL_EXT_output_openwf
+#define EGL_EXT_output_openwf 1
+#endif
+#ifndef EGL_EXT_pixel_format_float
+#define EGL_EXT_pixel_format_float 1
+#endif
+#ifndef EGL_EXT_platform_base
+#define EGL_EXT_platform_base 1
+typedef EGLDisplay (APIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC)(EGLenum platform, void *native_display, const EGLint *attrib_list);
+GLAPI PFNEGLGETPLATFORMDISPLAYEXTPROC glad_eglGetPlatformDisplayEXT;
+#define eglGetPlatformDisplayEXT glad_eglGetPlatformDisplayEXT
+typedef EGLSurface (APIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list);
+GLAPI PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC glad_eglCreatePlatformWindowSurfaceEXT;
+#define eglCreatePlatformWindowSurfaceEXT glad_eglCreatePlatformWindowSurfaceEXT
+typedef EGLSurface (APIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC)(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list);
+GLAPI PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC glad_eglCreatePlatformPixmapSurfaceEXT;
+#define eglCreatePlatformPixmapSurfaceEXT glad_eglCreatePlatformPixmapSurfaceEXT
+#endif
+#ifndef EGL_EXT_platform_device
+#define EGL_EXT_platform_device 1
+#endif
+#ifndef EGL_EXT_platform_wayland
+#define EGL_EXT_platform_wayland 1
+#endif
+#ifndef EGL_EXT_platform_x11
+#define EGL_EXT_platform_x11 1
+#endif
+#ifndef EGL_EXT_protected_content
+#define EGL_EXT_protected_content 1
+#endif
+#ifndef EGL_EXT_protected_surface
+#define EGL_EXT_protected_surface 1
+#endif
+#ifndef EGL_EXT_stream_consumer_egloutput
+#define EGL_EXT_stream_consumer_egloutput 1
+typedef EGLBoolean (APIENTRYP PFNEGLSTREAMCONSUMEROUTPUTEXTPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer);
+GLAPI PFNEGLSTREAMCONSUMEROUTPUTEXTPROC glad_eglStreamConsumerOutputEXT;
+#define eglStreamConsumerOutputEXT glad_eglStreamConsumerOutputEXT
+#endif
+#ifndef EGL_EXT_surface_CTA861_3_metadata
+#define EGL_EXT_surface_CTA861_3_metadata 1
+#endif
+#ifndef EGL_EXT_surface_SMPTE2086_metadata
+#define EGL_EXT_surface_SMPTE2086_metadata 1
+#endif
+#ifndef EGL_EXT_swap_buffers_with_damage
+#define EGL_EXT_swap_buffers_with_damage 1
+typedef EGLBoolean (APIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC)(EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects);
+GLAPI PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC glad_eglSwapBuffersWithDamageEXT;
+#define eglSwapBuffersWithDamageEXT glad_eglSwapBuffersWithDamageEXT
+#endif
+#ifndef EGL_EXT_sync_reuse
+#define EGL_EXT_sync_reuse 1
+typedef EGLBoolean (APIENTRYP PFNEGLUNSIGNALSYNCEXTPROC)(EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list);
+GLAPI PFNEGLUNSIGNALSYNCEXTPROC glad_eglUnsignalSyncEXT;
+#define eglUnsignalSyncEXT glad_eglUnsignalSyncEXT
+#endif
+#ifndef EGL_EXT_yuv_surface
+#define EGL_EXT_yuv_surface 1
+#endif
+#ifndef EGL_HI_clientpixmap
+#define EGL_HI_clientpixmap 1
+typedef EGLSurface (APIENTRYP PFNEGLCREATEPIXMAPSURFACEHIPROC)(EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI *pixmap);
+GLAPI PFNEGLCREATEPIXMAPSURFACEHIPROC glad_eglCreatePixmapSurfaceHI;
+#define eglCreatePixmapSurfaceHI glad_eglCreatePixmapSurfaceHI
+#endif
+#ifndef EGL_HI_colorformats
+#define EGL_HI_colorformats 1
+#endif
+#ifndef EGL_IMG_context_priority
+#define EGL_IMG_context_priority 1
+#endif
+#ifndef EGL_IMG_image_plane_attribs
+#define EGL_IMG_image_plane_attribs 1
+#endif
+#ifndef EGL_KHR_cl_event
+#define EGL_KHR_cl_event 1
+#endif
+#ifndef EGL_KHR_cl_event2
+#define EGL_KHR_cl_event2 1
+typedef EGLSyncKHR (APIENTRYP PFNEGLCREATESYNC64KHRPROC)(EGLDisplay dpy, EGLenum type, const EGLAttribKHR *attrib_list);
+GLAPI PFNEGLCREATESYNC64KHRPROC glad_eglCreateSync64KHR;
+#define eglCreateSync64KHR glad_eglCreateSync64KHR
+#endif
+#ifndef EGL_KHR_client_get_all_proc_addresses
+#define EGL_KHR_client_get_all_proc_addresses 1
+#endif
+#ifndef EGL_KHR_config_attribs
+#define EGL_KHR_config_attribs 1
+#endif
+#ifndef EGL_KHR_context_flush_control
+#define EGL_KHR_context_flush_control 1
+#endif
+#ifndef EGL_KHR_create_context
+#define EGL_KHR_create_context 1
+#endif
+#ifndef EGL_KHR_create_context_no_error
+#define EGL_KHR_create_context_no_error 1
+#endif
+#ifndef EGL_KHR_debug
+#define EGL_KHR_debug 1
+typedef EGLint (APIENTRYP PFNEGLDEBUGMESSAGECONTROLKHRPROC)(EGLDEBUGPROCKHR callback, const EGLAttrib *attrib_list);
+GLAPI PFNEGLDEBUGMESSAGECONTROLKHRPROC glad_eglDebugMessageControlKHR;
+#define eglDebugMessageControlKHR glad_eglDebugMessageControlKHR
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYDEBUGKHRPROC)(EGLint attribute, EGLAttrib *value);
+GLAPI PFNEGLQUERYDEBUGKHRPROC glad_eglQueryDebugKHR;
+#define eglQueryDebugKHR glad_eglQueryDebugKHR
+typedef EGLint (APIENTRYP PFNEGLLABELOBJECTKHRPROC)(EGLDisplay display, EGLenum objectType, EGLObjectKHR object, EGLLabelKHR label);
+GLAPI PFNEGLLABELOBJECTKHRPROC glad_eglLabelObjectKHR;
+#define eglLabelObjectKHR glad_eglLabelObjectKHR
+#endif
+#ifndef EGL_KHR_display_reference
+#define EGL_KHR_display_reference 1
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYDISPLAYATTRIBKHRPROC)(EGLDisplay dpy, EGLint name, EGLAttrib *value);
+GLAPI PFNEGLQUERYDISPLAYATTRIBKHRPROC glad_eglQueryDisplayAttribKHR;
+#define eglQueryDisplayAttribKHR glad_eglQueryDisplayAttribKHR
+#endif
+#ifndef EGL_KHR_fence_sync
+#define EGL_KHR_fence_sync 1
+typedef EGLSyncKHR (APIENTRYP PFNEGLCREATESYNCKHRPROC)(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
+GLAPI PFNEGLCREATESYNCKHRPROC glad_eglCreateSyncKHR;
+#define eglCreateSyncKHR glad_eglCreateSyncKHR
+typedef EGLBoolean (APIENTRYP PFNEGLDESTROYSYNCKHRPROC)(EGLDisplay dpy, EGLSyncKHR sync);
+GLAPI PFNEGLDESTROYSYNCKHRPROC glad_eglDestroySyncKHR;
+#define eglDestroySyncKHR glad_eglDestroySyncKHR
+typedef EGLint (APIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC)(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
+GLAPI PFNEGLCLIENTWAITSYNCKHRPROC glad_eglClientWaitSyncKHR;
+#define eglClientWaitSyncKHR glad_eglClientWaitSyncKHR
+typedef EGLBoolean (APIENTRYP PFNEGLGETSYNCATTRIBKHRPROC)(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
+GLAPI PFNEGLGETSYNCATTRIBKHRPROC glad_eglGetSyncAttribKHR;
+#define eglGetSyncAttribKHR glad_eglGetSyncAttribKHR
+#endif
+#ifndef EGL_KHR_get_all_proc_addresses
+#define EGL_KHR_get_all_proc_addresses 1
+#endif
+#ifndef EGL_KHR_gl_colorspace
+#define EGL_KHR_gl_colorspace 1
+#endif
+#ifndef EGL_KHR_gl_renderbuffer_image
+#define EGL_KHR_gl_renderbuffer_image 1
+#endif
+#ifndef EGL_KHR_gl_texture_2D_image
+#define EGL_KHR_gl_texture_2D_image 1
+#endif
+#ifndef EGL_KHR_gl_texture_3D_image
+#define EGL_KHR_gl_texture_3D_image 1
+#endif
+#ifndef EGL_KHR_gl_texture_cubemap_image
+#define EGL_KHR_gl_texture_cubemap_image 1
+#endif
+#ifndef EGL_KHR_image
+#define EGL_KHR_image 1
+typedef EGLImageKHR (APIENTRYP PFNEGLCREATEIMAGEKHRPROC)(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
+GLAPI PFNEGLCREATEIMAGEKHRPROC glad_eglCreateImageKHR;
+#define eglCreateImageKHR glad_eglCreateImageKHR
+typedef EGLBoolean (APIENTRYP PFNEGLDESTROYIMAGEKHRPROC)(EGLDisplay dpy, EGLImageKHR image);
+GLAPI PFNEGLDESTROYIMAGEKHRPROC glad_eglDestroyImageKHR;
+#define eglDestroyImageKHR glad_eglDestroyImageKHR
+#endif
+#ifndef EGL_KHR_image_base
+#define EGL_KHR_image_base 1
+#endif
+#ifndef EGL_KHR_image_pixmap
+#define EGL_KHR_image_pixmap 1
+#endif
+#ifndef EGL_KHR_lock_surface
+#define EGL_KHR_lock_surface 1
+typedef EGLBoolean (APIENTRYP PFNEGLLOCKSURFACEKHRPROC)(EGLDisplay dpy, EGLSurface surface, const EGLint *attrib_list);
+GLAPI PFNEGLLOCKSURFACEKHRPROC glad_eglLockSurfaceKHR;
+#define eglLockSurfaceKHR glad_eglLockSurfaceKHR
+typedef EGLBoolean (APIENTRYP PFNEGLUNLOCKSURFACEKHRPROC)(EGLDisplay dpy, EGLSurface surface);
+GLAPI PFNEGLUNLOCKSURFACEKHRPROC glad_eglUnlockSurfaceKHR;
+#define eglUnlockSurfaceKHR glad_eglUnlockSurfaceKHR
+#endif
+#ifndef EGL_KHR_lock_surface2
+#define EGL_KHR_lock_surface2 1
+#endif
+#ifndef EGL_KHR_lock_surface3
+#define EGL_KHR_lock_surface3 1
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYSURFACE64KHRPROC)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR *value);
+GLAPI PFNEGLQUERYSURFACE64KHRPROC glad_eglQuerySurface64KHR;
+#define eglQuerySurface64KHR glad_eglQuerySurface64KHR
+#endif
+#ifndef EGL_KHR_mutable_render_buffer
+#define EGL_KHR_mutable_render_buffer 1
+#endif
+#ifndef EGL_KHR_no_config_context
+#define EGL_KHR_no_config_context 1
+#endif
+#ifndef EGL_KHR_partial_update
+#define EGL_KHR_partial_update 1
+typedef EGLBoolean (APIENTRYP PFNEGLSETDAMAGEREGIONKHRPROC)(EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects);
+GLAPI PFNEGLSETDAMAGEREGIONKHRPROC glad_eglSetDamageRegionKHR;
+#define eglSetDamageRegionKHR glad_eglSetDamageRegionKHR
+#endif
+#ifndef EGL_KHR_platform_android
+#define EGL_KHR_platform_android 1
+#endif
+#ifndef EGL_KHR_platform_gbm
+#define EGL_KHR_platform_gbm 1
+#endif
+#ifndef EGL_KHR_platform_wayland
+#define EGL_KHR_platform_wayland 1
+#endif
+#ifndef EGL_KHR_platform_x11
+#define EGL_KHR_platform_x11 1
+#endif
+#ifndef EGL_KHR_reusable_sync
+#define EGL_KHR_reusable_sync 1
+typedef EGLBoolean (APIENTRYP PFNEGLSIGNALSYNCKHRPROC)(EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode);
+GLAPI PFNEGLSIGNALSYNCKHRPROC glad_eglSignalSyncKHR;
+#define eglSignalSyncKHR glad_eglSignalSyncKHR
+#endif
+#ifndef EGL_KHR_stream
+#define EGL_KHR_stream 1
+typedef EGLStreamKHR (APIENTRYP PFNEGLCREATESTREAMKHRPROC)(EGLDisplay dpy, const EGLint *attrib_list);
+GLAPI PFNEGLCREATESTREAMKHRPROC glad_eglCreateStreamKHR;
+#define eglCreateStreamKHR glad_eglCreateStreamKHR
+typedef EGLBoolean (APIENTRYP PFNEGLDESTROYSTREAMKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream);
+GLAPI PFNEGLDESTROYSTREAMKHRPROC glad_eglDestroyStreamKHR;
+#define eglDestroyStreamKHR glad_eglDestroyStreamKHR
+typedef EGLBoolean (APIENTRYP PFNEGLSTREAMATTRIBKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value);
+GLAPI PFNEGLSTREAMATTRIBKHRPROC glad_eglStreamAttribKHR;
+#define eglStreamAttribKHR glad_eglStreamAttribKHR
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYSTREAMKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value);
+GLAPI PFNEGLQUERYSTREAMKHRPROC glad_eglQueryStreamKHR;
+#define eglQueryStreamKHR glad_eglQueryStreamKHR
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYSTREAMU64KHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value);
+GLAPI PFNEGLQUERYSTREAMU64KHRPROC glad_eglQueryStreamu64KHR;
+#define eglQueryStreamu64KHR glad_eglQueryStreamu64KHR
+#endif
+#ifndef EGL_KHR_stream_attrib
+#define EGL_KHR_stream_attrib 1
+typedef EGLStreamKHR (APIENTRYP PFNEGLCREATESTREAMATTRIBKHRPROC)(EGLDisplay dpy, const EGLAttrib *attrib_list);
+GLAPI PFNEGLCREATESTREAMATTRIBKHRPROC glad_eglCreateStreamAttribKHR;
+#define eglCreateStreamAttribKHR glad_eglCreateStreamAttribKHR
+typedef EGLBoolean (APIENTRYP PFNEGLSETSTREAMATTRIBKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib value);
+GLAPI PFNEGLSETSTREAMATTRIBKHRPROC glad_eglSetStreamAttribKHR;
+#define eglSetStreamAttribKHR glad_eglSetStreamAttribKHR
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYSTREAMATTRIBKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib *value);
+GLAPI PFNEGLQUERYSTREAMATTRIBKHRPROC glad_eglQueryStreamAttribKHR;
+#define eglQueryStreamAttribKHR glad_eglQueryStreamAttribKHR
+typedef EGLBoolean (APIENTRYP PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list);
+GLAPI PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC glad_eglStreamConsumerAcquireAttribKHR;
+#define eglStreamConsumerAcquireAttribKHR glad_eglStreamConsumerAcquireAttribKHR
+typedef EGLBoolean (APIENTRYP PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list);
+GLAPI PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC glad_eglStreamConsumerReleaseAttribKHR;
+#define eglStreamConsumerReleaseAttribKHR glad_eglStreamConsumerReleaseAttribKHR
+#endif
+#ifndef EGL_KHR_stream_consumer_gltexture
+#define EGL_KHR_stream_consumer_gltexture 1
+typedef EGLBoolean (APIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream);
+GLAPI PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC glad_eglStreamConsumerGLTextureExternalKHR;
+#define eglStreamConsumerGLTextureExternalKHR glad_eglStreamConsumerGLTextureExternalKHR
+typedef EGLBoolean (APIENTRYP PFNEGLSTREAMCONSUMERACQUIREKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream);
+GLAPI PFNEGLSTREAMCONSUMERACQUIREKHRPROC glad_eglStreamConsumerAcquireKHR;
+#define eglStreamConsumerAcquireKHR glad_eglStreamConsumerAcquireKHR
+typedef EGLBoolean (APIENTRYP PFNEGLSTREAMCONSUMERRELEASEKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream);
+GLAPI PFNEGLSTREAMCONSUMERRELEASEKHRPROC glad_eglStreamConsumerReleaseKHR;
+#define eglStreamConsumerReleaseKHR glad_eglStreamConsumerReleaseKHR
+#endif
+#ifndef EGL_KHR_stream_cross_process_fd
+#define EGL_KHR_stream_cross_process_fd 1
+typedef EGLNativeFileDescriptorKHR (APIENTRYP PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream);
+GLAPI PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC glad_eglGetStreamFileDescriptorKHR;
+#define eglGetStreamFileDescriptorKHR glad_eglGetStreamFileDescriptorKHR
+typedef EGLStreamKHR (APIENTRYP PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC)(EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor);
+GLAPI PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC glad_eglCreateStreamFromFileDescriptorKHR;
+#define eglCreateStreamFromFileDescriptorKHR glad_eglCreateStreamFromFileDescriptorKHR
+#endif
+#ifndef EGL_KHR_stream_fifo
+#define EGL_KHR_stream_fifo 1
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYSTREAMTIMEKHRPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value);
+GLAPI PFNEGLQUERYSTREAMTIMEKHRPROC glad_eglQueryStreamTimeKHR;
+#define eglQueryStreamTimeKHR glad_eglQueryStreamTimeKHR
+#endif
+#ifndef EGL_KHR_stream_producer_aldatalocator
+#define EGL_KHR_stream_producer_aldatalocator 1
+#endif
+#ifndef EGL_KHR_stream_producer_eglsurface
+#define EGL_KHR_stream_producer_eglsurface 1
+typedef EGLSurface (APIENTRYP PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC)(EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list);
+GLAPI PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC glad_eglCreateStreamProducerSurfaceKHR;
+#define eglCreateStreamProducerSurfaceKHR glad_eglCreateStreamProducerSurfaceKHR
+#endif
+#ifndef EGL_KHR_surfaceless_context
+#define EGL_KHR_surfaceless_context 1
+#endif
+#ifndef EGL_KHR_swap_buffers_with_damage
+#define EGL_KHR_swap_buffers_with_damage 1
+typedef EGLBoolean (APIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC)(EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects);
+GLAPI PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC glad_eglSwapBuffersWithDamageKHR;
+#define eglSwapBuffersWithDamageKHR glad_eglSwapBuffersWithDamageKHR
+#endif
+#ifndef EGL_KHR_vg_parent_image
+#define EGL_KHR_vg_parent_image 1
+#endif
+#ifndef EGL_KHR_wait_sync
+#define EGL_KHR_wait_sync 1
+typedef EGLint (APIENTRYP PFNEGLWAITSYNCKHRPROC)(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags);
+GLAPI PFNEGLWAITSYNCKHRPROC glad_eglWaitSyncKHR;
+#define eglWaitSyncKHR glad_eglWaitSyncKHR
+#endif
+#ifndef EGL_MESA_drm_image
+#define EGL_MESA_drm_image 1
+typedef EGLImageKHR (APIENTRYP PFNEGLCREATEDRMIMAGEMESAPROC)(EGLDisplay dpy, const EGLint *attrib_list);
+GLAPI PFNEGLCREATEDRMIMAGEMESAPROC glad_eglCreateDRMImageMESA;
+#define eglCreateDRMImageMESA glad_eglCreateDRMImageMESA
+typedef EGLBoolean (APIENTRYP PFNEGLEXPORTDRMIMAGEMESAPROC)(EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride);
+GLAPI PFNEGLEXPORTDRMIMAGEMESAPROC glad_eglExportDRMImageMESA;
+#define eglExportDRMImageMESA glad_eglExportDRMImageMESA
+#endif
+#ifndef EGL_MESA_image_dma_buf_export
+#define EGL_MESA_image_dma_buf_export 1
+typedef EGLBoolean (APIENTRYP PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC)(EGLDisplay dpy, EGLImageKHR image, int *fourcc, int *num_planes, EGLuint64KHR *modifiers);
+GLAPI PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC glad_eglExportDMABUFImageQueryMESA;
+#define eglExportDMABUFImageQueryMESA glad_eglExportDMABUFImageQueryMESA
+typedef EGLBoolean (APIENTRYP PFNEGLEXPORTDMABUFIMAGEMESAPROC)(EGLDisplay dpy, EGLImageKHR image, int *fds, EGLint *strides, EGLint *offsets);
+GLAPI PFNEGLEXPORTDMABUFIMAGEMESAPROC glad_eglExportDMABUFImageMESA;
+#define eglExportDMABUFImageMESA glad_eglExportDMABUFImageMESA
+#endif
+#ifndef EGL_MESA_platform_gbm
+#define EGL_MESA_platform_gbm 1
+#endif
+#ifndef EGL_MESA_platform_surfaceless
+#define EGL_MESA_platform_surfaceless 1
+#endif
+#ifndef EGL_MESA_query_driver
+#define EGL_MESA_query_driver 1
+typedef char * (APIENTRYP PFNEGLGETDISPLAYDRIVERCONFIGPROC)(EGLDisplay dpy);
+GLAPI PFNEGLGETDISPLAYDRIVERCONFIGPROC glad_eglGetDisplayDriverConfig;
+#define eglGetDisplayDriverConfig glad_eglGetDisplayDriverConfig
+typedef const char * (APIENTRYP PFNEGLGETDISPLAYDRIVERNAMEPROC)(EGLDisplay dpy);
+GLAPI PFNEGLGETDISPLAYDRIVERNAMEPROC glad_eglGetDisplayDriverName;
+#define eglGetDisplayDriverName glad_eglGetDisplayDriverName
+#endif
+#ifndef EGL_NOK_swap_region
+#define EGL_NOK_swap_region 1
+typedef EGLBoolean (APIENTRYP PFNEGLSWAPBUFFERSREGIONNOKPROC)(EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects);
+GLAPI PFNEGLSWAPBUFFERSREGIONNOKPROC glad_eglSwapBuffersRegionNOK;
+#define eglSwapBuffersRegionNOK glad_eglSwapBuffersRegionNOK
+#endif
+#ifndef EGL_NOK_swap_region2
+#define EGL_NOK_swap_region2 1
+typedef EGLBoolean (APIENTRYP PFNEGLSWAPBUFFERSREGION2NOKPROC)(EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects);
+GLAPI PFNEGLSWAPBUFFERSREGION2NOKPROC glad_eglSwapBuffersRegion2NOK;
+#define eglSwapBuffersRegion2NOK glad_eglSwapBuffersRegion2NOK
+#endif
+#ifndef EGL_NOK_texture_from_pixmap
+#define EGL_NOK_texture_from_pixmap 1
+#endif
+#ifndef EGL_NV_3dvision_surface
+#define EGL_NV_3dvision_surface 1
+#endif
+#ifndef EGL_NV_context_priority_realtime
+#define EGL_NV_context_priority_realtime 1
+#endif
+#ifndef EGL_NV_coverage_sample
+#define EGL_NV_coverage_sample 1
+#endif
+#ifndef EGL_NV_coverage_sample_resolve
+#define EGL_NV_coverage_sample_resolve 1
+#endif
+#ifndef EGL_NV_cuda_event
+#define EGL_NV_cuda_event 1
+#endif
+#ifndef EGL_NV_depth_nonlinear
+#define EGL_NV_depth_nonlinear 1
+#endif
+#ifndef EGL_NV_device_cuda
+#define EGL_NV_device_cuda 1
+#endif
+#ifndef EGL_NV_native_query
+#define EGL_NV_native_query 1
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYNATIVEDISPLAYNVPROC)(EGLDisplay dpy, EGLNativeDisplayType *display_id);
+GLAPI PFNEGLQUERYNATIVEDISPLAYNVPROC glad_eglQueryNativeDisplayNV;
+#define eglQueryNativeDisplayNV glad_eglQueryNativeDisplayNV
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYNATIVEWINDOWNVPROC)(EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType *window);
+GLAPI PFNEGLQUERYNATIVEWINDOWNVPROC glad_eglQueryNativeWindowNV;
+#define eglQueryNativeWindowNV glad_eglQueryNativeWindowNV
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYNATIVEPIXMAPNVPROC)(EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType *pixmap);
+GLAPI PFNEGLQUERYNATIVEPIXMAPNVPROC glad_eglQueryNativePixmapNV;
+#define eglQueryNativePixmapNV glad_eglQueryNativePixmapNV
+#endif
+#ifndef EGL_NV_post_convert_rounding
+#define EGL_NV_post_convert_rounding 1
+#endif
+#ifndef EGL_NV_post_sub_buffer
+#define EGL_NV_post_sub_buffer 1
+typedef EGLBoolean (APIENTRYP PFNEGLPOSTSUBBUFFERNVPROC)(EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height);
+GLAPI PFNEGLPOSTSUBBUFFERNVPROC glad_eglPostSubBufferNV;
+#define eglPostSubBufferNV glad_eglPostSubBufferNV
+#endif
+#ifndef EGL_NV_quadruple_buffer
+#define EGL_NV_quadruple_buffer 1
+#endif
+#ifndef EGL_NV_robustness_video_memory_purge
+#define EGL_NV_robustness_video_memory_purge 1
+#endif
+#ifndef EGL_NV_stream_consumer_gltexture_yuv
+#define EGL_NV_stream_consumer_gltexture_yuv 1
+typedef EGLBoolean (APIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC)(EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list);
+GLAPI PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC glad_eglStreamConsumerGLTextureExternalAttribsNV;
+#define eglStreamConsumerGLTextureExternalAttribsNV glad_eglStreamConsumerGLTextureExternalAttribsNV
+#endif
+#ifndef EGL_NV_stream_cross_display
+#define EGL_NV_stream_cross_display 1
+#endif
+#ifndef EGL_NV_stream_cross_object
+#define EGL_NV_stream_cross_object 1
+#endif
+#ifndef EGL_NV_stream_cross_partition
+#define EGL_NV_stream_cross_partition 1
+#endif
+#ifndef EGL_NV_stream_cross_process
+#define EGL_NV_stream_cross_process 1
+#endif
+#ifndef EGL_NV_stream_cross_system
+#define EGL_NV_stream_cross_system 1
+#endif
+#ifndef EGL_NV_stream_dma
+#define EGL_NV_stream_dma 1
+#endif
+#ifndef EGL_NV_stream_fifo_next
+#define EGL_NV_stream_fifo_next 1
+#endif
+#ifndef EGL_NV_stream_fifo_synchronous
+#define EGL_NV_stream_fifo_synchronous 1
+#endif
+#ifndef EGL_NV_stream_flush
+#define EGL_NV_stream_flush 1
+typedef EGLBoolean (APIENTRYP PFNEGLSTREAMFLUSHNVPROC)(EGLDisplay dpy, EGLStreamKHR stream);
+GLAPI PFNEGLSTREAMFLUSHNVPROC glad_eglStreamFlushNV;
+#define eglStreamFlushNV glad_eglStreamFlushNV
+#endif
+#ifndef EGL_NV_stream_frame_limits
+#define EGL_NV_stream_frame_limits 1
+#endif
+#ifndef EGL_NV_stream_metadata
+#define EGL_NV_stream_metadata 1
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYDISPLAYATTRIBNVPROC)(EGLDisplay dpy, EGLint attribute, EGLAttrib *value);
+GLAPI PFNEGLQUERYDISPLAYATTRIBNVPROC glad_eglQueryDisplayAttribNV;
+#define eglQueryDisplayAttribNV glad_eglQueryDisplayAttribNV
+typedef EGLBoolean (APIENTRYP PFNEGLSETSTREAMMETADATANVPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLint n, EGLint offset, EGLint size, const void *data);
+GLAPI PFNEGLSETSTREAMMETADATANVPROC glad_eglSetStreamMetadataNV;
+#define eglSetStreamMetadataNV glad_eglSetStreamMetadataNV
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYSTREAMMETADATANVPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum name, EGLint n, EGLint offset, EGLint size, void *data);
+GLAPI PFNEGLQUERYSTREAMMETADATANVPROC glad_eglQueryStreamMetadataNV;
+#define eglQueryStreamMetadataNV glad_eglQueryStreamMetadataNV
+#endif
+#ifndef EGL_NV_stream_origin
+#define EGL_NV_stream_origin 1
+#endif
+#ifndef EGL_NV_stream_remote
+#define EGL_NV_stream_remote 1
+#endif
+#ifndef EGL_NV_stream_reset
+#define EGL_NV_stream_reset 1
+typedef EGLBoolean (APIENTRYP PFNEGLRESETSTREAMNVPROC)(EGLDisplay dpy, EGLStreamKHR stream);
+GLAPI PFNEGLRESETSTREAMNVPROC glad_eglResetStreamNV;
+#define eglResetStreamNV glad_eglResetStreamNV
+#endif
+#ifndef EGL_NV_stream_socket
+#define EGL_NV_stream_socket 1
+#endif
+#ifndef EGL_NV_stream_socket_inet
+#define EGL_NV_stream_socket_inet 1
+#endif
+#ifndef EGL_NV_stream_socket_unix
+#define EGL_NV_stream_socket_unix 1
+#endif
+#ifndef EGL_NV_stream_sync
+#define EGL_NV_stream_sync 1
+typedef EGLSyncKHR (APIENTRYP PFNEGLCREATESTREAMSYNCNVPROC)(EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint *attrib_list);
+GLAPI PFNEGLCREATESTREAMSYNCNVPROC glad_eglCreateStreamSyncNV;
+#define eglCreateStreamSyncNV glad_eglCreateStreamSyncNV
+#endif
+#ifndef EGL_NV_sync
+#define EGL_NV_sync 1
+typedef EGLSyncNV (APIENTRYP PFNEGLCREATEFENCESYNCNVPROC)(EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list);
+GLAPI PFNEGLCREATEFENCESYNCNVPROC glad_eglCreateFenceSyncNV;
+#define eglCreateFenceSyncNV glad_eglCreateFenceSyncNV
+typedef EGLBoolean (APIENTRYP PFNEGLDESTROYSYNCNVPROC)(EGLSyncNV sync);
+GLAPI PFNEGLDESTROYSYNCNVPROC glad_eglDestroySyncNV;
+#define eglDestroySyncNV glad_eglDestroySyncNV
+typedef EGLBoolean (APIENTRYP PFNEGLFENCENVPROC)(EGLSyncNV sync);
+GLAPI PFNEGLFENCENVPROC glad_eglFenceNV;
+#define eglFenceNV glad_eglFenceNV
+typedef EGLint (APIENTRYP PFNEGLCLIENTWAITSYNCNVPROC)(EGLSyncNV sync, EGLint flags, EGLTimeNV timeout);
+GLAPI PFNEGLCLIENTWAITSYNCNVPROC glad_eglClientWaitSyncNV;
+#define eglClientWaitSyncNV glad_eglClientWaitSyncNV
+typedef EGLBoolean (APIENTRYP PFNEGLSIGNALSYNCNVPROC)(EGLSyncNV sync, EGLenum mode);
+GLAPI PFNEGLSIGNALSYNCNVPROC glad_eglSignalSyncNV;
+#define eglSignalSyncNV glad_eglSignalSyncNV
+typedef EGLBoolean (APIENTRYP PFNEGLGETSYNCATTRIBNVPROC)(EGLSyncNV sync, EGLint attribute, EGLint *value);
+GLAPI PFNEGLGETSYNCATTRIBNVPROC glad_eglGetSyncAttribNV;
+#define eglGetSyncAttribNV glad_eglGetSyncAttribNV
+#endif
+#ifndef EGL_NV_system_time
+#define EGL_NV_system_time 1
+typedef EGLuint64NV (APIENTRYP PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC)(void);
+GLAPI PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC glad_eglGetSystemTimeFrequencyNV;
+#define eglGetSystemTimeFrequencyNV glad_eglGetSystemTimeFrequencyNV
+typedef EGLuint64NV (APIENTRYP PFNEGLGETSYSTEMTIMENVPROC)(void);
+GLAPI PFNEGLGETSYSTEMTIMENVPROC glad_eglGetSystemTimeNV;
+#define eglGetSystemTimeNV glad_eglGetSystemTimeNV
+#endif
+#ifndef EGL_NV_triple_buffer
+#define EGL_NV_triple_buffer 1
+#endif
+#ifndef EGL_TIZEN_image_native_buffer
+#define EGL_TIZEN_image_native_buffer 1
+#endif
+#ifndef EGL_TIZEN_image_native_surface
+#define EGL_TIZEN_image_native_surface 1
+#endif
+#ifndef EGL_WL_bind_wayland_display
+#define EGL_WL_bind_wayland_display 1
+typedef EGLBoolean (APIENTRYP PFNEGLBINDWAYLANDDISPLAYWLPROC)(EGLDisplay dpy, struct wl_display *display);
+GLAPI PFNEGLBINDWAYLANDDISPLAYWLPROC glad_eglBindWaylandDisplayWL;
+#define eglBindWaylandDisplayWL glad_eglBindWaylandDisplayWL
+typedef EGLBoolean (APIENTRYP PFNEGLUNBINDWAYLANDDISPLAYWLPROC)(EGLDisplay dpy, struct wl_display *display);
+GLAPI PFNEGLUNBINDWAYLANDDISPLAYWLPROC glad_eglUnbindWaylandDisplayWL;
+#define eglUnbindWaylandDisplayWL glad_eglUnbindWaylandDisplayWL
+typedef EGLBoolean (APIENTRYP PFNEGLQUERYWAYLANDBUFFERWLPROC)(EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value);
+GLAPI PFNEGLQUERYWAYLANDBUFFERWLPROC glad_eglQueryWaylandBufferWL;
+#define eglQueryWaylandBufferWL glad_eglQueryWaylandBufferWL
+#endif
+#ifndef EGL_WL_create_wayland_buffer_from_image
+#define EGL_WL_create_wayland_buffer_from_image 1
+typedef struct wl_buffer * (APIENTRYP PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC)(EGLDisplay dpy, EGLImageKHR image);
+GLAPI PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC glad_eglCreateWaylandBufferFromImageWL;
+#define eglCreateWaylandBufferFromImageWL glad_eglCreateWaylandBufferFromImageWL
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/dep/glad/include/glad_glx.h b/dep/glad/include/glad_glx.h
new file mode 100644
index 000000000..26c3f3f80
--- /dev/null
+++ b/dep/glad/include/glad_glx.h
@@ -0,0 +1,1262 @@
+/*
+
+ GLX loader generated by glad 0.1.33 on Sun May 3 16:48:35 2020.
+
+ Language/Generator: C/C++
+ Specification: glx
+ APIs: glx=1.4
+ Profile: -
+ Extensions:
+ GLX_3DFX_multisample,
+ GLX_AMD_gpu_association,
+ GLX_ARB_context_flush_control,
+ GLX_ARB_create_context,
+ GLX_ARB_create_context_no_error,
+ GLX_ARB_create_context_profile,
+ GLX_ARB_create_context_robustness,
+ GLX_ARB_fbconfig_float,
+ GLX_ARB_framebuffer_sRGB,
+ GLX_ARB_get_proc_address,
+ GLX_ARB_multisample,
+ GLX_ARB_robustness_application_isolation,
+ GLX_ARB_robustness_share_group_isolation,
+ GLX_ARB_vertex_buffer_object,
+ GLX_EXT_buffer_age,
+ GLX_EXT_context_priority,
+ 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_libglvnd,
+ GLX_EXT_no_config_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_INTEL_swap_event,
+ GLX_MESA_agp_offset,
+ GLX_MESA_copy_sub_buffer,
+ GLX_MESA_pixmap_colormap,
+ GLX_MESA_query_renderer,
+ GLX_MESA_release_buffers,
+ GLX_MESA_set_3dfx_mode,
+ GLX_MESA_swap_control,
+ GLX_NV_copy_buffer,
+ GLX_NV_copy_image,
+ GLX_NV_delay_before_swap,
+ GLX_NV_float_buffer,
+ GLX_NV_multigpu_context,
+ 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_OML_swap_method,
+ GLX_OML_sync_control,
+ GLX_SGIS_blended_overlay,
+ GLX_SGIS_multisample,
+ GLX_SGIS_shared_multisample,
+ GLX_SGIX_dmbuffer,
+ GLX_SGIX_fbconfig,
+ GLX_SGIX_hyperpipe,
+ GLX_SGIX_pbuffer,
+ GLX_SGIX_swap_barrier,
+ GLX_SGIX_swap_group,
+ GLX_SGIX_video_resize,
+ GLX_SGIX_video_source,
+ GLX_SGIX_visual_select_group,
+ GLX_SGI_cushion,
+ GLX_SGI_make_current_read,
+ GLX_SGI_swap_control,
+ GLX_SGI_video_sync,
+ GLX_SUN_get_transparent_index
+ Loader: True
+ Local files: False
+ Omit khrplatform: False
+ Reproducible: False
+
+ Commandline:
+ --api="glx=1.4" --generator="c" --spec="glx" --extensions="GLX_3DFX_multisample,GLX_AMD_gpu_association,GLX_ARB_context_flush_control,GLX_ARB_create_context,GLX_ARB_create_context_no_error,GLX_ARB_create_context_profile,GLX_ARB_create_context_robustness,GLX_ARB_fbconfig_float,GLX_ARB_framebuffer_sRGB,GLX_ARB_get_proc_address,GLX_ARB_multisample,GLX_ARB_robustness_application_isolation,GLX_ARB_robustness_share_group_isolation,GLX_ARB_vertex_buffer_object,GLX_EXT_buffer_age,GLX_EXT_context_priority,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_libglvnd,GLX_EXT_no_config_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_INTEL_swap_event,GLX_MESA_agp_offset,GLX_MESA_copy_sub_buffer,GLX_MESA_pixmap_colormap,GLX_MESA_query_renderer,GLX_MESA_release_buffers,GLX_MESA_set_3dfx_mode,GLX_MESA_swap_control,GLX_NV_copy_buffer,GLX_NV_copy_image,GLX_NV_delay_before_swap,GLX_NV_float_buffer,GLX_NV_multigpu_context,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_OML_swap_method,GLX_OML_sync_control,GLX_SGIS_blended_overlay,GLX_SGIS_multisample,GLX_SGIS_shared_multisample,GLX_SGIX_dmbuffer,GLX_SGIX_fbconfig,GLX_SGIX_hyperpipe,GLX_SGIX_pbuffer,GLX_SGIX_swap_barrier,GLX_SGIX_swap_group,GLX_SGIX_video_resize,GLX_SGIX_video_source,GLX_SGIX_visual_select_group,GLX_SGI_cushion,GLX_SGI_make_current_read,GLX_SGI_swap_control,GLX_SGI_video_sync,GLX_SUN_get_transparent_index"
+ Online:
+ Too many extensions
+*/
+
+
+#include
+#include
+#include
+#include "glad.h"
+
+#ifndef __glad_glxext_h_
+
+#ifdef __glxext_h_
+#error GLX header already included, remove this include, glad already provides it
+#endif
+
+#define __glad_glxext_h_
+#define __glxext_h_
+
+#ifndef APIENTRY
+#define APIENTRY
+#endif
+#ifndef APIENTRYP
+#define APIENTRYP APIENTRY *
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void* (* GLADloadproc)(const char *name);
+
+#ifndef GLAPI
+# if defined(GLAD_GLAPI_EXPORT)
+# if defined(_WIN32) || defined(__CYGWIN__)
+# if defined(GLAD_GLAPI_EXPORT_BUILD)
+# if defined(__GNUC__)
+# define GLAPI __attribute__ ((dllexport)) extern
+# else
+# define GLAPI __declspec(dllexport) extern
+# endif
+# else
+# if defined(__GNUC__)
+# define GLAPI __attribute__ ((dllimport)) extern
+# else
+# define GLAPI __declspec(dllimport) extern
+# endif
+# endif
+# elif defined(__GNUC__) && defined(GLAD_GLAPI_EXPORT_BUILD)
+# define GLAPI __attribute__ ((visibility ("default"))) extern
+# else
+# define GLAPI extern
+# endif
+# else
+# define GLAPI extern
+# endif
+#endif
+
+GLAPI int gladLoadGLX(Display *dpy, int screen);
+
+GLAPI int gladLoadGLXLoader(GLADloadproc, Display *dpy, int screen);
+
+#ifndef GLEXT_64_TYPES_DEFINED
+/* This code block is duplicated in glext.h, so must be protected */
+#define GLEXT_64_TYPES_DEFINED
+/* Define int32_t, int64_t, and uint64_t types for UST/MSC */
+/* (as used in the GLX_OML_sync_control extension). */
+#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+#include
+#elif defined(__sun__) || defined(__digital__)
+#include
+#if defined(__STDC__)
+#if defined(__arch64__) || defined(_LP64)
+typedef long int int64_t;
+typedef unsigned long int uint64_t;
+#else
+typedef long long int int64_t;
+typedef unsigned long long int uint64_t;
+#endif /* __arch64__ */
+#endif /* __STDC__ */
+#elif defined( __VMS ) || defined(__sgi)
+#include
+#elif defined(__SCO__) || defined(__USLC__)
+#include
+#elif defined(__UNIXOS2__) || defined(__SOL64__)
+typedef long int int32_t;
+typedef long long int int64_t;
+typedef unsigned long long int uint64_t;
+#elif defined(_WIN32) && defined(__GNUC__)
+#include
+#elif defined(_WIN32)
+typedef __int32 int32_t;
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+#else
+/* Fallback if nothing above works */
+#include
+#endif
+#endif
+typedef XID GLXFBConfigID;
+typedef struct __GLXFBConfigRec *GLXFBConfig;
+typedef XID GLXContextID;
+typedef struct __GLXcontextRec *GLXContext;
+typedef XID GLXPixmap;
+typedef XID GLXDrawable;
+typedef XID GLXWindow;
+typedef XID GLXPbuffer;
+typedef void (APIENTRY *__GLXextFuncPtr)(void);
+typedef XID GLXVideoCaptureDeviceNV;
+typedef unsigned int GLXVideoDeviceNV;
+typedef XID GLXVideoSourceSGIX;
+typedef XID GLXFBConfigIDSGIX;
+typedef struct __GLXFBConfigRec *GLXFBConfigSGIX;
+typedef XID GLXPbufferSGIX;
+typedef struct {
+ int event_type; /* GLX_DAMAGED or GLX_SAVED */
+ int draw_type; /* GLX_WINDOW or GLX_PBUFFER */
+ unsigned long serial; /* # of last request processed by server */
+ Bool send_event; /* true if this came for SendEvent request */
+ Display *display; /* display the event was read from */
+ GLXDrawable drawable; /* XID of Drawable */
+ unsigned int buffer_mask; /* mask indicating which buffers are affected */
+ unsigned int aux_buffer; /* which aux buffer was affected */
+ int x, y;
+ int width, height;
+ int count; /* if nonzero, at least this many more */
+} GLXPbufferClobberEvent;
+typedef struct {
+ int type;
+ unsigned long serial; /* # of last request processed by server */
+ Bool send_event; /* true if this came from a SendEvent request */
+ Display *display; /* Display the event was read from */
+ GLXDrawable drawable; /* drawable on which event was requested in event mask */
+ int event_type;
+ int64_t ust;
+ int64_t msc;
+ int64_t sbc;
+} GLXBufferSwapComplete;
+typedef union __GLXEvent {
+ GLXPbufferClobberEvent glxpbufferclobber;
+ GLXBufferSwapComplete glxbufferswapcomplete;
+ long pad[24];
+} GLXEvent;
+typedef struct {
+ int type;
+ unsigned long serial;
+ Bool send_event;
+ Display *display;
+ int extension;
+ int evtype;
+ GLXDrawable window;
+ Bool stereo_tree;
+} GLXStereoNotifyEventEXT;
+typedef struct {
+ int type;
+ unsigned long serial; /* # of last request processed by server */
+ Bool send_event; /* true if this came for SendEvent request */
+ Display *display; /* display the event was read from */
+ GLXDrawable drawable; /* i.d. of Drawable */
+ int event_type; /* GLX_DAMAGED_SGIX or GLX_SAVED_SGIX */
+ int draw_type; /* GLX_WINDOW_SGIX or GLX_PBUFFER_SGIX */
+ unsigned int mask; /* mask indicating which buffers are affected*/
+ int x, y;
+ int width, height;
+ int count; /* if nonzero, at least this many more */
+} GLXBufferClobberEventSGIX;
+typedef struct {
+ char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */
+ int networkId;
+} GLXHyperpipeNetworkSGIX;
+typedef struct {
+ char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */
+ int channel;
+ unsigned int participationType;
+ int timeSlice;
+} GLXHyperpipeConfigSGIX;
+typedef struct {
+ char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */
+ int srcXOrigin, srcYOrigin, srcWidth, srcHeight;
+ int destXOrigin, destYOrigin, destWidth, destHeight;
+} GLXPipeRect;
+typedef struct {
+ char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */
+ int XOrigin, YOrigin, maxHeight, maxWidth;
+} GLXPipeRectLimits;
+#define GLX_EXTENSION_NAME "GLX"
+#define GLX_PbufferClobber 0
+#define GLX_BufferSwapComplete 1
+#define __GLX_NUMBER_EVENTS 17
+#define GLX_BAD_SCREEN 1
+#define GLX_BAD_ATTRIBUTE 2
+#define GLX_NO_EXTENSION 3
+#define GLX_BAD_VISUAL 4
+#define GLX_BAD_CONTEXT 5
+#define GLX_BAD_VALUE 6
+#define GLX_BAD_ENUM 7
+#define GLX_USE_GL 1
+#define GLX_BUFFER_SIZE 2
+#define GLX_LEVEL 3
+#define GLX_RGBA 4
+#define GLX_DOUBLEBUFFER 5
+#define GLX_STEREO 6
+#define GLX_AUX_BUFFERS 7
+#define GLX_RED_SIZE 8
+#define GLX_GREEN_SIZE 9
+#define GLX_BLUE_SIZE 10
+#define GLX_ALPHA_SIZE 11
+#define GLX_DEPTH_SIZE 12
+#define GLX_STENCIL_SIZE 13
+#define GLX_ACCUM_RED_SIZE 14
+#define GLX_ACCUM_GREEN_SIZE 15
+#define GLX_ACCUM_BLUE_SIZE 16
+#define GLX_ACCUM_ALPHA_SIZE 17
+#define GLX_VENDOR 0x1
+#define GLX_VERSION 0x2
+#define GLX_EXTENSIONS 0x3
+#define GLX_WINDOW_BIT 0x00000001
+#define GLX_PIXMAP_BIT 0x00000002
+#define GLX_PBUFFER_BIT 0x00000004
+#define GLX_RGBA_BIT 0x00000001
+#define GLX_COLOR_INDEX_BIT 0x00000002
+#define GLX_PBUFFER_CLOBBER_MASK 0x08000000
+#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001
+#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002
+#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004
+#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008
+#define GLX_AUX_BUFFERS_BIT 0x00000010
+#define GLX_DEPTH_BUFFER_BIT 0x00000020
+#define GLX_STENCIL_BUFFER_BIT 0x00000040
+#define GLX_ACCUM_BUFFER_BIT 0x00000080
+#define GLX_CONFIG_CAVEAT 0x20
+#define GLX_X_VISUAL_TYPE 0x22
+#define GLX_TRANSPARENT_TYPE 0x23
+#define GLX_TRANSPARENT_INDEX_VALUE 0x24
+#define GLX_TRANSPARENT_RED_VALUE 0x25
+#define GLX_TRANSPARENT_GREEN_VALUE 0x26
+#define GLX_TRANSPARENT_BLUE_VALUE 0x27
+#define GLX_TRANSPARENT_ALPHA_VALUE 0x28
+#define GLX_DONT_CARE 0xFFFFFFFF
+#define GLX_NONE 0x8000
+#define GLX_SLOW_CONFIG 0x8001
+#define GLX_TRUE_COLOR 0x8002
+#define GLX_DIRECT_COLOR 0x8003
+#define GLX_PSEUDO_COLOR 0x8004
+#define GLX_STATIC_COLOR 0x8005
+#define GLX_GRAY_SCALE 0x8006
+#define GLX_STATIC_GRAY 0x8007
+#define GLX_TRANSPARENT_RGB 0x8008
+#define GLX_TRANSPARENT_INDEX 0x8009
+#define GLX_VISUAL_ID 0x800B
+#define GLX_SCREEN 0x800C
+#define GLX_NON_CONFORMANT_CONFIG 0x800D
+#define GLX_DRAWABLE_TYPE 0x8010
+#define GLX_RENDER_TYPE 0x8011
+#define GLX_X_RENDERABLE 0x8012
+#define GLX_FBCONFIG_ID 0x8013
+#define GLX_RGBA_TYPE 0x8014
+#define GLX_COLOR_INDEX_TYPE 0x8015
+#define GLX_MAX_PBUFFER_WIDTH 0x8016
+#define GLX_MAX_PBUFFER_HEIGHT 0x8017
+#define GLX_MAX_PBUFFER_PIXELS 0x8018
+#define GLX_PRESERVED_CONTENTS 0x801B
+#define GLX_LARGEST_PBUFFER 0x801C
+#define GLX_WIDTH 0x801D
+#define GLX_HEIGHT 0x801E
+#define GLX_EVENT_MASK 0x801F
+#define GLX_DAMAGED 0x8020
+#define GLX_SAVED 0x8021
+#define GLX_WINDOW 0x8022
+#define GLX_PBUFFER 0x8023
+#define GLX_PBUFFER_HEIGHT 0x8040
+#define GLX_PBUFFER_WIDTH 0x8041
+#define GLX_SAMPLE_BUFFERS 100000
+#define GLX_SAMPLES 100001
+#ifndef GLX_VERSION_1_0
+#define GLX_VERSION_1_0 1
+GLAPI int GLAD_GLX_VERSION_1_0;
+typedef XVisualInfo * (APIENTRYP PFNGLXCHOOSEVISUALPROC)(Display *dpy, int screen, int *attribList);
+GLAPI PFNGLXCHOOSEVISUALPROC glad_glXChooseVisual;
+#define glXChooseVisual glad_glXChooseVisual
+typedef GLXContext (APIENTRYP PFNGLXCREATECONTEXTPROC)(Display *dpy, XVisualInfo *vis, GLXContext shareList, Bool direct);
+GLAPI PFNGLXCREATECONTEXTPROC glad_glXCreateContext;
+#define glXCreateContext glad_glXCreateContext
+typedef void (APIENTRYP PFNGLXDESTROYCONTEXTPROC)(Display *dpy, GLXContext ctx);
+GLAPI PFNGLXDESTROYCONTEXTPROC glad_glXDestroyContext;
+#define glXDestroyContext glad_glXDestroyContext
+typedef Bool (APIENTRYP PFNGLXMAKECURRENTPROC)(Display *dpy, GLXDrawable drawable, GLXContext ctx);
+GLAPI PFNGLXMAKECURRENTPROC glad_glXMakeCurrent;
+#define glXMakeCurrent glad_glXMakeCurrent
+typedef void (APIENTRYP PFNGLXCOPYCONTEXTPROC)(Display *dpy, GLXContext src, GLXContext dst, unsigned long mask);
+GLAPI PFNGLXCOPYCONTEXTPROC glad_glXCopyContext;
+#define glXCopyContext glad_glXCopyContext
+typedef void (APIENTRYP PFNGLXSWAPBUFFERSPROC)(Display *dpy, GLXDrawable drawable);
+GLAPI PFNGLXSWAPBUFFERSPROC glad_glXSwapBuffers;
+#define glXSwapBuffers glad_glXSwapBuffers
+typedef GLXPixmap (APIENTRYP PFNGLXCREATEGLXPIXMAPPROC)(Display *dpy, XVisualInfo *visual, Pixmap pixmap);
+GLAPI PFNGLXCREATEGLXPIXMAPPROC glad_glXCreateGLXPixmap;
+#define glXCreateGLXPixmap glad_glXCreateGLXPixmap
+typedef void (APIENTRYP PFNGLXDESTROYGLXPIXMAPPROC)(Display *dpy, GLXPixmap pixmap);
+GLAPI PFNGLXDESTROYGLXPIXMAPPROC glad_glXDestroyGLXPixmap;
+#define glXDestroyGLXPixmap glad_glXDestroyGLXPixmap
+typedef Bool (APIENTRYP PFNGLXQUERYEXTENSIONPROC)(Display *dpy, int *errorb, int *event);
+GLAPI PFNGLXQUERYEXTENSIONPROC glad_glXQueryExtension;
+#define glXQueryExtension glad_glXQueryExtension
+typedef Bool (APIENTRYP PFNGLXQUERYVERSIONPROC)(Display *dpy, int *maj, int *min);
+GLAPI PFNGLXQUERYVERSIONPROC glad_glXQueryVersion;
+#define glXQueryVersion glad_glXQueryVersion
+typedef Bool (APIENTRYP PFNGLXISDIRECTPROC)(Display *dpy, GLXContext ctx);
+GLAPI PFNGLXISDIRECTPROC glad_glXIsDirect;
+#define glXIsDirect glad_glXIsDirect
+typedef int (APIENTRYP PFNGLXGETCONFIGPROC)(Display *dpy, XVisualInfo *visual, int attrib, int *value);
+GLAPI PFNGLXGETCONFIGPROC glad_glXGetConfig;
+#define glXGetConfig glad_glXGetConfig
+typedef GLXContext (APIENTRYP PFNGLXGETCURRENTCONTEXTPROC)(void);
+GLAPI PFNGLXGETCURRENTCONTEXTPROC glad_glXGetCurrentContext;
+#define glXGetCurrentContext glad_glXGetCurrentContext
+typedef GLXDrawable (APIENTRYP PFNGLXGETCURRENTDRAWABLEPROC)(void);
+GLAPI PFNGLXGETCURRENTDRAWABLEPROC glad_glXGetCurrentDrawable;
+#define glXGetCurrentDrawable glad_glXGetCurrentDrawable
+typedef void (APIENTRYP PFNGLXWAITGLPROC)(void);
+GLAPI PFNGLXWAITGLPROC glad_glXWaitGL;
+#define glXWaitGL glad_glXWaitGL
+typedef void (APIENTRYP PFNGLXWAITXPROC)(void);
+GLAPI PFNGLXWAITXPROC glad_glXWaitX;
+#define glXWaitX glad_glXWaitX
+typedef void (APIENTRYP PFNGLXUSEXFONTPROC)(Font font, int first, int count, int list);
+GLAPI PFNGLXUSEXFONTPROC glad_glXUseXFont;
+#define glXUseXFont glad_glXUseXFont
+#endif
+#ifndef GLX_VERSION_1_1
+#define GLX_VERSION_1_1 1
+GLAPI int GLAD_GLX_VERSION_1_1;
+typedef const char * (APIENTRYP PFNGLXQUERYEXTENSIONSSTRINGPROC)(Display *dpy, int screen);
+GLAPI PFNGLXQUERYEXTENSIONSSTRINGPROC glad_glXQueryExtensionsString;
+#define glXQueryExtensionsString glad_glXQueryExtensionsString
+typedef const char * (APIENTRYP PFNGLXQUERYSERVERSTRINGPROC)(Display *dpy, int screen, int name);
+GLAPI PFNGLXQUERYSERVERSTRINGPROC glad_glXQueryServerString;
+#define glXQueryServerString glad_glXQueryServerString
+typedef const char * (APIENTRYP PFNGLXGETCLIENTSTRINGPROC)(Display *dpy, int name);
+GLAPI PFNGLXGETCLIENTSTRINGPROC glad_glXGetClientString;
+#define glXGetClientString glad_glXGetClientString
+#endif
+#ifndef GLX_VERSION_1_2
+#define GLX_VERSION_1_2 1
+GLAPI int GLAD_GLX_VERSION_1_2;
+typedef Display * (APIENTRYP PFNGLXGETCURRENTDISPLAYPROC)(void);
+GLAPI PFNGLXGETCURRENTDISPLAYPROC glad_glXGetCurrentDisplay;
+#define glXGetCurrentDisplay glad_glXGetCurrentDisplay
+#endif
+#ifndef GLX_VERSION_1_3
+#define GLX_VERSION_1_3 1
+GLAPI int GLAD_GLX_VERSION_1_3;
+typedef GLXFBConfig * (APIENTRYP PFNGLXGETFBCONFIGSPROC)(Display *dpy, int screen, int *nelements);
+GLAPI PFNGLXGETFBCONFIGSPROC glad_glXGetFBConfigs;
+#define glXGetFBConfigs glad_glXGetFBConfigs
+typedef GLXFBConfig * (APIENTRYP PFNGLXCHOOSEFBCONFIGPROC)(Display *dpy, int screen, const int *attrib_list, int *nelements);
+GLAPI PFNGLXCHOOSEFBCONFIGPROC glad_glXChooseFBConfig;
+#define glXChooseFBConfig glad_glXChooseFBConfig
+typedef int (APIENTRYP PFNGLXGETFBCONFIGATTRIBPROC)(Display *dpy, GLXFBConfig config, int attribute, int *value);
+GLAPI PFNGLXGETFBCONFIGATTRIBPROC glad_glXGetFBConfigAttrib;
+#define glXGetFBConfigAttrib glad_glXGetFBConfigAttrib
+typedef XVisualInfo * (APIENTRYP PFNGLXGETVISUALFROMFBCONFIGPROC)(Display *dpy, GLXFBConfig config);
+GLAPI PFNGLXGETVISUALFROMFBCONFIGPROC glad_glXGetVisualFromFBConfig;
+#define glXGetVisualFromFBConfig glad_glXGetVisualFromFBConfig
+typedef GLXWindow (APIENTRYP PFNGLXCREATEWINDOWPROC)(Display *dpy, GLXFBConfig config, Window win, const int *attrib_list);
+GLAPI PFNGLXCREATEWINDOWPROC glad_glXCreateWindow;
+#define glXCreateWindow glad_glXCreateWindow
+typedef void (APIENTRYP PFNGLXDESTROYWINDOWPROC)(Display *dpy, GLXWindow win);
+GLAPI PFNGLXDESTROYWINDOWPROC glad_glXDestroyWindow;
+#define glXDestroyWindow glad_glXDestroyWindow
+typedef GLXPixmap (APIENTRYP PFNGLXCREATEPIXMAPPROC)(Display *dpy, GLXFBConfig config, Pixmap pixmap, const int *attrib_list);
+GLAPI PFNGLXCREATEPIXMAPPROC glad_glXCreatePixmap;
+#define glXCreatePixmap glad_glXCreatePixmap
+typedef void (APIENTRYP PFNGLXDESTROYPIXMAPPROC)(Display *dpy, GLXPixmap pixmap);
+GLAPI PFNGLXDESTROYPIXMAPPROC glad_glXDestroyPixmap;
+#define glXDestroyPixmap glad_glXDestroyPixmap
+typedef GLXPbuffer (APIENTRYP PFNGLXCREATEPBUFFERPROC)(Display *dpy, GLXFBConfig config, const int *attrib_list);
+GLAPI PFNGLXCREATEPBUFFERPROC glad_glXCreatePbuffer;
+#define glXCreatePbuffer glad_glXCreatePbuffer
+typedef void (APIENTRYP PFNGLXDESTROYPBUFFERPROC)(Display *dpy, GLXPbuffer pbuf);
+GLAPI PFNGLXDESTROYPBUFFERPROC glad_glXDestroyPbuffer;
+#define glXDestroyPbuffer glad_glXDestroyPbuffer
+typedef void (APIENTRYP PFNGLXQUERYDRAWABLEPROC)(Display *dpy, GLXDrawable draw, int attribute, unsigned int *value);
+GLAPI PFNGLXQUERYDRAWABLEPROC glad_glXQueryDrawable;
+#define glXQueryDrawable glad_glXQueryDrawable
+typedef GLXContext (APIENTRYP PFNGLXCREATENEWCONTEXTPROC)(Display *dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct);
+GLAPI PFNGLXCREATENEWCONTEXTPROC glad_glXCreateNewContext;
+#define glXCreateNewContext glad_glXCreateNewContext
+typedef Bool (APIENTRYP PFNGLXMAKECONTEXTCURRENTPROC)(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
+GLAPI PFNGLXMAKECONTEXTCURRENTPROC glad_glXMakeContextCurrent;
+#define glXMakeContextCurrent glad_glXMakeContextCurrent
+typedef GLXDrawable (APIENTRYP PFNGLXGETCURRENTREADDRAWABLEPROC)(void);
+GLAPI PFNGLXGETCURRENTREADDRAWABLEPROC glad_glXGetCurrentReadDrawable;
+#define glXGetCurrentReadDrawable glad_glXGetCurrentReadDrawable
+typedef int (APIENTRYP PFNGLXQUERYCONTEXTPROC)(Display *dpy, GLXContext ctx, int attribute, int *value);
+GLAPI PFNGLXQUERYCONTEXTPROC glad_glXQueryContext;
+#define glXQueryContext glad_glXQueryContext
+typedef void (APIENTRYP PFNGLXSELECTEVENTPROC)(Display *dpy, GLXDrawable draw, unsigned long event_mask);
+GLAPI PFNGLXSELECTEVENTPROC glad_glXSelectEvent;
+#define glXSelectEvent glad_glXSelectEvent
+typedef void (APIENTRYP PFNGLXGETSELECTEDEVENTPROC)(Display *dpy, GLXDrawable draw, unsigned long *event_mask);
+GLAPI PFNGLXGETSELECTEDEVENTPROC glad_glXGetSelectedEvent;
+#define glXGetSelectedEvent glad_glXGetSelectedEvent
+#endif
+#ifndef GLX_VERSION_1_4
+#define GLX_VERSION_1_4 1
+GLAPI int GLAD_GLX_VERSION_1_4;
+typedef __GLXextFuncPtr (APIENTRYP PFNGLXGETPROCADDRESSPROC)(const GLubyte *procName);
+GLAPI PFNGLXGETPROCADDRESSPROC glad_glXGetProcAddress;
+#define glXGetProcAddress glad_glXGetProcAddress
+#endif
+#define GLX_SAMPLE_BUFFERS_3DFX 0x8050
+#define GLX_SAMPLES_3DFX 0x8051
+#define GLX_GPU_VENDOR_AMD 0x1F00
+#define GLX_GPU_RENDERER_STRING_AMD 0x1F01
+#define GLX_GPU_OPENGL_VERSION_STRING_AMD 0x1F02
+#define GLX_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2
+#define GLX_GPU_RAM_AMD 0x21A3
+#define GLX_GPU_CLOCK_AMD 0x21A4
+#define GLX_GPU_NUM_PIPES_AMD 0x21A5
+#define GLX_GPU_NUM_SIMD_AMD 0x21A6
+#define GLX_GPU_NUM_RB_AMD 0x21A7
+#define GLX_GPU_NUM_SPI_AMD 0x21A8
+#define GLX_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097
+#define GLX_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0
+#define GLX_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098
+#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001
+#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
+#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091
+#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092
+#define GLX_CONTEXT_FLAGS_ARB 0x2094
+#define GLX_CONTEXT_OPENGL_NO_ERROR_ARB 0x31B3
+#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
+#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
+#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126
+#define GLX_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004
+#define GLX_LOSE_CONTEXT_ON_RESET_ARB 0x8252
+#define GLX_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
+#define GLX_NO_RESET_NOTIFICATION_ARB 0x8261
+#define GLX_RGBA_FLOAT_TYPE_ARB 0x20B9
+#define GLX_RGBA_FLOAT_BIT_ARB 0x00000004
+#define GLX_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20B2
+#define GLX_SAMPLE_BUFFERS_ARB 100000
+#define GLX_SAMPLES_ARB 100001
+#define GLX_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008
+#define GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095
+#define GLX_BACK_BUFFER_AGE_EXT 0x20F4
+#define GLX_CONTEXT_PRIORITY_LEVEL_EXT 0x3100
+#define GLX_CONTEXT_PRIORITY_HIGH_EXT 0x3101
+#define GLX_CONTEXT_PRIORITY_MEDIUM_EXT 0x3102
+#define GLX_CONTEXT_PRIORITY_LOW_EXT 0x3103
+#define GLX_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004
+#define GLX_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004
+#define GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT 0x20B1
+#define GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT 0x00000008
+#define GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20B2
+#define GLX_SHARE_CONTEXT_EXT 0x800A
+#define GLX_VISUAL_ID_EXT 0x800B
+#define GLX_SCREEN_EXT 0x800C
+#define GLX_VENDOR_NAMES_EXT 0x20F6
+#define GLX_STEREO_TREE_EXT 0x20F5
+#define GLX_STEREO_NOTIFY_MASK_EXT 0x00000001
+#define GLX_STEREO_NOTIFY_EXT 0x00000000
+#define GLX_SWAP_INTERVAL_EXT 0x20F1
+#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2
+#define GLX_LATE_SWAPS_TEAR_EXT 0x20F3
+#define GLX_TEXTURE_1D_BIT_EXT 0x00000001
+#define GLX_TEXTURE_2D_BIT_EXT 0x00000002
+#define GLX_TEXTURE_RECTANGLE_BIT_EXT 0x00000004
+#define GLX_BIND_TO_TEXTURE_RGB_EXT 0x20D0
+#define GLX_BIND_TO_TEXTURE_RGBA_EXT 0x20D1
+#define GLX_BIND_TO_MIPMAP_TEXTURE_EXT 0x20D2
+#define GLX_BIND_TO_TEXTURE_TARGETS_EXT 0x20D3
+#define GLX_Y_INVERTED_EXT 0x20D4
+#define GLX_TEXTURE_FORMAT_EXT 0x20D5
+#define GLX_TEXTURE_TARGET_EXT 0x20D6
+#define GLX_MIPMAP_TEXTURE_EXT 0x20D7
+#define GLX_TEXTURE_FORMAT_NONE_EXT 0x20D8
+#define GLX_TEXTURE_FORMAT_RGB_EXT 0x20D9
+#define GLX_TEXTURE_FORMAT_RGBA_EXT 0x20DA
+#define GLX_TEXTURE_1D_EXT 0x20DB
+#define GLX_TEXTURE_2D_EXT 0x20DC
+#define GLX_TEXTURE_RECTANGLE_EXT 0x20DD
+#define GLX_FRONT_LEFT_EXT 0x20DE
+#define GLX_FRONT_RIGHT_EXT 0x20DF
+#define GLX_BACK_LEFT_EXT 0x20E0
+#define GLX_BACK_RIGHT_EXT 0x20E1
+#define GLX_FRONT_EXT 0x20DE
+#define GLX_BACK_EXT 0x20E0
+#define GLX_AUX0_EXT 0x20E2
+#define GLX_AUX1_EXT 0x20E3
+#define GLX_AUX2_EXT 0x20E4
+#define GLX_AUX3_EXT 0x20E5
+#define GLX_AUX4_EXT 0x20E6
+#define GLX_AUX5_EXT 0x20E7
+#define GLX_AUX6_EXT 0x20E8
+#define GLX_AUX7_EXT 0x20E9
+#define GLX_AUX8_EXT 0x20EA
+#define GLX_AUX9_EXT 0x20EB
+#define GLX_X_VISUAL_TYPE_EXT 0x22
+#define GLX_TRANSPARENT_TYPE_EXT 0x23
+#define GLX_TRANSPARENT_INDEX_VALUE_EXT 0x24
+#define GLX_TRANSPARENT_RED_VALUE_EXT 0x25
+#define GLX_TRANSPARENT_GREEN_VALUE_EXT 0x26
+#define GLX_TRANSPARENT_BLUE_VALUE_EXT 0x27
+#define GLX_TRANSPARENT_ALPHA_VALUE_EXT 0x28
+#define GLX_NONE_EXT 0x8000
+#define GLX_TRUE_COLOR_EXT 0x8002
+#define GLX_DIRECT_COLOR_EXT 0x8003
+#define GLX_PSEUDO_COLOR_EXT 0x8004
+#define GLX_STATIC_COLOR_EXT 0x8005
+#define GLX_GRAY_SCALE_EXT 0x8006
+#define GLX_STATIC_GRAY_EXT 0x8007
+#define GLX_TRANSPARENT_RGB_EXT 0x8008
+#define GLX_TRANSPARENT_INDEX_EXT 0x8009
+#define GLX_VISUAL_CAVEAT_EXT 0x20
+#define GLX_SLOW_VISUAL_EXT 0x8001
+#define GLX_NON_CONFORMANT_VISUAL_EXT 0x800D
+#define GLX_BUFFER_SWAP_COMPLETE_INTEL_MASK 0x04000000
+#define GLX_EXCHANGE_COMPLETE_INTEL 0x8180
+#define GLX_COPY_COMPLETE_INTEL 0x8181
+#define GLX_FLIP_COMPLETE_INTEL 0x8182
+#define GLX_RENDERER_VENDOR_ID_MESA 0x8183
+#define GLX_RENDERER_DEVICE_ID_MESA 0x8184
+#define GLX_RENDERER_VERSION_MESA 0x8185
+#define GLX_RENDERER_ACCELERATED_MESA 0x8186
+#define GLX_RENDERER_VIDEO_MEMORY_MESA 0x8187
+#define GLX_RENDERER_UNIFIED_MEMORY_ARCHITECTURE_MESA 0x8188
+#define GLX_RENDERER_PREFERRED_PROFILE_MESA 0x8189
+#define GLX_RENDERER_OPENGL_CORE_PROFILE_VERSION_MESA 0x818A
+#define GLX_RENDERER_OPENGL_COMPATIBILITY_PROFILE_VERSION_MESA 0x818B
+#define GLX_RENDERER_OPENGL_ES_PROFILE_VERSION_MESA 0x818C
+#define GLX_RENDERER_OPENGL_ES2_PROFILE_VERSION_MESA 0x818D
+#define GLX_3DFX_WINDOW_MODE_MESA 0x1
+#define GLX_3DFX_FULLSCREEN_MODE_MESA 0x2
+#define GLX_FLOAT_COMPONENTS_NV 0x20B0
+#define GLX_CONTEXT_MULTIGPU_ATTRIB_NV 0x20AA
+#define GLX_CONTEXT_MULTIGPU_ATTRIB_SINGLE_NV 0x20AB
+#define GLX_CONTEXT_MULTIGPU_ATTRIB_AFR_NV 0x20AC
+#define GLX_CONTEXT_MULTIGPU_ATTRIB_MULTICAST_NV 0x20AD
+#define GLX_CONTEXT_MULTIGPU_ATTRIB_MULTI_DISPLAY_MULTICAST_NV 0x20AE
+#define GLX_COVERAGE_SAMPLES_NV 100001
+#define GLX_COLOR_SAMPLES_NV 0x20B3
+#define GLX_NUM_VIDEO_SLOTS_NV 0x20F0
+#define GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x20F7
+#define GLX_DEVICE_ID_NV 0x20CD
+#define GLX_UNIQUE_ID_NV 0x20CE
+#define GLX_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF
+#define GLX_VIDEO_OUT_COLOR_NV 0x20C3
+#define GLX_VIDEO_OUT_ALPHA_NV 0x20C4
+#define GLX_VIDEO_OUT_DEPTH_NV 0x20C5
+#define GLX_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6
+#define GLX_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7
+#define GLX_VIDEO_OUT_FRAME_NV 0x20C8
+#define GLX_VIDEO_OUT_FIELD_1_NV 0x20C9
+#define GLX_VIDEO_OUT_FIELD_2_NV 0x20CA
+#define GLX_VIDEO_OUT_STACKED_FIELDS_1_2_NV 0x20CB
+#define GLX_VIDEO_OUT_STACKED_FIELDS_2_1_NV 0x20CC
+#define GLX_SWAP_METHOD_OML 0x8060
+#define GLX_SWAP_EXCHANGE_OML 0x8061
+#define GLX_SWAP_COPY_OML 0x8062
+#define GLX_SWAP_UNDEFINED_OML 0x8063
+#define GLX_BLENDED_RGBA_SGIS 0x8025
+#define GLX_SAMPLE_BUFFERS_SGIS 100000
+#define GLX_SAMPLES_SGIS 100001
+#define GLX_MULTISAMPLE_SUB_RECT_WIDTH_SGIS 0x8026
+#define GLX_MULTISAMPLE_SUB_RECT_HEIGHT_SGIS 0x8027
+#define GLX_DIGITAL_MEDIA_PBUFFER_SGIX 0x8024
+#define GLX_WINDOW_BIT_SGIX 0x00000001
+#define GLX_PIXMAP_BIT_SGIX 0x00000002
+#define GLX_RGBA_BIT_SGIX 0x00000001
+#define GLX_COLOR_INDEX_BIT_SGIX 0x00000002
+#define GLX_DRAWABLE_TYPE_SGIX 0x8010
+#define GLX_RENDER_TYPE_SGIX 0x8011
+#define GLX_X_RENDERABLE_SGIX 0x8012
+#define GLX_FBCONFIG_ID_SGIX 0x8013
+#define GLX_RGBA_TYPE_SGIX 0x8014
+#define GLX_COLOR_INDEX_TYPE_SGIX 0x8015
+#define GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX 80
+#define GLX_BAD_HYPERPIPE_CONFIG_SGIX 91
+#define GLX_BAD_HYPERPIPE_SGIX 92
+#define GLX_HYPERPIPE_DISPLAY_PIPE_SGIX 0x00000001
+#define GLX_HYPERPIPE_RENDER_PIPE_SGIX 0x00000002
+#define GLX_PIPE_RECT_SGIX 0x00000001
+#define GLX_PIPE_RECT_LIMITS_SGIX 0x00000002
+#define GLX_HYPERPIPE_STEREO_SGIX 0x00000003
+#define GLX_HYPERPIPE_PIXEL_AVERAGE_SGIX 0x00000004
+#define GLX_HYPERPIPE_ID_SGIX 0x8030
+#define GLX_PBUFFER_BIT_SGIX 0x00000004
+#define GLX_BUFFER_CLOBBER_MASK_SGIX 0x08000000
+#define GLX_FRONT_LEFT_BUFFER_BIT_SGIX 0x00000001
+#define GLX_FRONT_RIGHT_BUFFER_BIT_SGIX 0x00000002
+#define GLX_BACK_LEFT_BUFFER_BIT_SGIX 0x00000004
+#define GLX_BACK_RIGHT_BUFFER_BIT_SGIX 0x00000008
+#define GLX_AUX_BUFFERS_BIT_SGIX 0x00000010
+#define GLX_DEPTH_BUFFER_BIT_SGIX 0x00000020
+#define GLX_STENCIL_BUFFER_BIT_SGIX 0x00000040
+#define GLX_ACCUM_BUFFER_BIT_SGIX 0x00000080
+#define GLX_SAMPLE_BUFFERS_BIT_SGIX 0x00000100
+#define GLX_MAX_PBUFFER_WIDTH_SGIX 0x8016
+#define GLX_MAX_PBUFFER_HEIGHT_SGIX 0x8017
+#define GLX_MAX_PBUFFER_PIXELS_SGIX 0x8018
+#define GLX_OPTIMAL_PBUFFER_WIDTH_SGIX 0x8019
+#define GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX 0x801A
+#define GLX_PRESERVED_CONTENTS_SGIX 0x801B
+#define GLX_LARGEST_PBUFFER_SGIX 0x801C
+#define GLX_WIDTH_SGIX 0x801D
+#define GLX_HEIGHT_SGIX 0x801E
+#define GLX_EVENT_MASK_SGIX 0x801F
+#define GLX_DAMAGED_SGIX 0x8020
+#define GLX_SAVED_SGIX 0x8021
+#define GLX_WINDOW_SGIX 0x8022
+#define GLX_PBUFFER_SGIX 0x8023
+#define GLX_SYNC_FRAME_SGIX 0x00000000
+#define GLX_SYNC_SWAP_SGIX 0x00000001
+#define GLX_VISUAL_SELECT_GROUP_SGIX 0x8028
+#ifndef GLX_3DFX_multisample
+#define GLX_3DFX_multisample 1
+GLAPI int GLAD_GLX_3DFX_multisample;
+#endif
+#ifndef GLX_AMD_gpu_association
+#define GLX_AMD_gpu_association 1
+GLAPI int GLAD_GLX_AMD_gpu_association;
+typedef unsigned int (APIENTRYP PFNGLXGETGPUIDSAMDPROC)(unsigned int maxCount, unsigned int *ids);
+GLAPI PFNGLXGETGPUIDSAMDPROC glad_glXGetGPUIDsAMD;
+#define glXGetGPUIDsAMD glad_glXGetGPUIDsAMD
+typedef int (APIENTRYP PFNGLXGETGPUINFOAMDPROC)(unsigned int id, int property, GLenum dataType, unsigned int size, void *data);
+GLAPI PFNGLXGETGPUINFOAMDPROC glad_glXGetGPUInfoAMD;
+#define glXGetGPUInfoAMD glad_glXGetGPUInfoAMD
+typedef unsigned int (APIENTRYP PFNGLXGETCONTEXTGPUIDAMDPROC)(GLXContext ctx);
+GLAPI PFNGLXGETCONTEXTGPUIDAMDPROC glad_glXGetContextGPUIDAMD;
+#define glXGetContextGPUIDAMD glad_glXGetContextGPUIDAMD
+typedef GLXContext (APIENTRYP PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC)(unsigned int id, GLXContext share_list);
+GLAPI PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC glad_glXCreateAssociatedContextAMD;
+#define glXCreateAssociatedContextAMD glad_glXCreateAssociatedContextAMD
+typedef GLXContext (APIENTRYP PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)(unsigned int id, GLXContext share_context, const int *attribList);
+GLAPI PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC glad_glXCreateAssociatedContextAttribsAMD;
+#define glXCreateAssociatedContextAttribsAMD glad_glXCreateAssociatedContextAttribsAMD
+typedef Bool (APIENTRYP PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC)(GLXContext ctx);
+GLAPI PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC glad_glXDeleteAssociatedContextAMD;
+#define glXDeleteAssociatedContextAMD glad_glXDeleteAssociatedContextAMD
+typedef Bool (APIENTRYP PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)(GLXContext ctx);
+GLAPI PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC glad_glXMakeAssociatedContextCurrentAMD;
+#define glXMakeAssociatedContextCurrentAMD glad_glXMakeAssociatedContextCurrentAMD
+typedef GLXContext (APIENTRYP PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC)(void);
+GLAPI PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC glad_glXGetCurrentAssociatedContextAMD;
+#define glXGetCurrentAssociatedContextAMD glad_glXGetCurrentAssociatedContextAMD
+typedef void (APIENTRYP PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC)(GLXContext dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+GLAPI PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC glad_glXBlitContextFramebufferAMD;
+#define glXBlitContextFramebufferAMD glad_glXBlitContextFramebufferAMD
+#endif
+#ifndef GLX_ARB_context_flush_control
+#define GLX_ARB_context_flush_control 1
+GLAPI int GLAD_GLX_ARB_context_flush_control;
+#endif
+#ifndef GLX_ARB_create_context
+#define GLX_ARB_create_context 1
+GLAPI int GLAD_GLX_ARB_create_context;
+typedef GLXContext (APIENTRYP PFNGLXCREATECONTEXTATTRIBSARBPROC)(Display *dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int *attrib_list);
+GLAPI PFNGLXCREATECONTEXTATTRIBSARBPROC glad_glXCreateContextAttribsARB;
+#define glXCreateContextAttribsARB glad_glXCreateContextAttribsARB
+#endif
+#ifndef GLX_ARB_create_context_no_error
+#define GLX_ARB_create_context_no_error 1
+GLAPI int GLAD_GLX_ARB_create_context_no_error;
+#endif
+#ifndef GLX_ARB_create_context_profile
+#define GLX_ARB_create_context_profile 1
+GLAPI int GLAD_GLX_ARB_create_context_profile;
+#endif
+#ifndef GLX_ARB_create_context_robustness
+#define GLX_ARB_create_context_robustness 1
+GLAPI int GLAD_GLX_ARB_create_context_robustness;
+#endif
+#ifndef GLX_ARB_fbconfig_float
+#define GLX_ARB_fbconfig_float 1
+GLAPI int GLAD_GLX_ARB_fbconfig_float;
+#endif
+#ifndef GLX_ARB_framebuffer_sRGB
+#define GLX_ARB_framebuffer_sRGB 1
+GLAPI int GLAD_GLX_ARB_framebuffer_sRGB;
+#endif
+#ifndef GLX_ARB_get_proc_address
+#define GLX_ARB_get_proc_address 1
+GLAPI int GLAD_GLX_ARB_get_proc_address;
+typedef __GLXextFuncPtr (APIENTRYP PFNGLXGETPROCADDRESSARBPROC)(const GLubyte *procName);
+GLAPI PFNGLXGETPROCADDRESSARBPROC glad_glXGetProcAddressARB;
+#define glXGetProcAddressARB glad_glXGetProcAddressARB
+#endif
+#ifndef GLX_ARB_multisample
+#define GLX_ARB_multisample 1
+GLAPI int GLAD_GLX_ARB_multisample;
+#endif
+#ifndef GLX_ARB_robustness_application_isolation
+#define GLX_ARB_robustness_application_isolation 1
+GLAPI int GLAD_GLX_ARB_robustness_application_isolation;
+#endif
+#ifndef GLX_ARB_robustness_share_group_isolation
+#define GLX_ARB_robustness_share_group_isolation 1
+GLAPI int GLAD_GLX_ARB_robustness_share_group_isolation;
+#endif
+#ifndef GLX_ARB_vertex_buffer_object
+#define GLX_ARB_vertex_buffer_object 1
+GLAPI int GLAD_GLX_ARB_vertex_buffer_object;
+#endif
+#ifndef GLX_EXT_buffer_age
+#define GLX_EXT_buffer_age 1
+GLAPI int GLAD_GLX_EXT_buffer_age;
+#endif
+#ifndef GLX_EXT_context_priority
+#define GLX_EXT_context_priority 1
+GLAPI int GLAD_GLX_EXT_context_priority;
+#endif
+#ifndef GLX_EXT_create_context_es2_profile
+#define GLX_EXT_create_context_es2_profile 1
+GLAPI int GLAD_GLX_EXT_create_context_es2_profile;
+#endif
+#ifndef GLX_EXT_create_context_es_profile
+#define GLX_EXT_create_context_es_profile 1
+GLAPI int GLAD_GLX_EXT_create_context_es_profile;
+#endif
+#ifndef GLX_EXT_fbconfig_packed_float
+#define GLX_EXT_fbconfig_packed_float 1
+GLAPI int GLAD_GLX_EXT_fbconfig_packed_float;
+#endif
+#ifndef GLX_EXT_framebuffer_sRGB
+#define GLX_EXT_framebuffer_sRGB 1
+GLAPI int GLAD_GLX_EXT_framebuffer_sRGB;
+#endif
+#ifndef GLX_EXT_import_context
+#define GLX_EXT_import_context 1
+GLAPI int GLAD_GLX_EXT_import_context;
+typedef Display * (APIENTRYP PFNGLXGETCURRENTDISPLAYEXTPROC)(void);
+GLAPI PFNGLXGETCURRENTDISPLAYEXTPROC glad_glXGetCurrentDisplayEXT;
+#define glXGetCurrentDisplayEXT glad_glXGetCurrentDisplayEXT
+typedef int (APIENTRYP PFNGLXQUERYCONTEXTINFOEXTPROC)(Display *dpy, GLXContext context, int attribute, int *value);
+GLAPI PFNGLXQUERYCONTEXTINFOEXTPROC glad_glXQueryContextInfoEXT;
+#define glXQueryContextInfoEXT glad_glXQueryContextInfoEXT
+typedef GLXContextID (APIENTRYP PFNGLXGETCONTEXTIDEXTPROC)(const GLXContext context);
+GLAPI PFNGLXGETCONTEXTIDEXTPROC glad_glXGetContextIDEXT;
+#define glXGetContextIDEXT glad_glXGetContextIDEXT
+typedef GLXContext (APIENTRYP PFNGLXIMPORTCONTEXTEXTPROC)(Display *dpy, GLXContextID contextID);
+GLAPI PFNGLXIMPORTCONTEXTEXTPROC glad_glXImportContextEXT;
+#define glXImportContextEXT glad_glXImportContextEXT
+typedef void (APIENTRYP PFNGLXFREECONTEXTEXTPROC)(Display *dpy, GLXContext context);
+GLAPI PFNGLXFREECONTEXTEXTPROC glad_glXFreeContextEXT;
+#define glXFreeContextEXT glad_glXFreeContextEXT
+#endif
+#ifndef GLX_EXT_libglvnd
+#define GLX_EXT_libglvnd 1
+GLAPI int GLAD_GLX_EXT_libglvnd;
+#endif
+#ifndef GLX_EXT_no_config_context
+#define GLX_EXT_no_config_context 1
+GLAPI int GLAD_GLX_EXT_no_config_context;
+#endif
+#ifndef GLX_EXT_stereo_tree
+#define GLX_EXT_stereo_tree 1
+GLAPI int GLAD_GLX_EXT_stereo_tree;
+#endif
+#ifndef GLX_EXT_swap_control
+#define GLX_EXT_swap_control 1
+GLAPI int GLAD_GLX_EXT_swap_control;
+typedef void (APIENTRYP PFNGLXSWAPINTERVALEXTPROC)(Display *dpy, GLXDrawable drawable, int interval);
+GLAPI PFNGLXSWAPINTERVALEXTPROC glad_glXSwapIntervalEXT;
+#define glXSwapIntervalEXT glad_glXSwapIntervalEXT
+#endif
+#ifndef GLX_EXT_swap_control_tear
+#define GLX_EXT_swap_control_tear 1
+GLAPI int GLAD_GLX_EXT_swap_control_tear;
+#endif
+#ifndef GLX_EXT_texture_from_pixmap
+#define GLX_EXT_texture_from_pixmap 1
+GLAPI int GLAD_GLX_EXT_texture_from_pixmap;
+typedef void (APIENTRYP PFNGLXBINDTEXIMAGEEXTPROC)(Display *dpy, GLXDrawable drawable, int buffer, const int *attrib_list);
+GLAPI PFNGLXBINDTEXIMAGEEXTPROC glad_glXBindTexImageEXT;
+#define glXBindTexImageEXT glad_glXBindTexImageEXT
+typedef void (APIENTRYP PFNGLXRELEASETEXIMAGEEXTPROC)(Display *dpy, GLXDrawable drawable, int buffer);
+GLAPI PFNGLXRELEASETEXIMAGEEXTPROC glad_glXReleaseTexImageEXT;
+#define glXReleaseTexImageEXT glad_glXReleaseTexImageEXT
+#endif
+#ifndef GLX_EXT_visual_info
+#define GLX_EXT_visual_info 1
+GLAPI int GLAD_GLX_EXT_visual_info;
+#endif
+#ifndef GLX_EXT_visual_rating
+#define GLX_EXT_visual_rating 1
+GLAPI int GLAD_GLX_EXT_visual_rating;
+#endif
+#ifndef GLX_INTEL_swap_event
+#define GLX_INTEL_swap_event 1
+GLAPI int GLAD_GLX_INTEL_swap_event;
+#endif
+#ifndef GLX_MESA_agp_offset
+#define GLX_MESA_agp_offset 1
+GLAPI int GLAD_GLX_MESA_agp_offset;
+typedef unsigned int (APIENTRYP PFNGLXGETAGPOFFSETMESAPROC)(const void *pointer);
+GLAPI PFNGLXGETAGPOFFSETMESAPROC glad_glXGetAGPOffsetMESA;
+#define glXGetAGPOffsetMESA glad_glXGetAGPOffsetMESA
+#endif
+#ifndef GLX_MESA_copy_sub_buffer
+#define GLX_MESA_copy_sub_buffer 1
+GLAPI int GLAD_GLX_MESA_copy_sub_buffer;
+typedef void (APIENTRYP PFNGLXCOPYSUBBUFFERMESAPROC)(Display *dpy, GLXDrawable drawable, int x, int y, int width, int height);
+GLAPI PFNGLXCOPYSUBBUFFERMESAPROC glad_glXCopySubBufferMESA;
+#define glXCopySubBufferMESA glad_glXCopySubBufferMESA
+#endif
+#ifndef GLX_MESA_pixmap_colormap
+#define GLX_MESA_pixmap_colormap 1
+GLAPI int GLAD_GLX_MESA_pixmap_colormap;
+typedef GLXPixmap (APIENTRYP PFNGLXCREATEGLXPIXMAPMESAPROC)(Display *dpy, XVisualInfo *visual, Pixmap pixmap, Colormap cmap);
+GLAPI PFNGLXCREATEGLXPIXMAPMESAPROC glad_glXCreateGLXPixmapMESA;
+#define glXCreateGLXPixmapMESA glad_glXCreateGLXPixmapMESA
+#endif
+#ifndef GLX_MESA_query_renderer
+#define GLX_MESA_query_renderer 1
+GLAPI int GLAD_GLX_MESA_query_renderer;
+typedef Bool (APIENTRYP PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)(int attribute, unsigned int *value);
+GLAPI PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC glad_glXQueryCurrentRendererIntegerMESA;
+#define glXQueryCurrentRendererIntegerMESA glad_glXQueryCurrentRendererIntegerMESA
+typedef const char * (APIENTRYP PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC)(int attribute);
+GLAPI PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC glad_glXQueryCurrentRendererStringMESA;
+#define glXQueryCurrentRendererStringMESA glad_glXQueryCurrentRendererStringMESA
+typedef Bool (APIENTRYP PFNGLXQUERYRENDERERINTEGERMESAPROC)(Display *dpy, int screen, int renderer, int attribute, unsigned int *value);
+GLAPI PFNGLXQUERYRENDERERINTEGERMESAPROC glad_glXQueryRendererIntegerMESA;
+#define glXQueryRendererIntegerMESA glad_glXQueryRendererIntegerMESA
+typedef const char * (APIENTRYP PFNGLXQUERYRENDERERSTRINGMESAPROC)(Display *dpy, int screen, int renderer, int attribute);
+GLAPI PFNGLXQUERYRENDERERSTRINGMESAPROC glad_glXQueryRendererStringMESA;
+#define glXQueryRendererStringMESA glad_glXQueryRendererStringMESA
+#endif
+#ifndef GLX_MESA_release_buffers
+#define GLX_MESA_release_buffers 1
+GLAPI int GLAD_GLX_MESA_release_buffers;
+typedef Bool (APIENTRYP PFNGLXRELEASEBUFFERSMESAPROC)(Display *dpy, GLXDrawable drawable);
+GLAPI PFNGLXRELEASEBUFFERSMESAPROC glad_glXReleaseBuffersMESA;
+#define glXReleaseBuffersMESA glad_glXReleaseBuffersMESA
+#endif
+#ifndef GLX_MESA_set_3dfx_mode
+#define GLX_MESA_set_3dfx_mode 1
+GLAPI int GLAD_GLX_MESA_set_3dfx_mode;
+typedef GLboolean (APIENTRYP PFNGLXSET3DFXMODEMESAPROC)(GLint mode);
+GLAPI PFNGLXSET3DFXMODEMESAPROC glad_glXSet3DfxModeMESA;
+#define glXSet3DfxModeMESA glad_glXSet3DfxModeMESA
+#endif
+#ifndef GLX_MESA_swap_control
+#define GLX_MESA_swap_control 1
+GLAPI int GLAD_GLX_MESA_swap_control;
+typedef int (APIENTRYP PFNGLXGETSWAPINTERVALMESAPROC)(void);
+GLAPI PFNGLXGETSWAPINTERVALMESAPROC glad_glXGetSwapIntervalMESA;
+#define glXGetSwapIntervalMESA glad_glXGetSwapIntervalMESA
+typedef int (APIENTRYP PFNGLXSWAPINTERVALMESAPROC)(unsigned int interval);
+GLAPI PFNGLXSWAPINTERVALMESAPROC glad_glXSwapIntervalMESA;
+#define glXSwapIntervalMESA glad_glXSwapIntervalMESA
+#endif
+#ifndef GLX_NV_copy_buffer
+#define GLX_NV_copy_buffer 1
+GLAPI int GLAD_GLX_NV_copy_buffer;
+typedef void (APIENTRYP PFNGLXCOPYBUFFERSUBDATANVPROC)(Display *dpy, GLXContext readCtx, GLXContext writeCtx, GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+GLAPI PFNGLXCOPYBUFFERSUBDATANVPROC glad_glXCopyBufferSubDataNV;
+#define glXCopyBufferSubDataNV glad_glXCopyBufferSubDataNV
+typedef void (APIENTRYP PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC)(Display *dpy, GLXContext readCtx, GLXContext writeCtx, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
+GLAPI PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC glad_glXNamedCopyBufferSubDataNV;
+#define glXNamedCopyBufferSubDataNV glad_glXNamedCopyBufferSubDataNV
+#endif
+#ifndef GLX_NV_copy_image
+#define GLX_NV_copy_image 1
+GLAPI int GLAD_GLX_NV_copy_image;
+typedef void (APIENTRYP PFNGLXCOPYIMAGESUBDATANVPROC)(Display *dpy, GLXContext srcCtx, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLXContext dstCtx, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);
+GLAPI PFNGLXCOPYIMAGESUBDATANVPROC glad_glXCopyImageSubDataNV;
+#define glXCopyImageSubDataNV glad_glXCopyImageSubDataNV
+#endif
+#ifndef GLX_NV_delay_before_swap
+#define GLX_NV_delay_before_swap 1
+GLAPI int GLAD_GLX_NV_delay_before_swap;
+typedef Bool (APIENTRYP PFNGLXDELAYBEFORESWAPNVPROC)(Display *dpy, GLXDrawable drawable, GLfloat seconds);
+GLAPI PFNGLXDELAYBEFORESWAPNVPROC glad_glXDelayBeforeSwapNV;
+#define glXDelayBeforeSwapNV glad_glXDelayBeforeSwapNV
+#endif
+#ifndef GLX_NV_float_buffer
+#define GLX_NV_float_buffer 1
+GLAPI int GLAD_GLX_NV_float_buffer;
+#endif
+#ifndef GLX_NV_multigpu_context
+#define GLX_NV_multigpu_context 1
+GLAPI int GLAD_GLX_NV_multigpu_context;
+#endif
+#ifndef GLX_NV_multisample_coverage
+#define GLX_NV_multisample_coverage 1
+GLAPI int GLAD_GLX_NV_multisample_coverage;
+#endif
+#ifndef GLX_NV_present_video
+#define GLX_NV_present_video 1
+GLAPI int GLAD_GLX_NV_present_video;
+typedef unsigned int * (APIENTRYP PFNGLXENUMERATEVIDEODEVICESNVPROC)(Display *dpy, int screen, int *nelements);
+GLAPI PFNGLXENUMERATEVIDEODEVICESNVPROC glad_glXEnumerateVideoDevicesNV;
+#define glXEnumerateVideoDevicesNV glad_glXEnumerateVideoDevicesNV
+typedef int (APIENTRYP PFNGLXBINDVIDEODEVICENVPROC)(Display *dpy, unsigned int video_slot, unsigned int video_device, const int *attrib_list);
+GLAPI PFNGLXBINDVIDEODEVICENVPROC glad_glXBindVideoDeviceNV;
+#define glXBindVideoDeviceNV glad_glXBindVideoDeviceNV
+#endif
+#ifndef GLX_NV_robustness_video_memory_purge
+#define GLX_NV_robustness_video_memory_purge 1
+GLAPI int GLAD_GLX_NV_robustness_video_memory_purge;
+#endif
+#ifndef GLX_NV_swap_group
+#define GLX_NV_swap_group 1
+GLAPI int GLAD_GLX_NV_swap_group;
+typedef Bool (APIENTRYP PFNGLXJOINSWAPGROUPNVPROC)(Display *dpy, GLXDrawable drawable, GLuint group);
+GLAPI PFNGLXJOINSWAPGROUPNVPROC glad_glXJoinSwapGroupNV;
+#define glXJoinSwapGroupNV glad_glXJoinSwapGroupNV
+typedef Bool (APIENTRYP PFNGLXBINDSWAPBARRIERNVPROC)(Display *dpy, GLuint group, GLuint barrier);
+GLAPI PFNGLXBINDSWAPBARRIERNVPROC glad_glXBindSwapBarrierNV;
+#define glXBindSwapBarrierNV glad_glXBindSwapBarrierNV
+typedef Bool (APIENTRYP PFNGLXQUERYSWAPGROUPNVPROC)(Display *dpy, GLXDrawable drawable, GLuint *group, GLuint *barrier);
+GLAPI PFNGLXQUERYSWAPGROUPNVPROC glad_glXQuerySwapGroupNV;
+#define glXQuerySwapGroupNV glad_glXQuerySwapGroupNV
+typedef Bool (APIENTRYP PFNGLXQUERYMAXSWAPGROUPSNVPROC)(Display *dpy, int screen, GLuint *maxGroups, GLuint *maxBarriers);
+GLAPI PFNGLXQUERYMAXSWAPGROUPSNVPROC glad_glXQueryMaxSwapGroupsNV;
+#define glXQueryMaxSwapGroupsNV glad_glXQueryMaxSwapGroupsNV
+typedef Bool (APIENTRYP PFNGLXQUERYFRAMECOUNTNVPROC)(Display *dpy, int screen, GLuint *count);
+GLAPI PFNGLXQUERYFRAMECOUNTNVPROC glad_glXQueryFrameCountNV;
+#define glXQueryFrameCountNV glad_glXQueryFrameCountNV
+typedef Bool (APIENTRYP PFNGLXRESETFRAMECOUNTNVPROC)(Display *dpy, int screen);
+GLAPI PFNGLXRESETFRAMECOUNTNVPROC glad_glXResetFrameCountNV;
+#define glXResetFrameCountNV glad_glXResetFrameCountNV
+#endif
+#ifndef GLX_NV_video_capture
+#define GLX_NV_video_capture 1
+GLAPI int GLAD_GLX_NV_video_capture;
+typedef int (APIENTRYP PFNGLXBINDVIDEOCAPTUREDEVICENVPROC)(Display *dpy, unsigned int video_capture_slot, GLXVideoCaptureDeviceNV device);
+GLAPI PFNGLXBINDVIDEOCAPTUREDEVICENVPROC glad_glXBindVideoCaptureDeviceNV;
+#define glXBindVideoCaptureDeviceNV glad_glXBindVideoCaptureDeviceNV
+typedef GLXVideoCaptureDeviceNV * (APIENTRYP PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC)(Display *dpy, int screen, int *nelements);
+GLAPI PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC glad_glXEnumerateVideoCaptureDevicesNV;
+#define glXEnumerateVideoCaptureDevicesNV glad_glXEnumerateVideoCaptureDevicesNV
+typedef void (APIENTRYP PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC)(Display *dpy, GLXVideoCaptureDeviceNV device);
+GLAPI PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC glad_glXLockVideoCaptureDeviceNV;
+#define glXLockVideoCaptureDeviceNV glad_glXLockVideoCaptureDeviceNV
+typedef int (APIENTRYP PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC)(Display *dpy, GLXVideoCaptureDeviceNV device, int attribute, int *value);
+GLAPI PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC glad_glXQueryVideoCaptureDeviceNV;
+#define glXQueryVideoCaptureDeviceNV glad_glXQueryVideoCaptureDeviceNV
+typedef void (APIENTRYP PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC)(Display *dpy, GLXVideoCaptureDeviceNV device);
+GLAPI PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC glad_glXReleaseVideoCaptureDeviceNV;
+#define glXReleaseVideoCaptureDeviceNV glad_glXReleaseVideoCaptureDeviceNV
+#endif
+#ifndef GLX_NV_video_out
+#define GLX_NV_video_out 1
+GLAPI int GLAD_GLX_NV_video_out;
+typedef int (APIENTRYP PFNGLXGETVIDEODEVICENVPROC)(Display *dpy, int screen, int numVideoDevices, GLXVideoDeviceNV *pVideoDevice);
+GLAPI PFNGLXGETVIDEODEVICENVPROC glad_glXGetVideoDeviceNV;
+#define glXGetVideoDeviceNV glad_glXGetVideoDeviceNV
+typedef int (APIENTRYP PFNGLXRELEASEVIDEODEVICENVPROC)(Display *dpy, int screen, GLXVideoDeviceNV VideoDevice);
+GLAPI PFNGLXRELEASEVIDEODEVICENVPROC glad_glXReleaseVideoDeviceNV;
+#define glXReleaseVideoDeviceNV glad_glXReleaseVideoDeviceNV
+typedef int (APIENTRYP PFNGLXBINDVIDEOIMAGENVPROC)(Display *dpy, GLXVideoDeviceNV VideoDevice, GLXPbuffer pbuf, int iVideoBuffer);
+GLAPI PFNGLXBINDVIDEOIMAGENVPROC glad_glXBindVideoImageNV;
+#define glXBindVideoImageNV glad_glXBindVideoImageNV
+typedef int (APIENTRYP PFNGLXRELEASEVIDEOIMAGENVPROC)(Display *dpy, GLXPbuffer pbuf);
+GLAPI PFNGLXRELEASEVIDEOIMAGENVPROC glad_glXReleaseVideoImageNV;
+#define glXReleaseVideoImageNV glad_glXReleaseVideoImageNV
+typedef int (APIENTRYP PFNGLXSENDPBUFFERTOVIDEONVPROC)(Display *dpy, GLXPbuffer pbuf, int iBufferType, unsigned long *pulCounterPbuffer, GLboolean bBlock);
+GLAPI PFNGLXSENDPBUFFERTOVIDEONVPROC glad_glXSendPbufferToVideoNV;
+#define glXSendPbufferToVideoNV glad_glXSendPbufferToVideoNV
+typedef int (APIENTRYP PFNGLXGETVIDEOINFONVPROC)(Display *dpy, int screen, GLXVideoDeviceNV VideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo);
+GLAPI PFNGLXGETVIDEOINFONVPROC glad_glXGetVideoInfoNV;
+#define glXGetVideoInfoNV glad_glXGetVideoInfoNV
+#endif
+#ifndef GLX_OML_swap_method
+#define GLX_OML_swap_method 1
+GLAPI int GLAD_GLX_OML_swap_method;
+#endif
+#ifndef GLX_OML_sync_control
+#define GLX_OML_sync_control 1
+GLAPI int GLAD_GLX_OML_sync_control;
+typedef Bool (APIENTRYP PFNGLXGETSYNCVALUESOMLPROC)(Display *dpy, GLXDrawable drawable, int64_t *ust, int64_t *msc, int64_t *sbc);
+GLAPI PFNGLXGETSYNCVALUESOMLPROC glad_glXGetSyncValuesOML;
+#define glXGetSyncValuesOML glad_glXGetSyncValuesOML
+typedef Bool (APIENTRYP PFNGLXGETMSCRATEOMLPROC)(Display *dpy, GLXDrawable drawable, int32_t *numerator, int32_t *denominator);
+GLAPI PFNGLXGETMSCRATEOMLPROC glad_glXGetMscRateOML;
+#define glXGetMscRateOML glad_glXGetMscRateOML
+typedef int64_t (APIENTRYP PFNGLXSWAPBUFFERSMSCOMLPROC)(Display *dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder);
+GLAPI PFNGLXSWAPBUFFERSMSCOMLPROC glad_glXSwapBuffersMscOML;
+#define glXSwapBuffersMscOML glad_glXSwapBuffersMscOML
+typedef Bool (APIENTRYP PFNGLXWAITFORMSCOMLPROC)(Display *dpy, GLXDrawable drawable, int64_t target_msc, int64_t divisor, int64_t remainder, int64_t *ust, int64_t *msc, int64_t *sbc);
+GLAPI PFNGLXWAITFORMSCOMLPROC glad_glXWaitForMscOML;
+#define glXWaitForMscOML glad_glXWaitForMscOML
+typedef Bool (APIENTRYP PFNGLXWAITFORSBCOMLPROC)(Display *dpy, GLXDrawable drawable, int64_t target_sbc, int64_t *ust, int64_t *msc, int64_t *sbc);
+GLAPI PFNGLXWAITFORSBCOMLPROC glad_glXWaitForSbcOML;
+#define glXWaitForSbcOML glad_glXWaitForSbcOML
+#endif
+#ifndef GLX_SGIS_blended_overlay
+#define GLX_SGIS_blended_overlay 1
+GLAPI int GLAD_GLX_SGIS_blended_overlay;
+#endif
+#ifndef GLX_SGIS_multisample
+#define GLX_SGIS_multisample 1
+GLAPI int GLAD_GLX_SGIS_multisample;
+#endif
+#ifndef GLX_SGIS_shared_multisample
+#define GLX_SGIS_shared_multisample 1
+GLAPI int GLAD_GLX_SGIS_shared_multisample;
+#endif
+#ifndef GLX_SGIX_dmbuffer
+#define GLX_SGIX_dmbuffer 1
+GLAPI int GLAD_GLX_SGIX_dmbuffer;
+#ifdef _DM_BUFFER_H_
+typedef Bool (APIENTRYP PFNGLXASSOCIATEDMPBUFFERSGIXPROC)(Display *dpy, GLXPbufferSGIX pbuffer, DMparams *params, DMbuffer dmbuffer);
+GLAPI PFNGLXASSOCIATEDMPBUFFERSGIXPROC glad_glXAssociateDMPbufferSGIX;
+#define glXAssociateDMPbufferSGIX glad_glXAssociateDMPbufferSGIX
+#endif
+#endif
+#ifndef GLX_SGIX_fbconfig
+#define GLX_SGIX_fbconfig 1
+GLAPI int GLAD_GLX_SGIX_fbconfig;
+typedef int (APIENTRYP PFNGLXGETFBCONFIGATTRIBSGIXPROC)(Display *dpy, GLXFBConfigSGIX config, int attribute, int *value);
+GLAPI PFNGLXGETFBCONFIGATTRIBSGIXPROC glad_glXGetFBConfigAttribSGIX;
+#define glXGetFBConfigAttribSGIX glad_glXGetFBConfigAttribSGIX
+typedef GLXFBConfigSGIX * (APIENTRYP PFNGLXCHOOSEFBCONFIGSGIXPROC)(Display *dpy, int screen, int *attrib_list, int *nelements);
+GLAPI PFNGLXCHOOSEFBCONFIGSGIXPROC glad_glXChooseFBConfigSGIX;
+#define glXChooseFBConfigSGIX glad_glXChooseFBConfigSGIX
+typedef GLXPixmap (APIENTRYP PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)(Display *dpy, GLXFBConfigSGIX config, Pixmap pixmap);
+GLAPI PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC glad_glXCreateGLXPixmapWithConfigSGIX;
+#define glXCreateGLXPixmapWithConfigSGIX glad_glXCreateGLXPixmapWithConfigSGIX
+typedef GLXContext (APIENTRYP PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)(Display *dpy, GLXFBConfigSGIX config, int render_type, GLXContext share_list, Bool direct);
+GLAPI PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC glad_glXCreateContextWithConfigSGIX;
+#define glXCreateContextWithConfigSGIX glad_glXCreateContextWithConfigSGIX
+typedef XVisualInfo * (APIENTRYP PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)(Display *dpy, GLXFBConfigSGIX config);
+GLAPI PFNGLXGETVISUALFROMFBCONFIGSGIXPROC glad_glXGetVisualFromFBConfigSGIX;
+#define glXGetVisualFromFBConfigSGIX glad_glXGetVisualFromFBConfigSGIX
+typedef GLXFBConfigSGIX (APIENTRYP PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)(Display *dpy, XVisualInfo *vis);
+GLAPI PFNGLXGETFBCONFIGFROMVISUALSGIXPROC glad_glXGetFBConfigFromVisualSGIX;
+#define glXGetFBConfigFromVisualSGIX glad_glXGetFBConfigFromVisualSGIX
+#endif
+#ifndef GLX_SGIX_hyperpipe
+#define GLX_SGIX_hyperpipe 1
+GLAPI int GLAD_GLX_SGIX_hyperpipe;
+typedef GLXHyperpipeNetworkSGIX * (APIENTRYP PFNGLXQUERYHYPERPIPENETWORKSGIXPROC)(Display *dpy, int *npipes);
+GLAPI PFNGLXQUERYHYPERPIPENETWORKSGIXPROC glad_glXQueryHyperpipeNetworkSGIX;
+#define glXQueryHyperpipeNetworkSGIX glad_glXQueryHyperpipeNetworkSGIX
+typedef int (APIENTRYP PFNGLXHYPERPIPECONFIGSGIXPROC)(Display *dpy, int networkId, int npipes, GLXHyperpipeConfigSGIX *cfg, int *hpId);
+GLAPI PFNGLXHYPERPIPECONFIGSGIXPROC glad_glXHyperpipeConfigSGIX;
+#define glXHyperpipeConfigSGIX glad_glXHyperpipeConfigSGIX
+typedef GLXHyperpipeConfigSGIX * (APIENTRYP PFNGLXQUERYHYPERPIPECONFIGSGIXPROC)(Display *dpy, int hpId, int *npipes);
+GLAPI PFNGLXQUERYHYPERPIPECONFIGSGIXPROC glad_glXQueryHyperpipeConfigSGIX;
+#define glXQueryHyperpipeConfigSGIX glad_glXQueryHyperpipeConfigSGIX
+typedef int (APIENTRYP PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC)(Display *dpy, int hpId);
+GLAPI PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC glad_glXDestroyHyperpipeConfigSGIX;
+#define glXDestroyHyperpipeConfigSGIX glad_glXDestroyHyperpipeConfigSGIX
+typedef int (APIENTRYP PFNGLXBINDHYPERPIPESGIXPROC)(Display *dpy, int hpId);
+GLAPI PFNGLXBINDHYPERPIPESGIXPROC glad_glXBindHyperpipeSGIX;
+#define glXBindHyperpipeSGIX glad_glXBindHyperpipeSGIX
+typedef int (APIENTRYP PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC)(Display *dpy, int timeSlice, int attrib, int size, void *attribList, void *returnAttribList);
+GLAPI PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC glad_glXQueryHyperpipeBestAttribSGIX;
+#define glXQueryHyperpipeBestAttribSGIX glad_glXQueryHyperpipeBestAttribSGIX
+typedef int (APIENTRYP PFNGLXHYPERPIPEATTRIBSGIXPROC)(Display *dpy, int timeSlice, int attrib, int size, void *attribList);
+GLAPI PFNGLXHYPERPIPEATTRIBSGIXPROC glad_glXHyperpipeAttribSGIX;
+#define glXHyperpipeAttribSGIX glad_glXHyperpipeAttribSGIX
+typedef int (APIENTRYP PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC)(Display *dpy, int timeSlice, int attrib, int size, void *returnAttribList);
+GLAPI PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC glad_glXQueryHyperpipeAttribSGIX;
+#define glXQueryHyperpipeAttribSGIX glad_glXQueryHyperpipeAttribSGIX
+#endif
+#ifndef GLX_SGIX_pbuffer
+#define GLX_SGIX_pbuffer 1
+GLAPI int GLAD_GLX_SGIX_pbuffer;
+typedef GLXPbufferSGIX (APIENTRYP PFNGLXCREATEGLXPBUFFERSGIXPROC)(Display *dpy, GLXFBConfigSGIX config, unsigned int width, unsigned int height, int *attrib_list);
+GLAPI PFNGLXCREATEGLXPBUFFERSGIXPROC glad_glXCreateGLXPbufferSGIX;
+#define glXCreateGLXPbufferSGIX glad_glXCreateGLXPbufferSGIX
+typedef void (APIENTRYP PFNGLXDESTROYGLXPBUFFERSGIXPROC)(Display *dpy, GLXPbufferSGIX pbuf);
+GLAPI PFNGLXDESTROYGLXPBUFFERSGIXPROC glad_glXDestroyGLXPbufferSGIX;
+#define glXDestroyGLXPbufferSGIX glad_glXDestroyGLXPbufferSGIX
+typedef void (APIENTRYP PFNGLXQUERYGLXPBUFFERSGIXPROC)(Display *dpy, GLXPbufferSGIX pbuf, int attribute, unsigned int *value);
+GLAPI PFNGLXQUERYGLXPBUFFERSGIXPROC glad_glXQueryGLXPbufferSGIX;
+#define glXQueryGLXPbufferSGIX glad_glXQueryGLXPbufferSGIX
+typedef void (APIENTRYP PFNGLXSELECTEVENTSGIXPROC)(Display *dpy, GLXDrawable drawable, unsigned long mask);
+GLAPI PFNGLXSELECTEVENTSGIXPROC glad_glXSelectEventSGIX;
+#define glXSelectEventSGIX glad_glXSelectEventSGIX
+typedef void (APIENTRYP PFNGLXGETSELECTEDEVENTSGIXPROC)(Display *dpy, GLXDrawable drawable, unsigned long *mask);
+GLAPI PFNGLXGETSELECTEDEVENTSGIXPROC glad_glXGetSelectedEventSGIX;
+#define glXGetSelectedEventSGIX glad_glXGetSelectedEventSGIX
+#endif
+#ifndef GLX_SGIX_swap_barrier
+#define GLX_SGIX_swap_barrier 1
+GLAPI int GLAD_GLX_SGIX_swap_barrier;
+typedef void (APIENTRYP PFNGLXBINDSWAPBARRIERSGIXPROC)(Display *dpy, GLXDrawable drawable, int barrier);
+GLAPI PFNGLXBINDSWAPBARRIERSGIXPROC glad_glXBindSwapBarrierSGIX;
+#define glXBindSwapBarrierSGIX glad_glXBindSwapBarrierSGIX
+typedef Bool (APIENTRYP PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)(Display *dpy, int screen, int *max);
+GLAPI PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC glad_glXQueryMaxSwapBarriersSGIX;
+#define glXQueryMaxSwapBarriersSGIX glad_glXQueryMaxSwapBarriersSGIX
+#endif
+#ifndef GLX_SGIX_swap_group
+#define GLX_SGIX_swap_group 1
+GLAPI int GLAD_GLX_SGIX_swap_group;
+typedef void (APIENTRYP PFNGLXJOINSWAPGROUPSGIXPROC)(Display *dpy, GLXDrawable drawable, GLXDrawable member);
+GLAPI PFNGLXJOINSWAPGROUPSGIXPROC glad_glXJoinSwapGroupSGIX;
+#define glXJoinSwapGroupSGIX glad_glXJoinSwapGroupSGIX
+#endif
+#ifndef GLX_SGIX_video_resize
+#define GLX_SGIX_video_resize 1
+GLAPI int GLAD_GLX_SGIX_video_resize;
+typedef int (APIENTRYP PFNGLXBINDCHANNELTOWINDOWSGIXPROC)(Display *display, int screen, int channel, Window window);
+GLAPI PFNGLXBINDCHANNELTOWINDOWSGIXPROC glad_glXBindChannelToWindowSGIX;
+#define glXBindChannelToWindowSGIX glad_glXBindChannelToWindowSGIX
+typedef int (APIENTRYP PFNGLXCHANNELRECTSGIXPROC)(Display *display, int screen, int channel, int x, int y, int w, int h);
+GLAPI PFNGLXCHANNELRECTSGIXPROC glad_glXChannelRectSGIX;
+#define glXChannelRectSGIX glad_glXChannelRectSGIX
+typedef int (APIENTRYP PFNGLXQUERYCHANNELRECTSGIXPROC)(Display *display, int screen, int channel, int *dx, int *dy, int *dw, int *dh);
+GLAPI PFNGLXQUERYCHANNELRECTSGIXPROC glad_glXQueryChannelRectSGIX;
+#define glXQueryChannelRectSGIX glad_glXQueryChannelRectSGIX
+typedef int (APIENTRYP PFNGLXQUERYCHANNELDELTASSGIXPROC)(Display *display, int screen, int channel, int *x, int *y, int *w, int *h);
+GLAPI PFNGLXQUERYCHANNELDELTASSGIXPROC glad_glXQueryChannelDeltasSGIX;
+#define glXQueryChannelDeltasSGIX glad_glXQueryChannelDeltasSGIX
+typedef int (APIENTRYP PFNGLXCHANNELRECTSYNCSGIXPROC)(Display *display, int screen, int channel, GLenum synctype);
+GLAPI PFNGLXCHANNELRECTSYNCSGIXPROC glad_glXChannelRectSyncSGIX;
+#define glXChannelRectSyncSGIX glad_glXChannelRectSyncSGIX
+#endif
+#ifndef GLX_SGIX_video_source
+#define GLX_SGIX_video_source 1
+GLAPI int GLAD_GLX_SGIX_video_source;
+#ifdef _VL_H_
+typedef GLXVideoSourceSGIX (APIENTRYP PFNGLXCREATEGLXVIDEOSOURCESGIXPROC)(Display *display, int screen, VLServer server, VLPath path, int nodeClass, VLNode drainNode);
+GLAPI PFNGLXCREATEGLXVIDEOSOURCESGIXPROC glad_glXCreateGLXVideoSourceSGIX;
+#define glXCreateGLXVideoSourceSGIX glad_glXCreateGLXVideoSourceSGIX
+typedef void (APIENTRYP PFNGLXDESTROYGLXVIDEOSOURCESGIXPROC)(Display *dpy, GLXVideoSourceSGIX glxvideosource);
+GLAPI PFNGLXDESTROYGLXVIDEOSOURCESGIXPROC glad_glXDestroyGLXVideoSourceSGIX;
+#define glXDestroyGLXVideoSourceSGIX glad_glXDestroyGLXVideoSourceSGIX
+#endif
+#endif
+#ifndef GLX_SGIX_visual_select_group
+#define GLX_SGIX_visual_select_group 1
+GLAPI int GLAD_GLX_SGIX_visual_select_group;
+#endif
+#ifndef GLX_SGI_cushion
+#define GLX_SGI_cushion 1
+GLAPI int GLAD_GLX_SGI_cushion;
+typedef void (APIENTRYP PFNGLXCUSHIONSGIPROC)(Display *dpy, Window window, float cushion);
+GLAPI PFNGLXCUSHIONSGIPROC glad_glXCushionSGI;
+#define glXCushionSGI glad_glXCushionSGI
+#endif
+#ifndef GLX_SGI_make_current_read
+#define GLX_SGI_make_current_read 1
+GLAPI int GLAD_GLX_SGI_make_current_read;
+typedef Bool (APIENTRYP PFNGLXMAKECURRENTREADSGIPROC)(Display *dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx);
+GLAPI PFNGLXMAKECURRENTREADSGIPROC glad_glXMakeCurrentReadSGI;
+#define glXMakeCurrentReadSGI glad_glXMakeCurrentReadSGI
+typedef GLXDrawable (APIENTRYP PFNGLXGETCURRENTREADDRAWABLESGIPROC)(void);
+GLAPI PFNGLXGETCURRENTREADDRAWABLESGIPROC glad_glXGetCurrentReadDrawableSGI;
+#define glXGetCurrentReadDrawableSGI glad_glXGetCurrentReadDrawableSGI
+#endif
+#ifndef GLX_SGI_swap_control
+#define GLX_SGI_swap_control 1
+GLAPI int GLAD_GLX_SGI_swap_control;
+typedef int (APIENTRYP PFNGLXSWAPINTERVALSGIPROC)(int interval);
+GLAPI PFNGLXSWAPINTERVALSGIPROC glad_glXSwapIntervalSGI;
+#define glXSwapIntervalSGI glad_glXSwapIntervalSGI
+#endif
+#ifndef GLX_SGI_video_sync
+#define GLX_SGI_video_sync 1
+GLAPI int GLAD_GLX_SGI_video_sync;
+typedef int (APIENTRYP PFNGLXGETVIDEOSYNCSGIPROC)(unsigned int *count);
+GLAPI PFNGLXGETVIDEOSYNCSGIPROC glad_glXGetVideoSyncSGI;
+#define glXGetVideoSyncSGI glad_glXGetVideoSyncSGI
+typedef int (APIENTRYP PFNGLXWAITVIDEOSYNCSGIPROC)(int divisor, int remainder, unsigned int *count);
+GLAPI PFNGLXWAITVIDEOSYNCSGIPROC glad_glXWaitVideoSyncSGI;
+#define glXWaitVideoSyncSGI glad_glXWaitVideoSyncSGI
+#endif
+#ifndef GLX_SUN_get_transparent_index
+#define GLX_SUN_get_transparent_index 1
+GLAPI int GLAD_GLX_SUN_get_transparent_index;
+typedef Status (APIENTRYP PFNGLXGETTRANSPARENTINDEXSUNPROC)(Display *dpy, Window overlay, Window underlay, unsigned long *pTransparentIndex);
+GLAPI PFNGLXGETTRANSPARENTINDEXSUNPROC glad_glXGetTransparentIndexSUN;
+#define glXGetTransparentIndexSUN glad_glXGetTransparentIndexSUN
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/dep/glad/include/glad_wgl.h b/dep/glad/include/glad_wgl.h
new file mode 100644
index 000000000..fbcc4192f
--- /dev/null
+++ b/dep/glad/include/glad_wgl.h
@@ -0,0 +1,1014 @@
+/*
+
+ WGL loader generated by glad 0.1.33 on Sun May 3 16:49:27 2020.
+
+ Language/Generator: C/C++
+ Specification: wgl
+ APIs: wgl=1.0
+ Profile: -
+ Extensions:
+ WGL_3DFX_multisample,
+ WGL_3DL_stereo_control,
+ WGL_AMD_gpu_association,
+ WGL_ARB_buffer_region,
+ WGL_ARB_context_flush_control,
+ WGL_ARB_create_context,
+ WGL_ARB_create_context_no_error,
+ WGL_ARB_create_context_profile,
+ WGL_ARB_create_context_robustness,
+ WGL_ARB_extensions_string,
+ WGL_ARB_framebuffer_sRGB,
+ WGL_ARB_make_current_read,
+ WGL_ARB_multisample,
+ WGL_ARB_pbuffer,
+ WGL_ARB_pixel_format,
+ WGL_ARB_pixel_format_float,
+ WGL_ARB_render_texture,
+ WGL_ARB_robustness_application_isolation,
+ WGL_ARB_robustness_share_group_isolation,
+ WGL_ATI_pixel_format_float,
+ WGL_ATI_render_texture_rectangle,
+ WGL_EXT_colorspace,
+ WGL_EXT_create_context_es2_profile,
+ WGL_EXT_create_context_es_profile,
+ WGL_EXT_depth_float,
+ WGL_EXT_display_color_table,
+ WGL_EXT_extensions_string,
+ WGL_EXT_framebuffer_sRGB,
+ WGL_EXT_make_current_read,
+ WGL_EXT_multisample,
+ WGL_EXT_pbuffer,
+ WGL_EXT_pixel_format,
+ WGL_EXT_pixel_format_packed_float,
+ WGL_EXT_swap_control,
+ WGL_EXT_swap_control_tear,
+ WGL_I3D_digital_video_control,
+ WGL_I3D_gamma,
+ WGL_I3D_genlock,
+ WGL_I3D_image_buffer,
+ WGL_I3D_swap_frame_lock,
+ WGL_I3D_swap_frame_usage,
+ WGL_NV_DX_interop,
+ WGL_NV_DX_interop2,
+ WGL_NV_copy_image,
+ WGL_NV_delay_before_swap,
+ WGL_NV_float_buffer,
+ WGL_NV_gpu_affinity,
+ WGL_NV_multigpu_context,
+ WGL_NV_multisample_coverage,
+ WGL_NV_present_video,
+ WGL_NV_render_depth_texture,
+ WGL_NV_render_texture_rectangle,
+ WGL_NV_swap_group,
+ WGL_NV_vertex_array_range,
+ WGL_NV_video_capture,
+ WGL_NV_video_output,
+ WGL_OML_sync_control
+ Loader: True
+ Local files: False
+ Omit khrplatform: False
+ Reproducible: False
+
+ Commandline:
+ --api="wgl=1.0" --generator="c" --spec="wgl" --extensions="WGL_3DFX_multisample,WGL_3DL_stereo_control,WGL_AMD_gpu_association,WGL_ARB_buffer_region,WGL_ARB_context_flush_control,WGL_ARB_create_context,WGL_ARB_create_context_no_error,WGL_ARB_create_context_profile,WGL_ARB_create_context_robustness,WGL_ARB_extensions_string,WGL_ARB_framebuffer_sRGB,WGL_ARB_make_current_read,WGL_ARB_multisample,WGL_ARB_pbuffer,WGL_ARB_pixel_format,WGL_ARB_pixel_format_float,WGL_ARB_render_texture,WGL_ARB_robustness_application_isolation,WGL_ARB_robustness_share_group_isolation,WGL_ATI_pixel_format_float,WGL_ATI_render_texture_rectangle,WGL_EXT_colorspace,WGL_EXT_create_context_es2_profile,WGL_EXT_create_context_es_profile,WGL_EXT_depth_float,WGL_EXT_display_color_table,WGL_EXT_extensions_string,WGL_EXT_framebuffer_sRGB,WGL_EXT_make_current_read,WGL_EXT_multisample,WGL_EXT_pbuffer,WGL_EXT_pixel_format,WGL_EXT_pixel_format_packed_float,WGL_EXT_swap_control,WGL_EXT_swap_control_tear,WGL_I3D_digital_video_control,WGL_I3D_gamma,WGL_I3D_genlock,WGL_I3D_image_buffer,WGL_I3D_swap_frame_lock,WGL_I3D_swap_frame_usage,WGL_NV_DX_interop,WGL_NV_DX_interop2,WGL_NV_copy_image,WGL_NV_delay_before_swap,WGL_NV_float_buffer,WGL_NV_gpu_affinity,WGL_NV_multigpu_context,WGL_NV_multisample_coverage,WGL_NV_present_video,WGL_NV_render_depth_texture,WGL_NV_render_texture_rectangle,WGL_NV_swap_group,WGL_NV_vertex_array_range,WGL_NV_video_capture,WGL_NV_video_output,WGL_OML_sync_control"
+ Online:
+ Too many extensions
+*/
+
+
+#ifndef WINAPI
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN 1
+#endif
+#ifndef NOMINMAX
+#define NOMINMAX 1
+#endif
+#include
+#endif
+
+#include "glad.h"
+
+#ifndef __glad_wglext_h_
+
+#ifdef __wglext_h_
+#error WGL header already included, remove this include, glad already provides it
+#endif
+
+#define __glad_wglext_h_
+#define __wglext_h_
+
+#ifndef APIENTRY
+#define APIENTRY
+#endif
+#ifndef APIENTRYP
+#define APIENTRYP APIENTRY *
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void* (* GLADloadproc)(const char *name);
+
+#ifndef GLAPI
+# if defined(GLAD_GLAPI_EXPORT)
+# if defined(_WIN32) || defined(__CYGWIN__)
+# if defined(GLAD_GLAPI_EXPORT_BUILD)
+# if defined(__GNUC__)
+# define GLAPI __attribute__ ((dllexport)) extern
+# else
+# define GLAPI __declspec(dllexport) extern
+# endif
+# else
+# if defined(__GNUC__)
+# define GLAPI __attribute__ ((dllimport)) extern
+# else
+# define GLAPI __declspec(dllimport) extern
+# endif
+# endif
+# elif defined(__GNUC__) && defined(GLAD_GLAPI_EXPORT_BUILD)
+# define GLAPI __attribute__ ((visibility ("default"))) extern
+# else
+# define GLAPI extern
+# endif
+# else
+# define GLAPI extern
+# endif
+#endif
+
+GLAPI int gladLoadWGL(HDC hdc);
+
+GLAPI int gladLoadWGLLoader(GLADloadproc, HDC hdc);
+
+struct _GPU_DEVICE {
+ DWORD cb;
+ CHAR DeviceName[32];
+ CHAR DeviceString[128];
+ DWORD Flags;
+ RECT rcVirtualScreen;
+};
+DECLARE_HANDLE(HPBUFFERARB);
+DECLARE_HANDLE(HPBUFFEREXT);
+DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV);
+DECLARE_HANDLE(HPVIDEODEV);
+DECLARE_HANDLE(HPGPUNV);
+DECLARE_HANDLE(HGPUNV);
+DECLARE_HANDLE(HVIDEOINPUTDEVICENV);
+typedef struct _GPU_DEVICE GPU_DEVICE;
+typedef struct _GPU_DEVICE *PGPU_DEVICE;
+#define WGL_SAMPLE_BUFFERS_3DFX 0x2060
+#define WGL_SAMPLES_3DFX 0x2061
+#define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055
+#define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056
+#define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057
+#define WGL_STEREO_POLARITY_INVERT_3DL 0x2058
+#define WGL_GPU_VENDOR_AMD 0x1F00
+#define WGL_GPU_RENDERER_STRING_AMD 0x1F01
+#define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02
+#define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2
+#define WGL_GPU_RAM_AMD 0x21A3
+#define WGL_GPU_CLOCK_AMD 0x21A4
+#define WGL_GPU_NUM_PIPES_AMD 0x21A5
+#define WGL_GPU_NUM_SIMD_AMD 0x21A6
+#define WGL_GPU_NUM_RB_AMD 0x21A7
+#define WGL_GPU_NUM_SPI_AMD 0x21A8
+#define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001
+#define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002
+#define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004
+#define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008
+#define WGL_CONTEXT_RELEASE_BEHAVIOR_ARB 0x2097
+#define WGL_CONTEXT_RELEASE_BEHAVIOR_NONE_ARB 0
+#define WGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_ARB 0x2098
+#define WGL_CONTEXT_DEBUG_BIT_ARB 0x00000001
+#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002
+#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091
+#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092
+#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093
+#define WGL_CONTEXT_FLAGS_ARB 0x2094
+#define ERROR_INVALID_VERSION_ARB 0x2095
+#define WGL_CONTEXT_OPENGL_NO_ERROR_ARB 0x31B3
+#define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126
+#define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001
+#define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002
+#define ERROR_INVALID_PROFILE_ARB 0x2096
+#define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004
+#define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252
+#define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
+#define WGL_NO_RESET_NOTIFICATION_ARB 0x8261
+#define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9
+#define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043
+#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054
+#define WGL_SAMPLE_BUFFERS_ARB 0x2041
+#define WGL_SAMPLES_ARB 0x2042
+#define WGL_DRAW_TO_PBUFFER_ARB 0x202D
+#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E
+#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F
+#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
+#define WGL_PBUFFER_LARGEST_ARB 0x2033
+#define WGL_PBUFFER_WIDTH_ARB 0x2034
+#define WGL_PBUFFER_HEIGHT_ARB 0x2035
+#define WGL_PBUFFER_LOST_ARB 0x2036
+#define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000
+#define WGL_DRAW_TO_WINDOW_ARB 0x2001
+#define WGL_DRAW_TO_BITMAP_ARB 0x2002
+#define WGL_ACCELERATION_ARB 0x2003
+#define WGL_NEED_PALETTE_ARB 0x2004
+#define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005
+#define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006
+#define WGL_SWAP_METHOD_ARB 0x2007
+#define WGL_NUMBER_OVERLAYS_ARB 0x2008
+#define WGL_NUMBER_UNDERLAYS_ARB 0x2009
+#define WGL_TRANSPARENT_ARB 0x200A
+#define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037
+#define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038
+#define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039
+#define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A
+#define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B
+#define WGL_SHARE_DEPTH_ARB 0x200C
+#define WGL_SHARE_STENCIL_ARB 0x200D
+#define WGL_SHARE_ACCUM_ARB 0x200E
+#define WGL_SUPPORT_GDI_ARB 0x200F
+#define WGL_SUPPORT_OPENGL_ARB 0x2010
+#define WGL_DOUBLE_BUFFER_ARB 0x2011
+#define WGL_STEREO_ARB 0x2012
+#define WGL_PIXEL_TYPE_ARB 0x2013
+#define WGL_COLOR_BITS_ARB 0x2014
+#define WGL_RED_BITS_ARB 0x2015
+#define WGL_RED_SHIFT_ARB 0x2016
+#define WGL_GREEN_BITS_ARB 0x2017
+#define WGL_GREEN_SHIFT_ARB 0x2018
+#define WGL_BLUE_BITS_ARB 0x2019
+#define WGL_BLUE_SHIFT_ARB 0x201A
+#define WGL_ALPHA_BITS_ARB 0x201B
+#define WGL_ALPHA_SHIFT_ARB 0x201C
+#define WGL_ACCUM_BITS_ARB 0x201D
+#define WGL_ACCUM_RED_BITS_ARB 0x201E
+#define WGL_ACCUM_GREEN_BITS_ARB 0x201F
+#define WGL_ACCUM_BLUE_BITS_ARB 0x2020
+#define WGL_ACCUM_ALPHA_BITS_ARB 0x2021
+#define WGL_DEPTH_BITS_ARB 0x2022
+#define WGL_STENCIL_BITS_ARB 0x2023
+#define WGL_AUX_BUFFERS_ARB 0x2024
+#define WGL_NO_ACCELERATION_ARB 0x2025
+#define WGL_GENERIC_ACCELERATION_ARB 0x2026
+#define WGL_FULL_ACCELERATION_ARB 0x2027
+#define WGL_SWAP_EXCHANGE_ARB 0x2028
+#define WGL_SWAP_COPY_ARB 0x2029
+#define WGL_SWAP_UNDEFINED_ARB 0x202A
+#define WGL_TYPE_RGBA_ARB 0x202B
+#define WGL_TYPE_COLORINDEX_ARB 0x202C
+#define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0
+#define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070
+#define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071
+#define WGL_TEXTURE_FORMAT_ARB 0x2072
+#define WGL_TEXTURE_TARGET_ARB 0x2073
+#define WGL_MIPMAP_TEXTURE_ARB 0x2074
+#define WGL_TEXTURE_RGB_ARB 0x2075
+#define WGL_TEXTURE_RGBA_ARB 0x2076
+#define WGL_NO_TEXTURE_ARB 0x2077
+#define WGL_TEXTURE_CUBE_MAP_ARB 0x2078
+#define WGL_TEXTURE_1D_ARB 0x2079
+#define WGL_TEXTURE_2D_ARB 0x207A
+#define WGL_MIPMAP_LEVEL_ARB 0x207B
+#define WGL_CUBE_MAP_FACE_ARB 0x207C
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080
+#define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081
+#define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082
+#define WGL_FRONT_LEFT_ARB 0x2083
+#define WGL_FRONT_RIGHT_ARB 0x2084
+#define WGL_BACK_LEFT_ARB 0x2085
+#define WGL_BACK_RIGHT_ARB 0x2086
+#define WGL_AUX0_ARB 0x2087
+#define WGL_AUX1_ARB 0x2088
+#define WGL_AUX2_ARB 0x2089
+#define WGL_AUX3_ARB 0x208A
+#define WGL_AUX4_ARB 0x208B
+#define WGL_AUX5_ARB 0x208C
+#define WGL_AUX6_ARB 0x208D
+#define WGL_AUX7_ARB 0x208E
+#define WGL_AUX8_ARB 0x208F
+#define WGL_AUX9_ARB 0x2090
+#define WGL_CONTEXT_RESET_ISOLATION_BIT_ARB 0x00000008
+#define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0
+#define WGL_TEXTURE_RECTANGLE_ATI 0x21A5
+#define WGL_COLORSPACE_EXT 0x309D
+#define WGL_COLORSPACE_SRGB_EXT 0x3089
+#define WGL_COLORSPACE_LINEAR_EXT 0x308A
+#define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004
+#define WGL_CONTEXT_ES_PROFILE_BIT_EXT 0x00000004
+#define WGL_DEPTH_FLOAT_EXT 0x2040
+#define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9
+#define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043
+#define WGL_SAMPLE_BUFFERS_EXT 0x2041
+#define WGL_SAMPLES_EXT 0x2042
+#define WGL_DRAW_TO_PBUFFER_EXT 0x202D
+#define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E
+#define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F
+#define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030
+#define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031
+#define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032
+#define WGL_PBUFFER_LARGEST_EXT 0x2033
+#define WGL_PBUFFER_WIDTH_EXT 0x2034
+#define WGL_PBUFFER_HEIGHT_EXT 0x2035
+#define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000
+#define WGL_DRAW_TO_WINDOW_EXT 0x2001
+#define WGL_DRAW_TO_BITMAP_EXT 0x2002
+#define WGL_ACCELERATION_EXT 0x2003
+#define WGL_NEED_PALETTE_EXT 0x2004
+#define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005
+#define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006
+#define WGL_SWAP_METHOD_EXT 0x2007
+#define WGL_NUMBER_OVERLAYS_EXT 0x2008
+#define WGL_NUMBER_UNDERLAYS_EXT 0x2009
+#define WGL_TRANSPARENT_EXT 0x200A
+#define WGL_TRANSPARENT_VALUE_EXT 0x200B
+#define WGL_SHARE_DEPTH_EXT 0x200C
+#define WGL_SHARE_STENCIL_EXT 0x200D
+#define WGL_SHARE_ACCUM_EXT 0x200E
+#define WGL_SUPPORT_GDI_EXT 0x200F
+#define WGL_SUPPORT_OPENGL_EXT 0x2010
+#define WGL_DOUBLE_BUFFER_EXT 0x2011
+#define WGL_STEREO_EXT 0x2012
+#define WGL_PIXEL_TYPE_EXT 0x2013
+#define WGL_COLOR_BITS_EXT 0x2014
+#define WGL_RED_BITS_EXT 0x2015
+#define WGL_RED_SHIFT_EXT 0x2016
+#define WGL_GREEN_BITS_EXT 0x2017
+#define WGL_GREEN_SHIFT_EXT 0x2018
+#define WGL_BLUE_BITS_EXT 0x2019
+#define WGL_BLUE_SHIFT_EXT 0x201A
+#define WGL_ALPHA_BITS_EXT 0x201B
+#define WGL_ALPHA_SHIFT_EXT 0x201C
+#define WGL_ACCUM_BITS_EXT 0x201D
+#define WGL_ACCUM_RED_BITS_EXT 0x201E
+#define WGL_ACCUM_GREEN_BITS_EXT 0x201F
+#define WGL_ACCUM_BLUE_BITS_EXT 0x2020
+#define WGL_ACCUM_ALPHA_BITS_EXT 0x2021
+#define WGL_DEPTH_BITS_EXT 0x2022
+#define WGL_STENCIL_BITS_EXT 0x2023
+#define WGL_AUX_BUFFERS_EXT 0x2024
+#define WGL_NO_ACCELERATION_EXT 0x2025
+#define WGL_GENERIC_ACCELERATION_EXT 0x2026
+#define WGL_FULL_ACCELERATION_EXT 0x2027
+#define WGL_SWAP_EXCHANGE_EXT 0x2028
+#define WGL_SWAP_COPY_EXT 0x2029
+#define WGL_SWAP_UNDEFINED_EXT 0x202A
+#define WGL_TYPE_RGBA_EXT 0x202B
+#define WGL_TYPE_COLORINDEX_EXT 0x202C
+#define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8
+#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050
+#define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051
+#define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052
+#define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053
+#define WGL_GAMMA_TABLE_SIZE_I3D 0x204E
+#define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F
+#define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044
+#define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045
+#define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046
+#define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047
+#define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048
+#define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049
+#define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A
+#define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B
+#define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C
+#define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001
+#define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002
+#define WGL_ACCESS_READ_ONLY_NV 0x00000000
+#define WGL_ACCESS_READ_WRITE_NV 0x00000001
+#define WGL_ACCESS_WRITE_DISCARD_NV 0x00000002
+#define WGL_FLOAT_COMPONENTS_NV 0x20B0
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4
+#define WGL_TEXTURE_FLOAT_R_NV 0x20B5
+#define WGL_TEXTURE_FLOAT_RG_NV 0x20B6
+#define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7
+#define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8
+#define ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0
+#define ERROR_MISSING_AFFINITY_MASK_NV 0x20D1
+#define WGL_CONTEXT_MULTIGPU_ATTRIB_NV 0x20AA
+#define WGL_CONTEXT_MULTIGPU_ATTRIB_SINGLE_NV 0x20AB
+#define WGL_CONTEXT_MULTIGPU_ATTRIB_AFR_NV 0x20AC
+#define WGL_CONTEXT_MULTIGPU_ATTRIB_MULTICAST_NV 0x20AD
+#define WGL_CONTEXT_MULTIGPU_ATTRIB_MULTI_DISPLAY_MULTICAST_NV 0x20AE
+#define WGL_COVERAGE_SAMPLES_NV 0x2042
+#define WGL_COLOR_SAMPLES_NV 0x20B9
+#define WGL_NUM_VIDEO_SLOTS_NV 0x20F0
+#define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4
+#define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5
+#define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6
+#define WGL_DEPTH_COMPONENT_NV 0x20A7
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0
+#define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1
+#define WGL_TEXTURE_RECTANGLE_NV 0x20A2
+#define WGL_UNIQUE_ID_NV 0x20CE
+#define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF
+#define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0
+#define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1
+#define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2
+#define WGL_VIDEO_OUT_COLOR_NV 0x20C3
+#define WGL_VIDEO_OUT_ALPHA_NV 0x20C4
+#define WGL_VIDEO_OUT_DEPTH_NV 0x20C5
+#define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6
+#define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7
+#define WGL_VIDEO_OUT_FRAME 0x20C8
+#define WGL_VIDEO_OUT_FIELD_1 0x20C9
+#define WGL_VIDEO_OUT_FIELD_2 0x20CA
+#define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB
+#define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC
+#ifndef WGL_3DFX_multisample
+#define WGL_3DFX_multisample 1
+GLAPI int GLAD_WGL_3DFX_multisample;
+#endif
+#ifndef WGL_3DL_stereo_control
+#define WGL_3DL_stereo_control 1
+GLAPI int GLAD_WGL_3DL_stereo_control;
+typedef BOOL (APIENTRYP PFNWGLSETSTEREOEMITTERSTATE3DLPROC)(HDC hDC, UINT uState);
+GLAPI PFNWGLSETSTEREOEMITTERSTATE3DLPROC glad_wglSetStereoEmitterState3DL;
+#define wglSetStereoEmitterState3DL glad_wglSetStereoEmitterState3DL
+#endif
+#ifndef WGL_AMD_gpu_association
+#define WGL_AMD_gpu_association 1
+GLAPI int GLAD_WGL_AMD_gpu_association;
+typedef UINT (APIENTRYP PFNWGLGETGPUIDSAMDPROC)(UINT maxCount, UINT *ids);
+GLAPI PFNWGLGETGPUIDSAMDPROC glad_wglGetGPUIDsAMD;
+#define wglGetGPUIDsAMD glad_wglGetGPUIDsAMD
+typedef INT (APIENTRYP PFNWGLGETGPUINFOAMDPROC)(UINT id, INT property, GLenum dataType, UINT size, void *data);
+GLAPI PFNWGLGETGPUINFOAMDPROC glad_wglGetGPUInfoAMD;
+#define wglGetGPUInfoAMD glad_wglGetGPUInfoAMD
+typedef UINT (APIENTRYP PFNWGLGETCONTEXTGPUIDAMDPROC)(HGLRC hglrc);
+GLAPI PFNWGLGETCONTEXTGPUIDAMDPROC glad_wglGetContextGPUIDAMD;
+#define wglGetContextGPUIDAMD glad_wglGetContextGPUIDAMD
+typedef HGLRC (APIENTRYP PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC)(UINT id);
+GLAPI PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC glad_wglCreateAssociatedContextAMD;
+#define wglCreateAssociatedContextAMD glad_wglCreateAssociatedContextAMD
+typedef HGLRC (APIENTRYP PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)(UINT id, HGLRC hShareContext, const int *attribList);
+GLAPI PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC glad_wglCreateAssociatedContextAttribsAMD;
+#define wglCreateAssociatedContextAttribsAMD glad_wglCreateAssociatedContextAttribsAMD
+typedef BOOL (APIENTRYP PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC)(HGLRC hglrc);
+GLAPI PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC glad_wglDeleteAssociatedContextAMD;
+#define wglDeleteAssociatedContextAMD glad_wglDeleteAssociatedContextAMD
+typedef BOOL (APIENTRYP PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)(HGLRC hglrc);
+GLAPI PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC glad_wglMakeAssociatedContextCurrentAMD;
+#define wglMakeAssociatedContextCurrentAMD glad_wglMakeAssociatedContextCurrentAMD
+typedef HGLRC (APIENTRYP PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC)(void);
+GLAPI PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC glad_wglGetCurrentAssociatedContextAMD;
+#define wglGetCurrentAssociatedContextAMD glad_wglGetCurrentAssociatedContextAMD
+typedef VOID (APIENTRYP PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC)(HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
+GLAPI PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC glad_wglBlitContextFramebufferAMD;
+#define wglBlitContextFramebufferAMD glad_wglBlitContextFramebufferAMD
+#endif
+#ifndef WGL_ARB_buffer_region
+#define WGL_ARB_buffer_region 1
+GLAPI int GLAD_WGL_ARB_buffer_region;
+typedef HANDLE (APIENTRYP PFNWGLCREATEBUFFERREGIONARBPROC)(HDC hDC, int iLayerPlane, UINT uType);
+GLAPI PFNWGLCREATEBUFFERREGIONARBPROC glad_wglCreateBufferRegionARB;
+#define wglCreateBufferRegionARB glad_wglCreateBufferRegionARB
+typedef VOID (APIENTRYP PFNWGLDELETEBUFFERREGIONARBPROC)(HANDLE hRegion);
+GLAPI PFNWGLDELETEBUFFERREGIONARBPROC glad_wglDeleteBufferRegionARB;
+#define wglDeleteBufferRegionARB glad_wglDeleteBufferRegionARB
+typedef BOOL (APIENTRYP PFNWGLSAVEBUFFERREGIONARBPROC)(HANDLE hRegion, int x, int y, int width, int height);
+GLAPI PFNWGLSAVEBUFFERREGIONARBPROC glad_wglSaveBufferRegionARB;
+#define wglSaveBufferRegionARB glad_wglSaveBufferRegionARB
+typedef BOOL (APIENTRYP PFNWGLRESTOREBUFFERREGIONARBPROC)(HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc);
+GLAPI PFNWGLRESTOREBUFFERREGIONARBPROC glad_wglRestoreBufferRegionARB;
+#define wglRestoreBufferRegionARB glad_wglRestoreBufferRegionARB
+#endif
+#ifndef WGL_ARB_context_flush_control
+#define WGL_ARB_context_flush_control 1
+GLAPI int GLAD_WGL_ARB_context_flush_control;
+#endif
+#ifndef WGL_ARB_create_context
+#define WGL_ARB_create_context 1
+GLAPI int GLAD_WGL_ARB_create_context;
+typedef HGLRC (APIENTRYP PFNWGLCREATECONTEXTATTRIBSARBPROC)(HDC hDC, HGLRC hShareContext, const int *attribList);
+GLAPI PFNWGLCREATECONTEXTATTRIBSARBPROC glad_wglCreateContextAttribsARB;
+#define wglCreateContextAttribsARB glad_wglCreateContextAttribsARB
+#endif
+#ifndef WGL_ARB_create_context_no_error
+#define WGL_ARB_create_context_no_error 1
+GLAPI int GLAD_WGL_ARB_create_context_no_error;
+#endif
+#ifndef WGL_ARB_create_context_profile
+#define WGL_ARB_create_context_profile 1
+GLAPI int GLAD_WGL_ARB_create_context_profile;
+#endif
+#ifndef WGL_ARB_create_context_robustness
+#define WGL_ARB_create_context_robustness 1
+GLAPI int GLAD_WGL_ARB_create_context_robustness;
+#endif
+#ifndef WGL_ARB_extensions_string
+#define WGL_ARB_extensions_string 1
+GLAPI int GLAD_WGL_ARB_extensions_string;
+typedef const char * (APIENTRYP PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc);
+GLAPI PFNWGLGETEXTENSIONSSTRINGARBPROC glad_wglGetExtensionsStringARB;
+#define wglGetExtensionsStringARB glad_wglGetExtensionsStringARB
+#endif
+#ifndef WGL_ARB_framebuffer_sRGB
+#define WGL_ARB_framebuffer_sRGB 1
+GLAPI int GLAD_WGL_ARB_framebuffer_sRGB;
+#endif
+#ifndef WGL_ARB_make_current_read
+#define WGL_ARB_make_current_read 1
+GLAPI int GLAD_WGL_ARB_make_current_read;
+typedef BOOL (APIENTRYP PFNWGLMAKECONTEXTCURRENTARBPROC)(HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
+GLAPI PFNWGLMAKECONTEXTCURRENTARBPROC glad_wglMakeContextCurrentARB;
+#define wglMakeContextCurrentARB glad_wglMakeContextCurrentARB
+typedef HDC (APIENTRYP PFNWGLGETCURRENTREADDCARBPROC)(void);
+GLAPI PFNWGLGETCURRENTREADDCARBPROC glad_wglGetCurrentReadDCARB;
+#define wglGetCurrentReadDCARB glad_wglGetCurrentReadDCARB
+#endif
+#ifndef WGL_ARB_multisample
+#define WGL_ARB_multisample 1
+GLAPI int GLAD_WGL_ARB_multisample;
+#endif
+#ifndef WGL_ARB_pbuffer
+#define WGL_ARB_pbuffer 1
+GLAPI int GLAD_WGL_ARB_pbuffer;
+typedef HPBUFFERARB (APIENTRYP PFNWGLCREATEPBUFFERARBPROC)(HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);
+GLAPI PFNWGLCREATEPBUFFERARBPROC glad_wglCreatePbufferARB;
+#define wglCreatePbufferARB glad_wglCreatePbufferARB
+typedef HDC (APIENTRYP PFNWGLGETPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer);
+GLAPI PFNWGLGETPBUFFERDCARBPROC glad_wglGetPbufferDCARB;
+#define wglGetPbufferDCARB glad_wglGetPbufferDCARB
+typedef int (APIENTRYP PFNWGLRELEASEPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer, HDC hDC);
+GLAPI PFNWGLRELEASEPBUFFERDCARBPROC glad_wglReleasePbufferDCARB;
+#define wglReleasePbufferDCARB glad_wglReleasePbufferDCARB
+typedef BOOL (APIENTRYP PFNWGLDESTROYPBUFFERARBPROC)(HPBUFFERARB hPbuffer);
+GLAPI PFNWGLDESTROYPBUFFERARBPROC glad_wglDestroyPbufferARB;
+#define wglDestroyPbufferARB glad_wglDestroyPbufferARB
+typedef BOOL (APIENTRYP PFNWGLQUERYPBUFFERARBPROC)(HPBUFFERARB hPbuffer, int iAttribute, int *piValue);
+GLAPI PFNWGLQUERYPBUFFERARBPROC glad_wglQueryPbufferARB;
+#define wglQueryPbufferARB glad_wglQueryPbufferARB
+#endif
+#ifndef WGL_ARB_pixel_format
+#define WGL_ARB_pixel_format 1
+GLAPI int GLAD_WGL_ARB_pixel_format;
+typedef BOOL (APIENTRYP PFNWGLGETPIXELFORMATATTRIBIVARBPROC)(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues);
+GLAPI PFNWGLGETPIXELFORMATATTRIBIVARBPROC glad_wglGetPixelFormatAttribivARB;
+#define wglGetPixelFormatAttribivARB glad_wglGetPixelFormatAttribivARB
+typedef BOOL (APIENTRYP PFNWGLGETPIXELFORMATATTRIBFVARBPROC)(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues);
+GLAPI PFNWGLGETPIXELFORMATATTRIBFVARBPROC glad_wglGetPixelFormatAttribfvARB;
+#define wglGetPixelFormatAttribfvARB glad_wglGetPixelFormatAttribfvARB
+typedef BOOL (APIENTRYP PFNWGLCHOOSEPIXELFORMATARBPROC)(HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
+GLAPI PFNWGLCHOOSEPIXELFORMATARBPROC glad_wglChoosePixelFormatARB;
+#define wglChoosePixelFormatARB glad_wglChoosePixelFormatARB
+#endif
+#ifndef WGL_ARB_pixel_format_float
+#define WGL_ARB_pixel_format_float 1
+GLAPI int GLAD_WGL_ARB_pixel_format_float;
+#endif
+#ifndef WGL_ARB_render_texture
+#define WGL_ARB_render_texture 1
+GLAPI int GLAD_WGL_ARB_render_texture;
+typedef BOOL (APIENTRYP PFNWGLBINDTEXIMAGEARBPROC)(HPBUFFERARB hPbuffer, int iBuffer);
+GLAPI PFNWGLBINDTEXIMAGEARBPROC glad_wglBindTexImageARB;
+#define wglBindTexImageARB glad_wglBindTexImageARB
+typedef BOOL (APIENTRYP PFNWGLRELEASETEXIMAGEARBPROC)(HPBUFFERARB hPbuffer, int iBuffer);
+GLAPI PFNWGLRELEASETEXIMAGEARBPROC glad_wglReleaseTexImageARB;
+#define wglReleaseTexImageARB glad_wglReleaseTexImageARB
+typedef BOOL (APIENTRYP PFNWGLSETPBUFFERATTRIBARBPROC)(HPBUFFERARB hPbuffer, const int *piAttribList);
+GLAPI PFNWGLSETPBUFFERATTRIBARBPROC glad_wglSetPbufferAttribARB;
+#define wglSetPbufferAttribARB glad_wglSetPbufferAttribARB
+#endif
+#ifndef WGL_ARB_robustness_application_isolation
+#define WGL_ARB_robustness_application_isolation 1
+GLAPI int GLAD_WGL_ARB_robustness_application_isolation;
+#endif
+#ifndef WGL_ARB_robustness_share_group_isolation
+#define WGL_ARB_robustness_share_group_isolation 1
+GLAPI int GLAD_WGL_ARB_robustness_share_group_isolation;
+#endif
+#ifndef WGL_ATI_pixel_format_float
+#define WGL_ATI_pixel_format_float 1
+GLAPI int GLAD_WGL_ATI_pixel_format_float;
+#endif
+#ifndef WGL_ATI_render_texture_rectangle
+#define WGL_ATI_render_texture_rectangle 1
+GLAPI int GLAD_WGL_ATI_render_texture_rectangle;
+#endif
+#ifndef WGL_EXT_colorspace
+#define WGL_EXT_colorspace 1
+GLAPI int GLAD_WGL_EXT_colorspace;
+#endif
+#ifndef WGL_EXT_create_context_es2_profile
+#define WGL_EXT_create_context_es2_profile 1
+GLAPI int GLAD_WGL_EXT_create_context_es2_profile;
+#endif
+#ifndef WGL_EXT_create_context_es_profile
+#define WGL_EXT_create_context_es_profile 1
+GLAPI int GLAD_WGL_EXT_create_context_es_profile;
+#endif
+#ifndef WGL_EXT_depth_float
+#define WGL_EXT_depth_float 1
+GLAPI int GLAD_WGL_EXT_depth_float;
+#endif
+#ifndef WGL_EXT_display_color_table
+#define WGL_EXT_display_color_table 1
+GLAPI int GLAD_WGL_EXT_display_color_table;
+typedef GLboolean (APIENTRYP PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC)(GLushort id);
+GLAPI PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC glad_wglCreateDisplayColorTableEXT;
+#define wglCreateDisplayColorTableEXT glad_wglCreateDisplayColorTableEXT
+typedef GLboolean (APIENTRYP PFNWGLLOADDISPLAYCOLORTABLEEXTPROC)(const GLushort *table, GLuint length);
+GLAPI PFNWGLLOADDISPLAYCOLORTABLEEXTPROC glad_wglLoadDisplayColorTableEXT;
+#define wglLoadDisplayColorTableEXT glad_wglLoadDisplayColorTableEXT
+typedef GLboolean (APIENTRYP PFNWGLBINDDISPLAYCOLORTABLEEXTPROC)(GLushort id);
+GLAPI PFNWGLBINDDISPLAYCOLORTABLEEXTPROC glad_wglBindDisplayColorTableEXT;
+#define wglBindDisplayColorTableEXT glad_wglBindDisplayColorTableEXT
+typedef VOID (APIENTRYP PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC)(GLushort id);
+GLAPI PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC glad_wglDestroyDisplayColorTableEXT;
+#define wglDestroyDisplayColorTableEXT glad_wglDestroyDisplayColorTableEXT
+#endif
+#ifndef WGL_EXT_extensions_string
+#define WGL_EXT_extensions_string 1
+GLAPI int GLAD_WGL_EXT_extensions_string;
+typedef const char * (APIENTRYP PFNWGLGETEXTENSIONSSTRINGEXTPROC)(void);
+GLAPI PFNWGLGETEXTENSIONSSTRINGEXTPROC glad_wglGetExtensionsStringEXT;
+#define wglGetExtensionsStringEXT glad_wglGetExtensionsStringEXT
+#endif
+#ifndef WGL_EXT_framebuffer_sRGB
+#define WGL_EXT_framebuffer_sRGB 1
+GLAPI int GLAD_WGL_EXT_framebuffer_sRGB;
+#endif
+#ifndef WGL_EXT_make_current_read
+#define WGL_EXT_make_current_read 1
+GLAPI int GLAD_WGL_EXT_make_current_read;
+typedef BOOL (APIENTRYP PFNWGLMAKECONTEXTCURRENTEXTPROC)(HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
+GLAPI PFNWGLMAKECONTEXTCURRENTEXTPROC glad_wglMakeContextCurrentEXT;
+#define wglMakeContextCurrentEXT glad_wglMakeContextCurrentEXT
+typedef HDC (APIENTRYP PFNWGLGETCURRENTREADDCEXTPROC)(void);
+GLAPI PFNWGLGETCURRENTREADDCEXTPROC glad_wglGetCurrentReadDCEXT;
+#define wglGetCurrentReadDCEXT glad_wglGetCurrentReadDCEXT
+#endif
+#ifndef WGL_EXT_multisample
+#define WGL_EXT_multisample 1
+GLAPI int GLAD_WGL_EXT_multisample;
+#endif
+#ifndef WGL_EXT_pbuffer
+#define WGL_EXT_pbuffer 1
+GLAPI int GLAD_WGL_EXT_pbuffer;
+typedef HPBUFFEREXT (APIENTRYP PFNWGLCREATEPBUFFEREXTPROC)(HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList);
+GLAPI PFNWGLCREATEPBUFFEREXTPROC glad_wglCreatePbufferEXT;
+#define wglCreatePbufferEXT glad_wglCreatePbufferEXT
+typedef HDC (APIENTRYP PFNWGLGETPBUFFERDCEXTPROC)(HPBUFFEREXT hPbuffer);
+GLAPI PFNWGLGETPBUFFERDCEXTPROC glad_wglGetPbufferDCEXT;
+#define wglGetPbufferDCEXT glad_wglGetPbufferDCEXT
+typedef int (APIENTRYP PFNWGLRELEASEPBUFFERDCEXTPROC)(HPBUFFEREXT hPbuffer, HDC hDC);
+GLAPI PFNWGLRELEASEPBUFFERDCEXTPROC glad_wglReleasePbufferDCEXT;
+#define wglReleasePbufferDCEXT glad_wglReleasePbufferDCEXT
+typedef BOOL (APIENTRYP PFNWGLDESTROYPBUFFEREXTPROC)(HPBUFFEREXT hPbuffer);
+GLAPI PFNWGLDESTROYPBUFFEREXTPROC glad_wglDestroyPbufferEXT;
+#define wglDestroyPbufferEXT glad_wglDestroyPbufferEXT
+typedef BOOL (APIENTRYP PFNWGLQUERYPBUFFEREXTPROC)(HPBUFFEREXT hPbuffer, int iAttribute, int *piValue);
+GLAPI PFNWGLQUERYPBUFFEREXTPROC glad_wglQueryPbufferEXT;
+#define wglQueryPbufferEXT glad_wglQueryPbufferEXT
+#endif
+#ifndef WGL_EXT_pixel_format
+#define WGL_EXT_pixel_format 1
+GLAPI int GLAD_WGL_EXT_pixel_format;
+typedef BOOL (APIENTRYP PFNWGLGETPIXELFORMATATTRIBIVEXTPROC)(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, int *piValues);
+GLAPI PFNWGLGETPIXELFORMATATTRIBIVEXTPROC glad_wglGetPixelFormatAttribivEXT;
+#define wglGetPixelFormatAttribivEXT glad_wglGetPixelFormatAttribivEXT
+typedef BOOL (APIENTRYP PFNWGLGETPIXELFORMATATTRIBFVEXTPROC)(HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int *piAttributes, FLOAT *pfValues);
+GLAPI PFNWGLGETPIXELFORMATATTRIBFVEXTPROC glad_wglGetPixelFormatAttribfvEXT;
+#define wglGetPixelFormatAttribfvEXT glad_wglGetPixelFormatAttribfvEXT
+typedef BOOL (APIENTRYP PFNWGLCHOOSEPIXELFORMATEXTPROC)(HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);
+GLAPI PFNWGLCHOOSEPIXELFORMATEXTPROC glad_wglChoosePixelFormatEXT;
+#define wglChoosePixelFormatEXT glad_wglChoosePixelFormatEXT
+#endif
+#ifndef WGL_EXT_pixel_format_packed_float
+#define WGL_EXT_pixel_format_packed_float 1
+GLAPI int GLAD_WGL_EXT_pixel_format_packed_float;
+#endif
+#ifndef WGL_EXT_swap_control
+#define WGL_EXT_swap_control 1
+GLAPI int GLAD_WGL_EXT_swap_control;
+typedef BOOL (APIENTRYP PFNWGLSWAPINTERVALEXTPROC)(int interval);
+GLAPI PFNWGLSWAPINTERVALEXTPROC glad_wglSwapIntervalEXT;
+#define wglSwapIntervalEXT glad_wglSwapIntervalEXT
+typedef int (APIENTRYP PFNWGLGETSWAPINTERVALEXTPROC)(void);
+GLAPI PFNWGLGETSWAPINTERVALEXTPROC glad_wglGetSwapIntervalEXT;
+#define wglGetSwapIntervalEXT glad_wglGetSwapIntervalEXT
+#endif
+#ifndef WGL_EXT_swap_control_tear
+#define WGL_EXT_swap_control_tear 1
+GLAPI int GLAD_WGL_EXT_swap_control_tear;
+#endif
+#ifndef WGL_I3D_digital_video_control
+#define WGL_I3D_digital_video_control 1
+GLAPI int GLAD_WGL_I3D_digital_video_control;
+typedef BOOL (APIENTRYP PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC)(HDC hDC, int iAttribute, int *piValue);
+GLAPI PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC glad_wglGetDigitalVideoParametersI3D;
+#define wglGetDigitalVideoParametersI3D glad_wglGetDigitalVideoParametersI3D
+typedef BOOL (APIENTRYP PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC)(HDC hDC, int iAttribute, const int *piValue);
+GLAPI PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC glad_wglSetDigitalVideoParametersI3D;
+#define wglSetDigitalVideoParametersI3D glad_wglSetDigitalVideoParametersI3D
+#endif
+#ifndef WGL_I3D_gamma
+#define WGL_I3D_gamma 1
+GLAPI int GLAD_WGL_I3D_gamma;
+typedef BOOL (APIENTRYP PFNWGLGETGAMMATABLEPARAMETERSI3DPROC)(HDC hDC, int iAttribute, int *piValue);
+GLAPI PFNWGLGETGAMMATABLEPARAMETERSI3DPROC glad_wglGetGammaTableParametersI3D;
+#define wglGetGammaTableParametersI3D glad_wglGetGammaTableParametersI3D
+typedef BOOL (APIENTRYP PFNWGLSETGAMMATABLEPARAMETERSI3DPROC)(HDC hDC, int iAttribute, const int *piValue);
+GLAPI PFNWGLSETGAMMATABLEPARAMETERSI3DPROC glad_wglSetGammaTableParametersI3D;
+#define wglSetGammaTableParametersI3D glad_wglSetGammaTableParametersI3D
+typedef BOOL (APIENTRYP PFNWGLGETGAMMATABLEI3DPROC)(HDC hDC, int iEntries, USHORT *puRed, USHORT *puGreen, USHORT *puBlue);
+GLAPI PFNWGLGETGAMMATABLEI3DPROC glad_wglGetGammaTableI3D;
+#define wglGetGammaTableI3D glad_wglGetGammaTableI3D
+typedef BOOL (APIENTRYP PFNWGLSETGAMMATABLEI3DPROC)(HDC hDC, int iEntries, const USHORT *puRed, const USHORT *puGreen, const USHORT *puBlue);
+GLAPI PFNWGLSETGAMMATABLEI3DPROC glad_wglSetGammaTableI3D;
+#define wglSetGammaTableI3D glad_wglSetGammaTableI3D
+#endif
+#ifndef WGL_I3D_genlock
+#define WGL_I3D_genlock 1
+GLAPI int GLAD_WGL_I3D_genlock;
+typedef BOOL (APIENTRYP PFNWGLENABLEGENLOCKI3DPROC)(HDC hDC);
+GLAPI PFNWGLENABLEGENLOCKI3DPROC glad_wglEnableGenlockI3D;
+#define wglEnableGenlockI3D glad_wglEnableGenlockI3D
+typedef BOOL (APIENTRYP PFNWGLDISABLEGENLOCKI3DPROC)(HDC hDC);
+GLAPI PFNWGLDISABLEGENLOCKI3DPROC glad_wglDisableGenlockI3D;
+#define wglDisableGenlockI3D glad_wglDisableGenlockI3D
+typedef BOOL (APIENTRYP PFNWGLISENABLEDGENLOCKI3DPROC)(HDC hDC, BOOL *pFlag);
+GLAPI PFNWGLISENABLEDGENLOCKI3DPROC glad_wglIsEnabledGenlockI3D;
+#define wglIsEnabledGenlockI3D glad_wglIsEnabledGenlockI3D
+typedef BOOL (APIENTRYP PFNWGLGENLOCKSOURCEI3DPROC)(HDC hDC, UINT uSource);
+GLAPI PFNWGLGENLOCKSOURCEI3DPROC glad_wglGenlockSourceI3D;
+#define wglGenlockSourceI3D glad_wglGenlockSourceI3D
+typedef BOOL (APIENTRYP PFNWGLGETGENLOCKSOURCEI3DPROC)(HDC hDC, UINT *uSource);
+GLAPI PFNWGLGETGENLOCKSOURCEI3DPROC glad_wglGetGenlockSourceI3D;
+#define wglGetGenlockSourceI3D glad_wglGetGenlockSourceI3D
+typedef BOOL (APIENTRYP PFNWGLGENLOCKSOURCEEDGEI3DPROC)(HDC hDC, UINT uEdge);
+GLAPI PFNWGLGENLOCKSOURCEEDGEI3DPROC glad_wglGenlockSourceEdgeI3D;
+#define wglGenlockSourceEdgeI3D glad_wglGenlockSourceEdgeI3D
+typedef BOOL (APIENTRYP PFNWGLGETGENLOCKSOURCEEDGEI3DPROC)(HDC hDC, UINT *uEdge);
+GLAPI PFNWGLGETGENLOCKSOURCEEDGEI3DPROC glad_wglGetGenlockSourceEdgeI3D;
+#define wglGetGenlockSourceEdgeI3D glad_wglGetGenlockSourceEdgeI3D
+typedef BOOL (APIENTRYP PFNWGLGENLOCKSAMPLERATEI3DPROC)(HDC hDC, UINT uRate);
+GLAPI PFNWGLGENLOCKSAMPLERATEI3DPROC glad_wglGenlockSampleRateI3D;
+#define wglGenlockSampleRateI3D glad_wglGenlockSampleRateI3D
+typedef BOOL (APIENTRYP PFNWGLGETGENLOCKSAMPLERATEI3DPROC)(HDC hDC, UINT *uRate);
+GLAPI PFNWGLGETGENLOCKSAMPLERATEI3DPROC glad_wglGetGenlockSampleRateI3D;
+#define wglGetGenlockSampleRateI3D glad_wglGetGenlockSampleRateI3D
+typedef BOOL (APIENTRYP PFNWGLGENLOCKSOURCEDELAYI3DPROC)(HDC hDC, UINT uDelay);
+GLAPI PFNWGLGENLOCKSOURCEDELAYI3DPROC glad_wglGenlockSourceDelayI3D;
+#define wglGenlockSourceDelayI3D glad_wglGenlockSourceDelayI3D
+typedef BOOL (APIENTRYP PFNWGLGETGENLOCKSOURCEDELAYI3DPROC)(HDC hDC, UINT *uDelay);
+GLAPI PFNWGLGETGENLOCKSOURCEDELAYI3DPROC glad_wglGetGenlockSourceDelayI3D;
+#define wglGetGenlockSourceDelayI3D glad_wglGetGenlockSourceDelayI3D
+typedef BOOL (APIENTRYP PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC)(HDC hDC, UINT *uMaxLineDelay, UINT *uMaxPixelDelay);
+GLAPI PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC glad_wglQueryGenlockMaxSourceDelayI3D;
+#define wglQueryGenlockMaxSourceDelayI3D glad_wglQueryGenlockMaxSourceDelayI3D
+#endif
+#ifndef WGL_I3D_image_buffer
+#define WGL_I3D_image_buffer 1
+GLAPI int GLAD_WGL_I3D_image_buffer;
+typedef LPVOID (APIENTRYP PFNWGLCREATEIMAGEBUFFERI3DPROC)(HDC hDC, DWORD dwSize, UINT uFlags);
+GLAPI PFNWGLCREATEIMAGEBUFFERI3DPROC glad_wglCreateImageBufferI3D;
+#define wglCreateImageBufferI3D glad_wglCreateImageBufferI3D
+typedef BOOL (APIENTRYP PFNWGLDESTROYIMAGEBUFFERI3DPROC)(HDC hDC, LPVOID pAddress);
+GLAPI PFNWGLDESTROYIMAGEBUFFERI3DPROC glad_wglDestroyImageBufferI3D;
+#define wglDestroyImageBufferI3D glad_wglDestroyImageBufferI3D
+typedef BOOL (APIENTRYP PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC)(HDC hDC, const HANDLE *pEvent, const LPVOID *pAddress, const DWORD *pSize, UINT count);
+GLAPI PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC glad_wglAssociateImageBufferEventsI3D;
+#define wglAssociateImageBufferEventsI3D glad_wglAssociateImageBufferEventsI3D
+typedef BOOL (APIENTRYP PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC)(HDC hDC, const LPVOID *pAddress, UINT count);
+GLAPI PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC glad_wglReleaseImageBufferEventsI3D;
+#define wglReleaseImageBufferEventsI3D glad_wglReleaseImageBufferEventsI3D
+#endif
+#ifndef WGL_I3D_swap_frame_lock
+#define WGL_I3D_swap_frame_lock 1
+GLAPI int GLAD_WGL_I3D_swap_frame_lock;
+typedef BOOL (APIENTRYP PFNWGLENABLEFRAMELOCKI3DPROC)(void);
+GLAPI PFNWGLENABLEFRAMELOCKI3DPROC glad_wglEnableFrameLockI3D;
+#define wglEnableFrameLockI3D glad_wglEnableFrameLockI3D
+typedef BOOL (APIENTRYP PFNWGLDISABLEFRAMELOCKI3DPROC)(void);
+GLAPI PFNWGLDISABLEFRAMELOCKI3DPROC glad_wglDisableFrameLockI3D;
+#define wglDisableFrameLockI3D glad_wglDisableFrameLockI3D
+typedef BOOL (APIENTRYP PFNWGLISENABLEDFRAMELOCKI3DPROC)(BOOL *pFlag);
+GLAPI PFNWGLISENABLEDFRAMELOCKI3DPROC glad_wglIsEnabledFrameLockI3D;
+#define wglIsEnabledFrameLockI3D glad_wglIsEnabledFrameLockI3D
+typedef BOOL (APIENTRYP PFNWGLQUERYFRAMELOCKMASTERI3DPROC)(BOOL *pFlag);
+GLAPI PFNWGLQUERYFRAMELOCKMASTERI3DPROC glad_wglQueryFrameLockMasterI3D;
+#define wglQueryFrameLockMasterI3D glad_wglQueryFrameLockMasterI3D
+#endif
+#ifndef WGL_I3D_swap_frame_usage
+#define WGL_I3D_swap_frame_usage 1
+GLAPI int GLAD_WGL_I3D_swap_frame_usage;
+typedef BOOL (APIENTRYP PFNWGLGETFRAMEUSAGEI3DPROC)(float *pUsage);
+GLAPI PFNWGLGETFRAMEUSAGEI3DPROC glad_wglGetFrameUsageI3D;
+#define wglGetFrameUsageI3D glad_wglGetFrameUsageI3D
+typedef BOOL (APIENTRYP PFNWGLBEGINFRAMETRACKINGI3DPROC)(void);
+GLAPI PFNWGLBEGINFRAMETRACKINGI3DPROC glad_wglBeginFrameTrackingI3D;
+#define wglBeginFrameTrackingI3D glad_wglBeginFrameTrackingI3D
+typedef BOOL (APIENTRYP PFNWGLENDFRAMETRACKINGI3DPROC)(void);
+GLAPI PFNWGLENDFRAMETRACKINGI3DPROC glad_wglEndFrameTrackingI3D;
+#define wglEndFrameTrackingI3D glad_wglEndFrameTrackingI3D
+typedef BOOL (APIENTRYP PFNWGLQUERYFRAMETRACKINGI3DPROC)(DWORD *pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage);
+GLAPI PFNWGLQUERYFRAMETRACKINGI3DPROC glad_wglQueryFrameTrackingI3D;
+#define wglQueryFrameTrackingI3D glad_wglQueryFrameTrackingI3D
+#endif
+#ifndef WGL_NV_DX_interop
+#define WGL_NV_DX_interop 1
+GLAPI int GLAD_WGL_NV_DX_interop;
+typedef BOOL (APIENTRYP PFNWGLDXSETRESOURCESHAREHANDLENVPROC)(void *dxObject, HANDLE shareHandle);
+GLAPI PFNWGLDXSETRESOURCESHAREHANDLENVPROC glad_wglDXSetResourceShareHandleNV;
+#define wglDXSetResourceShareHandleNV glad_wglDXSetResourceShareHandleNV
+typedef HANDLE (APIENTRYP PFNWGLDXOPENDEVICENVPROC)(void *dxDevice);
+GLAPI PFNWGLDXOPENDEVICENVPROC glad_wglDXOpenDeviceNV;
+#define wglDXOpenDeviceNV glad_wglDXOpenDeviceNV
+typedef BOOL (APIENTRYP PFNWGLDXCLOSEDEVICENVPROC)(HANDLE hDevice);
+GLAPI PFNWGLDXCLOSEDEVICENVPROC glad_wglDXCloseDeviceNV;
+#define wglDXCloseDeviceNV glad_wglDXCloseDeviceNV
+typedef HANDLE (APIENTRYP PFNWGLDXREGISTEROBJECTNVPROC)(HANDLE hDevice, void *dxObject, GLuint name, GLenum type, GLenum access);
+GLAPI PFNWGLDXREGISTEROBJECTNVPROC glad_wglDXRegisterObjectNV;
+#define wglDXRegisterObjectNV glad_wglDXRegisterObjectNV
+typedef BOOL (APIENTRYP PFNWGLDXUNREGISTEROBJECTNVPROC)(HANDLE hDevice, HANDLE hObject);
+GLAPI PFNWGLDXUNREGISTEROBJECTNVPROC glad_wglDXUnregisterObjectNV;
+#define wglDXUnregisterObjectNV glad_wglDXUnregisterObjectNV
+typedef BOOL (APIENTRYP PFNWGLDXOBJECTACCESSNVPROC)(HANDLE hObject, GLenum access);
+GLAPI PFNWGLDXOBJECTACCESSNVPROC glad_wglDXObjectAccessNV;
+#define wglDXObjectAccessNV glad_wglDXObjectAccessNV
+typedef BOOL (APIENTRYP PFNWGLDXLOCKOBJECTSNVPROC)(HANDLE hDevice, GLint count, HANDLE *hObjects);
+GLAPI PFNWGLDXLOCKOBJECTSNVPROC glad_wglDXLockObjectsNV;
+#define wglDXLockObjectsNV glad_wglDXLockObjectsNV
+typedef BOOL (APIENTRYP PFNWGLDXUNLOCKOBJECTSNVPROC)(HANDLE hDevice, GLint count, HANDLE *hObjects);
+GLAPI PFNWGLDXUNLOCKOBJECTSNVPROC glad_wglDXUnlockObjectsNV;
+#define wglDXUnlockObjectsNV glad_wglDXUnlockObjectsNV
+#endif
+#ifndef WGL_NV_DX_interop2
+#define WGL_NV_DX_interop2 1
+GLAPI int GLAD_WGL_NV_DX_interop2;
+#endif
+#ifndef WGL_NV_copy_image
+#define WGL_NV_copy_image 1
+GLAPI int GLAD_WGL_NV_copy_image;
+typedef BOOL (APIENTRYP PFNWGLCOPYIMAGESUBDATANVPROC)(HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);
+GLAPI PFNWGLCOPYIMAGESUBDATANVPROC glad_wglCopyImageSubDataNV;
+#define wglCopyImageSubDataNV glad_wglCopyImageSubDataNV
+#endif
+#ifndef WGL_NV_delay_before_swap
+#define WGL_NV_delay_before_swap 1
+GLAPI int GLAD_WGL_NV_delay_before_swap;
+typedef BOOL (APIENTRYP PFNWGLDELAYBEFORESWAPNVPROC)(HDC hDC, GLfloat seconds);
+GLAPI PFNWGLDELAYBEFORESWAPNVPROC glad_wglDelayBeforeSwapNV;
+#define wglDelayBeforeSwapNV glad_wglDelayBeforeSwapNV
+#endif
+#ifndef WGL_NV_float_buffer
+#define WGL_NV_float_buffer 1
+GLAPI int GLAD_WGL_NV_float_buffer;
+#endif
+#ifndef WGL_NV_gpu_affinity
+#define WGL_NV_gpu_affinity 1
+GLAPI int GLAD_WGL_NV_gpu_affinity;
+typedef BOOL (APIENTRYP PFNWGLENUMGPUSNVPROC)(UINT iGpuIndex, HGPUNV *phGpu);
+GLAPI PFNWGLENUMGPUSNVPROC glad_wglEnumGpusNV;
+#define wglEnumGpusNV glad_wglEnumGpusNV
+typedef BOOL (APIENTRYP PFNWGLENUMGPUDEVICESNVPROC)(HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice);
+GLAPI PFNWGLENUMGPUDEVICESNVPROC glad_wglEnumGpuDevicesNV;
+#define wglEnumGpuDevicesNV glad_wglEnumGpuDevicesNV
+typedef HDC (APIENTRYP PFNWGLCREATEAFFINITYDCNVPROC)(const HGPUNV *phGpuList);
+GLAPI PFNWGLCREATEAFFINITYDCNVPROC glad_wglCreateAffinityDCNV;
+#define wglCreateAffinityDCNV glad_wglCreateAffinityDCNV
+typedef BOOL (APIENTRYP PFNWGLENUMGPUSFROMAFFINITYDCNVPROC)(HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu);
+GLAPI PFNWGLENUMGPUSFROMAFFINITYDCNVPROC glad_wglEnumGpusFromAffinityDCNV;
+#define wglEnumGpusFromAffinityDCNV glad_wglEnumGpusFromAffinityDCNV
+typedef BOOL (APIENTRYP PFNWGLDELETEDCNVPROC)(HDC hdc);
+GLAPI PFNWGLDELETEDCNVPROC glad_wglDeleteDCNV;
+#define wglDeleteDCNV glad_wglDeleteDCNV
+#endif
+#ifndef WGL_NV_multigpu_context
+#define WGL_NV_multigpu_context 1
+GLAPI int GLAD_WGL_NV_multigpu_context;
+#endif
+#ifndef WGL_NV_multisample_coverage
+#define WGL_NV_multisample_coverage 1
+GLAPI int GLAD_WGL_NV_multisample_coverage;
+#endif
+#ifndef WGL_NV_present_video
+#define WGL_NV_present_video 1
+GLAPI int GLAD_WGL_NV_present_video;
+typedef int (APIENTRYP PFNWGLENUMERATEVIDEODEVICESNVPROC)(HDC hDc, HVIDEOOUTPUTDEVICENV *phDeviceList);
+GLAPI PFNWGLENUMERATEVIDEODEVICESNVPROC glad_wglEnumerateVideoDevicesNV;
+#define wglEnumerateVideoDevicesNV glad_wglEnumerateVideoDevicesNV
+typedef BOOL (APIENTRYP PFNWGLBINDVIDEODEVICENVPROC)(HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int *piAttribList);
+GLAPI PFNWGLBINDVIDEODEVICENVPROC glad_wglBindVideoDeviceNV;
+#define wglBindVideoDeviceNV glad_wglBindVideoDeviceNV
+typedef BOOL (APIENTRYP PFNWGLQUERYCURRENTCONTEXTNVPROC)(int iAttribute, int *piValue);
+GLAPI PFNWGLQUERYCURRENTCONTEXTNVPROC glad_wglQueryCurrentContextNV;
+#define wglQueryCurrentContextNV glad_wglQueryCurrentContextNV
+#endif
+#ifndef WGL_NV_render_depth_texture
+#define WGL_NV_render_depth_texture 1
+GLAPI int GLAD_WGL_NV_render_depth_texture;
+#endif
+#ifndef WGL_NV_render_texture_rectangle
+#define WGL_NV_render_texture_rectangle 1
+GLAPI int GLAD_WGL_NV_render_texture_rectangle;
+#endif
+#ifndef WGL_NV_swap_group
+#define WGL_NV_swap_group 1
+GLAPI int GLAD_WGL_NV_swap_group;
+typedef BOOL (APIENTRYP PFNWGLJOINSWAPGROUPNVPROC)(HDC hDC, GLuint group);
+GLAPI PFNWGLJOINSWAPGROUPNVPROC glad_wglJoinSwapGroupNV;
+#define wglJoinSwapGroupNV glad_wglJoinSwapGroupNV
+typedef BOOL (APIENTRYP PFNWGLBINDSWAPBARRIERNVPROC)(GLuint group, GLuint barrier);
+GLAPI PFNWGLBINDSWAPBARRIERNVPROC glad_wglBindSwapBarrierNV;
+#define wglBindSwapBarrierNV glad_wglBindSwapBarrierNV
+typedef BOOL (APIENTRYP PFNWGLQUERYSWAPGROUPNVPROC)(HDC hDC, GLuint *group, GLuint *barrier);
+GLAPI PFNWGLQUERYSWAPGROUPNVPROC glad_wglQuerySwapGroupNV;
+#define wglQuerySwapGroupNV glad_wglQuerySwapGroupNV
+typedef BOOL (APIENTRYP PFNWGLQUERYMAXSWAPGROUPSNVPROC)(HDC hDC, GLuint *maxGroups, GLuint *maxBarriers);
+GLAPI PFNWGLQUERYMAXSWAPGROUPSNVPROC glad_wglQueryMaxSwapGroupsNV;
+#define wglQueryMaxSwapGroupsNV glad_wglQueryMaxSwapGroupsNV
+typedef BOOL (APIENTRYP PFNWGLQUERYFRAMECOUNTNVPROC)(HDC hDC, GLuint *count);
+GLAPI PFNWGLQUERYFRAMECOUNTNVPROC glad_wglQueryFrameCountNV;
+#define wglQueryFrameCountNV glad_wglQueryFrameCountNV
+typedef BOOL (APIENTRYP PFNWGLRESETFRAMECOUNTNVPROC)(HDC hDC);
+GLAPI PFNWGLRESETFRAMECOUNTNVPROC glad_wglResetFrameCountNV;
+#define wglResetFrameCountNV glad_wglResetFrameCountNV
+#endif
+#ifndef WGL_NV_vertex_array_range
+#define WGL_NV_vertex_array_range 1
+GLAPI int GLAD_WGL_NV_vertex_array_range;
+typedef void * (APIENTRYP PFNWGLALLOCATEMEMORYNVPROC)(GLsizei size, GLfloat readfreq, GLfloat writefreq, GLfloat priority);
+GLAPI PFNWGLALLOCATEMEMORYNVPROC glad_wglAllocateMemoryNV;
+#define wglAllocateMemoryNV glad_wglAllocateMemoryNV
+typedef void (APIENTRYP PFNWGLFREEMEMORYNVPROC)(void *pointer);
+GLAPI PFNWGLFREEMEMORYNVPROC glad_wglFreeMemoryNV;
+#define wglFreeMemoryNV glad_wglFreeMemoryNV
+#endif
+#ifndef WGL_NV_video_capture
+#define WGL_NV_video_capture 1
+GLAPI int GLAD_WGL_NV_video_capture;
+typedef BOOL (APIENTRYP PFNWGLBINDVIDEOCAPTUREDEVICENVPROC)(UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice);
+GLAPI PFNWGLBINDVIDEOCAPTUREDEVICENVPROC glad_wglBindVideoCaptureDeviceNV;
+#define wglBindVideoCaptureDeviceNV glad_wglBindVideoCaptureDeviceNV
+typedef UINT (APIENTRYP PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC)(HDC hDc, HVIDEOINPUTDEVICENV *phDeviceList);
+GLAPI PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC glad_wglEnumerateVideoCaptureDevicesNV;
+#define wglEnumerateVideoCaptureDevicesNV glad_wglEnumerateVideoCaptureDevicesNV
+typedef BOOL (APIENTRYP PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC)(HDC hDc, HVIDEOINPUTDEVICENV hDevice);
+GLAPI PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC glad_wglLockVideoCaptureDeviceNV;
+#define wglLockVideoCaptureDeviceNV glad_wglLockVideoCaptureDeviceNV
+typedef BOOL (APIENTRYP PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC)(HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int *piValue);
+GLAPI PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC glad_wglQueryVideoCaptureDeviceNV;
+#define wglQueryVideoCaptureDeviceNV glad_wglQueryVideoCaptureDeviceNV
+typedef BOOL (APIENTRYP PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC)(HDC hDc, HVIDEOINPUTDEVICENV hDevice);
+GLAPI PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC glad_wglReleaseVideoCaptureDeviceNV;
+#define wglReleaseVideoCaptureDeviceNV glad_wglReleaseVideoCaptureDeviceNV
+#endif
+#ifndef WGL_NV_video_output
+#define WGL_NV_video_output 1
+GLAPI int GLAD_WGL_NV_video_output;
+typedef BOOL (APIENTRYP PFNWGLGETVIDEODEVICENVPROC)(HDC hDC, int numDevices, HPVIDEODEV *hVideoDevice);
+GLAPI PFNWGLGETVIDEODEVICENVPROC glad_wglGetVideoDeviceNV;
+#define wglGetVideoDeviceNV glad_wglGetVideoDeviceNV
+typedef BOOL (APIENTRYP PFNWGLRELEASEVIDEODEVICENVPROC)(HPVIDEODEV hVideoDevice);
+GLAPI PFNWGLRELEASEVIDEODEVICENVPROC glad_wglReleaseVideoDeviceNV;
+#define wglReleaseVideoDeviceNV glad_wglReleaseVideoDeviceNV
+typedef BOOL (APIENTRYP PFNWGLBINDVIDEOIMAGENVPROC)(HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer);
+GLAPI PFNWGLBINDVIDEOIMAGENVPROC glad_wglBindVideoImageNV;
+#define wglBindVideoImageNV glad_wglBindVideoImageNV
+typedef BOOL (APIENTRYP PFNWGLRELEASEVIDEOIMAGENVPROC)(HPBUFFERARB hPbuffer, int iVideoBuffer);
+GLAPI PFNWGLRELEASEVIDEOIMAGENVPROC glad_wglReleaseVideoImageNV;
+#define wglReleaseVideoImageNV glad_wglReleaseVideoImageNV
+typedef BOOL (APIENTRYP PFNWGLSENDPBUFFERTOVIDEONVPROC)(HPBUFFERARB hPbuffer, int iBufferType, unsigned long *pulCounterPbuffer, BOOL bBlock);
+GLAPI PFNWGLSENDPBUFFERTOVIDEONVPROC glad_wglSendPbufferToVideoNV;
+#define wglSendPbufferToVideoNV glad_wglSendPbufferToVideoNV
+typedef BOOL (APIENTRYP PFNWGLGETVIDEOINFONVPROC)(HPVIDEODEV hpVideoDevice, unsigned long *pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo);
+GLAPI PFNWGLGETVIDEOINFONVPROC glad_wglGetVideoInfoNV;
+#define wglGetVideoInfoNV glad_wglGetVideoInfoNV
+#endif
+#ifndef WGL_OML_sync_control
+#define WGL_OML_sync_control 1
+GLAPI int GLAD_WGL_OML_sync_control;
+typedef BOOL (APIENTRYP PFNWGLGETSYNCVALUESOMLPROC)(HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc);
+GLAPI PFNWGLGETSYNCVALUESOMLPROC glad_wglGetSyncValuesOML;
+#define wglGetSyncValuesOML glad_wglGetSyncValuesOML
+typedef BOOL (APIENTRYP PFNWGLGETMSCRATEOMLPROC)(HDC hdc, INT32 *numerator, INT32 *denominator);
+GLAPI PFNWGLGETMSCRATEOMLPROC glad_wglGetMscRateOML;
+#define wglGetMscRateOML glad_wglGetMscRateOML
+typedef INT64 (APIENTRYP PFNWGLSWAPBUFFERSMSCOMLPROC)(HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder);
+GLAPI PFNWGLSWAPBUFFERSMSCOMLPROC glad_wglSwapBuffersMscOML;
+#define wglSwapBuffersMscOML glad_wglSwapBuffersMscOML
+typedef INT64 (APIENTRYP PFNWGLSWAPLAYERBUFFERSMSCOMLPROC)(HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder);
+GLAPI PFNWGLSWAPLAYERBUFFERSMSCOMLPROC glad_wglSwapLayerBuffersMscOML;
+#define wglSwapLayerBuffersMscOML glad_wglSwapLayerBuffersMscOML
+typedef BOOL (APIENTRYP PFNWGLWAITFORMSCOMLPROC)(HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64 *ust, INT64 *msc, INT64 *sbc);
+GLAPI PFNWGLWAITFORMSCOMLPROC glad_wglWaitForMscOML;
+#define wglWaitForMscOML glad_wglWaitForMscOML
+typedef BOOL (APIENTRYP PFNWGLWAITFORSBCOMLPROC)(HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc, INT64 *sbc);
+GLAPI PFNWGLWAITFORSBCOMLPROC glad_wglWaitForSbcOML;
+#define wglWaitForSbcOML glad_wglWaitForSbcOML
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/dep/glad/src/glad_egl.c b/dep/glad/src/glad_egl.c
new file mode 100644
index 000000000..08fe263f4
--- /dev/null
+++ b/dep/glad/src/glad_egl.c
@@ -0,0 +1,576 @@
+/*
+
+ EGL loader generated by glad 0.1.33 on Sun May 3 16:34:53 2020.
+
+ Language/Generator: C/C++
+ Specification: egl
+ APIs: egl=1.5
+ Profile: -
+ Extensions:
+ EGL_ANDROID_GLES_layers,
+ EGL_ANDROID_blob_cache,
+ EGL_ANDROID_create_native_client_buffer,
+ EGL_ANDROID_framebuffer_target,
+ EGL_ANDROID_front_buffer_auto_refresh,
+ EGL_ANDROID_get_frame_timestamps,
+ EGL_ANDROID_get_native_client_buffer,
+ EGL_ANDROID_image_native_buffer,
+ EGL_ANDROID_native_fence_sync,
+ EGL_ANDROID_presentation_time,
+ EGL_ANDROID_recordable,
+ EGL_ANGLE_d3d_share_handle_client_buffer,
+ EGL_ANGLE_device_d3d,
+ EGL_ANGLE_query_surface_pointer,
+ EGL_ANGLE_surface_d3d_texture_2d_share_handle,
+ EGL_ANGLE_window_fixed_size,
+ EGL_ARM_image_format,
+ EGL_ARM_implicit_external_sync,
+ EGL_ARM_pixmap_multisample_discard,
+ EGL_EXT_bind_to_front,
+ EGL_EXT_buffer_age,
+ EGL_EXT_client_extensions,
+ EGL_EXT_client_sync,
+ EGL_EXT_compositor,
+ EGL_EXT_create_context_robustness,
+ EGL_EXT_device_base,
+ EGL_EXT_device_drm,
+ EGL_EXT_device_enumeration,
+ EGL_EXT_device_openwf,
+ EGL_EXT_device_query,
+ EGL_EXT_gl_colorspace_bt2020_linear,
+ EGL_EXT_gl_colorspace_bt2020_pq,
+ EGL_EXT_gl_colorspace_display_p3,
+ EGL_EXT_gl_colorspace_display_p3_linear,
+ EGL_EXT_gl_colorspace_display_p3_passthrough,
+ EGL_EXT_gl_colorspace_scrgb,
+ EGL_EXT_gl_colorspace_scrgb_linear,
+ EGL_EXT_image_dma_buf_import,
+ EGL_EXT_image_dma_buf_import_modifiers,
+ EGL_EXT_image_gl_colorspace,
+ EGL_EXT_image_implicit_sync_control,
+ EGL_EXT_multiview_window,
+ EGL_EXT_output_base,
+ EGL_EXT_output_drm,
+ EGL_EXT_output_openwf,
+ EGL_EXT_pixel_format_float,
+ EGL_EXT_platform_base,
+ EGL_EXT_platform_device,
+ EGL_EXT_platform_wayland,
+ EGL_EXT_platform_x11,
+ EGL_EXT_protected_content,
+ EGL_EXT_protected_surface,
+ EGL_EXT_stream_consumer_egloutput,
+ EGL_EXT_surface_CTA861_3_metadata,
+ EGL_EXT_surface_SMPTE2086_metadata,
+ EGL_EXT_swap_buffers_with_damage,
+ EGL_EXT_sync_reuse,
+ EGL_EXT_yuv_surface,
+ EGL_HI_clientpixmap,
+ EGL_HI_colorformats,
+ EGL_IMG_context_priority,
+ EGL_IMG_image_plane_attribs,
+ EGL_KHR_cl_event,
+ EGL_KHR_cl_event2,
+ EGL_KHR_client_get_all_proc_addresses,
+ EGL_KHR_config_attribs,
+ EGL_KHR_context_flush_control,
+ EGL_KHR_create_context,
+ EGL_KHR_create_context_no_error,
+ EGL_KHR_debug,
+ EGL_KHR_display_reference,
+ EGL_KHR_fence_sync,
+ EGL_KHR_get_all_proc_addresses,
+ EGL_KHR_gl_colorspace,
+ EGL_KHR_gl_renderbuffer_image,
+ EGL_KHR_gl_texture_2D_image,
+ EGL_KHR_gl_texture_3D_image,
+ EGL_KHR_gl_texture_cubemap_image,
+ EGL_KHR_image,
+ EGL_KHR_image_base,
+ EGL_KHR_image_pixmap,
+ EGL_KHR_lock_surface,
+ EGL_KHR_lock_surface2,
+ EGL_KHR_lock_surface3,
+ EGL_KHR_mutable_render_buffer,
+ EGL_KHR_no_config_context,
+ EGL_KHR_partial_update,
+ EGL_KHR_platform_android,
+ EGL_KHR_platform_gbm,
+ EGL_KHR_platform_wayland,
+ EGL_KHR_platform_x11,
+ EGL_KHR_reusable_sync,
+ EGL_KHR_stream,
+ EGL_KHR_stream_attrib,
+ EGL_KHR_stream_consumer_gltexture,
+ EGL_KHR_stream_cross_process_fd,
+ EGL_KHR_stream_fifo,
+ EGL_KHR_stream_producer_aldatalocator,
+ EGL_KHR_stream_producer_eglsurface,
+ EGL_KHR_surfaceless_context,
+ EGL_KHR_swap_buffers_with_damage,
+ EGL_KHR_vg_parent_image,
+ EGL_KHR_wait_sync,
+ EGL_MESA_drm_image,
+ EGL_MESA_image_dma_buf_export,
+ EGL_MESA_platform_gbm,
+ EGL_MESA_platform_surfaceless,
+ EGL_MESA_query_driver,
+ EGL_NOK_swap_region,
+ EGL_NOK_swap_region2,
+ EGL_NOK_texture_from_pixmap,
+ EGL_NV_3dvision_surface,
+ EGL_NV_context_priority_realtime,
+ EGL_NV_coverage_sample,
+ EGL_NV_coverage_sample_resolve,
+ EGL_NV_cuda_event,
+ EGL_NV_depth_nonlinear,
+ EGL_NV_device_cuda,
+ EGL_NV_native_query,
+ EGL_NV_post_convert_rounding,
+ EGL_NV_post_sub_buffer,
+ EGL_NV_quadruple_buffer,
+ EGL_NV_robustness_video_memory_purge,
+ EGL_NV_stream_consumer_gltexture_yuv,
+ EGL_NV_stream_cross_display,
+ EGL_NV_stream_cross_object,
+ EGL_NV_stream_cross_partition,
+ EGL_NV_stream_cross_process,
+ EGL_NV_stream_cross_system,
+ EGL_NV_stream_dma,
+ EGL_NV_stream_fifo_next,
+ EGL_NV_stream_fifo_synchronous,
+ EGL_NV_stream_flush,
+ EGL_NV_stream_frame_limits,
+ EGL_NV_stream_metadata,
+ EGL_NV_stream_origin,
+ EGL_NV_stream_remote,
+ EGL_NV_stream_reset,
+ EGL_NV_stream_socket,
+ EGL_NV_stream_socket_inet,
+ EGL_NV_stream_socket_unix,
+ EGL_NV_stream_sync,
+ EGL_NV_sync,
+ EGL_NV_system_time,
+ EGL_NV_triple_buffer,
+ EGL_TIZEN_image_native_buffer,
+ EGL_TIZEN_image_native_surface,
+ EGL_WL_bind_wayland_display,
+ EGL_WL_create_wayland_buffer_from_image
+ Loader: True
+ Local files: False
+ Omit khrplatform: False
+ Reproducible: False
+
+ Commandline:
+ --api="egl=1.5" --generator="c" --spec="egl" --extensions="EGL_ANDROID_GLES_layers,EGL_ANDROID_blob_cache,EGL_ANDROID_create_native_client_buffer,EGL_ANDROID_framebuffer_target,EGL_ANDROID_front_buffer_auto_refresh,EGL_ANDROID_get_frame_timestamps,EGL_ANDROID_get_native_client_buffer,EGL_ANDROID_image_native_buffer,EGL_ANDROID_native_fence_sync,EGL_ANDROID_presentation_time,EGL_ANDROID_recordable,EGL_ANGLE_d3d_share_handle_client_buffer,EGL_ANGLE_device_d3d,EGL_ANGLE_query_surface_pointer,EGL_ANGLE_surface_d3d_texture_2d_share_handle,EGL_ANGLE_window_fixed_size,EGL_ARM_image_format,EGL_ARM_implicit_external_sync,EGL_ARM_pixmap_multisample_discard,EGL_EXT_bind_to_front,EGL_EXT_buffer_age,EGL_EXT_client_extensions,EGL_EXT_client_sync,EGL_EXT_compositor,EGL_EXT_create_context_robustness,EGL_EXT_device_base,EGL_EXT_device_drm,EGL_EXT_device_enumeration,EGL_EXT_device_openwf,EGL_EXT_device_query,EGL_EXT_gl_colorspace_bt2020_linear,EGL_EXT_gl_colorspace_bt2020_pq,EGL_EXT_gl_colorspace_display_p3,EGL_EXT_gl_colorspace_display_p3_linear,EGL_EXT_gl_colorspace_display_p3_passthrough,EGL_EXT_gl_colorspace_scrgb,EGL_EXT_gl_colorspace_scrgb_linear,EGL_EXT_image_dma_buf_import,EGL_EXT_image_dma_buf_import_modifiers,EGL_EXT_image_gl_colorspace,EGL_EXT_image_implicit_sync_control,EGL_EXT_multiview_window,EGL_EXT_output_base,EGL_EXT_output_drm,EGL_EXT_output_openwf,EGL_EXT_pixel_format_float,EGL_EXT_platform_base,EGL_EXT_platform_device,EGL_EXT_platform_wayland,EGL_EXT_platform_x11,EGL_EXT_protected_content,EGL_EXT_protected_surface,EGL_EXT_stream_consumer_egloutput,EGL_EXT_surface_CTA861_3_metadata,EGL_EXT_surface_SMPTE2086_metadata,EGL_EXT_swap_buffers_with_damage,EGL_EXT_sync_reuse,EGL_EXT_yuv_surface,EGL_HI_clientpixmap,EGL_HI_colorformats,EGL_IMG_context_priority,EGL_IMG_image_plane_attribs,EGL_KHR_cl_event,EGL_KHR_cl_event2,EGL_KHR_client_get_all_proc_addresses,EGL_KHR_config_attribs,EGL_KHR_context_flush_control,EGL_KHR_create_context,EGL_KHR_create_context_no_error,EGL_KHR_debug,EGL_KHR_display_reference,EGL_KHR_fence_sync,EGL_KHR_get_all_proc_addresses,EGL_KHR_gl_colorspace,EGL_KHR_gl_renderbuffer_image,EGL_KHR_gl_texture_2D_image,EGL_KHR_gl_texture_3D_image,EGL_KHR_gl_texture_cubemap_image,EGL_KHR_image,EGL_KHR_image_base,EGL_KHR_image_pixmap,EGL_KHR_lock_surface,EGL_KHR_lock_surface2,EGL_KHR_lock_surface3,EGL_KHR_mutable_render_buffer,EGL_KHR_no_config_context,EGL_KHR_partial_update,EGL_KHR_platform_android,EGL_KHR_platform_gbm,EGL_KHR_platform_wayland,EGL_KHR_platform_x11,EGL_KHR_reusable_sync,EGL_KHR_stream,EGL_KHR_stream_attrib,EGL_KHR_stream_consumer_gltexture,EGL_KHR_stream_cross_process_fd,EGL_KHR_stream_fifo,EGL_KHR_stream_producer_aldatalocator,EGL_KHR_stream_producer_eglsurface,EGL_KHR_surfaceless_context,EGL_KHR_swap_buffers_with_damage,EGL_KHR_vg_parent_image,EGL_KHR_wait_sync,EGL_MESA_drm_image,EGL_MESA_image_dma_buf_export,EGL_MESA_platform_gbm,EGL_MESA_platform_surfaceless,EGL_MESA_query_driver,EGL_NOK_swap_region,EGL_NOK_swap_region2,EGL_NOK_texture_from_pixmap,EGL_NV_3dvision_surface,EGL_NV_context_priority_realtime,EGL_NV_coverage_sample,EGL_NV_coverage_sample_resolve,EGL_NV_cuda_event,EGL_NV_depth_nonlinear,EGL_NV_device_cuda,EGL_NV_native_query,EGL_NV_post_convert_rounding,EGL_NV_post_sub_buffer,EGL_NV_quadruple_buffer,EGL_NV_robustness_video_memory_purge,EGL_NV_stream_consumer_gltexture_yuv,EGL_NV_stream_cross_display,EGL_NV_stream_cross_object,EGL_NV_stream_cross_partition,EGL_NV_stream_cross_process,EGL_NV_stream_cross_system,EGL_NV_stream_dma,EGL_NV_stream_fifo_next,EGL_NV_stream_fifo_synchronous,EGL_NV_stream_flush,EGL_NV_stream_frame_limits,EGL_NV_stream_metadata,EGL_NV_stream_origin,EGL_NV_stream_remote,EGL_NV_stream_reset,EGL_NV_stream_socket,EGL_NV_stream_socket_inet,EGL_NV_stream_socket_unix,EGL_NV_stream_sync,EGL_NV_sync,EGL_NV_system_time,EGL_NV_triple_buffer,EGL_TIZEN_image_native_buffer,EGL_TIZEN_image_native_surface,EGL_WL_bind_wayland_display,EGL_WL_create_wayland_buffer_from_image"
+ Online:
+ Too many extensions
+*/
+
+#include
+#include
+#include
+#include "glad_egl.h"
+
+int gladLoadEGL(void) {
+ return gladLoadEGLLoader((GLADloadproc)eglGetProcAddress);
+}
+
+PFNEGLSETBLOBCACHEFUNCSANDROIDPROC glad_eglSetBlobCacheFuncsANDROID = NULL;
+PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC glad_eglCreateNativeClientBufferANDROID = NULL;
+PFNEGLGETCOMPOSITORTIMINGSUPPORTEDANDROIDPROC glad_eglGetCompositorTimingSupportedANDROID = NULL;
+PFNEGLGETCOMPOSITORTIMINGANDROIDPROC glad_eglGetCompositorTimingANDROID = NULL;
+PFNEGLGETNEXTFRAMEIDANDROIDPROC glad_eglGetNextFrameIdANDROID = NULL;
+PFNEGLGETFRAMETIMESTAMPSUPPORTEDANDROIDPROC glad_eglGetFrameTimestampSupportedANDROID = NULL;
+PFNEGLGETFRAMETIMESTAMPSANDROIDPROC glad_eglGetFrameTimestampsANDROID = NULL;
+PFNEGLGETNATIVECLIENTBUFFERANDROIDPROC glad_eglGetNativeClientBufferANDROID = NULL;
+PFNEGLDUPNATIVEFENCEFDANDROIDPROC glad_eglDupNativeFenceFDANDROID = NULL;
+PFNEGLPRESENTATIONTIMEANDROIDPROC glad_eglPresentationTimeANDROID = NULL;
+PFNEGLQUERYSURFACEPOINTERANGLEPROC glad_eglQuerySurfacePointerANGLE = NULL;
+PFNEGLCLIENTSIGNALSYNCEXTPROC glad_eglClientSignalSyncEXT = NULL;
+PFNEGLCOMPOSITORSETCONTEXTLISTEXTPROC glad_eglCompositorSetContextListEXT = NULL;
+PFNEGLCOMPOSITORSETCONTEXTATTRIBUTESEXTPROC glad_eglCompositorSetContextAttributesEXT = NULL;
+PFNEGLCOMPOSITORSETWINDOWLISTEXTPROC glad_eglCompositorSetWindowListEXT = NULL;
+PFNEGLCOMPOSITORSETWINDOWATTRIBUTESEXTPROC glad_eglCompositorSetWindowAttributesEXT = NULL;
+PFNEGLCOMPOSITORBINDTEXWINDOWEXTPROC glad_eglCompositorBindTexWindowEXT = NULL;
+PFNEGLCOMPOSITORSETSIZEEXTPROC glad_eglCompositorSetSizeEXT = NULL;
+PFNEGLCOMPOSITORSWAPPOLICYEXTPROC glad_eglCompositorSwapPolicyEXT = NULL;
+PFNEGLQUERYDEVICEATTRIBEXTPROC glad_eglQueryDeviceAttribEXT = NULL;
+PFNEGLQUERYDEVICESTRINGEXTPROC glad_eglQueryDeviceStringEXT = NULL;
+PFNEGLQUERYDEVICESEXTPROC glad_eglQueryDevicesEXT = NULL;
+PFNEGLQUERYDISPLAYATTRIBEXTPROC glad_eglQueryDisplayAttribEXT = NULL;
+PFNEGLQUERYDMABUFFORMATSEXTPROC glad_eglQueryDmaBufFormatsEXT = NULL;
+PFNEGLQUERYDMABUFMODIFIERSEXTPROC glad_eglQueryDmaBufModifiersEXT = NULL;
+PFNEGLGETOUTPUTLAYERSEXTPROC glad_eglGetOutputLayersEXT = NULL;
+PFNEGLGETOUTPUTPORTSEXTPROC glad_eglGetOutputPortsEXT = NULL;
+PFNEGLOUTPUTLAYERATTRIBEXTPROC glad_eglOutputLayerAttribEXT = NULL;
+PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC glad_eglQueryOutputLayerAttribEXT = NULL;
+PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC glad_eglQueryOutputLayerStringEXT = NULL;
+PFNEGLOUTPUTPORTATTRIBEXTPROC glad_eglOutputPortAttribEXT = NULL;
+PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC glad_eglQueryOutputPortAttribEXT = NULL;
+PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC glad_eglQueryOutputPortStringEXT = NULL;
+PFNEGLGETPLATFORMDISPLAYEXTPROC glad_eglGetPlatformDisplayEXT = NULL;
+PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC glad_eglCreatePlatformWindowSurfaceEXT = NULL;
+PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC glad_eglCreatePlatformPixmapSurfaceEXT = NULL;
+PFNEGLSTREAMCONSUMEROUTPUTEXTPROC glad_eglStreamConsumerOutputEXT = NULL;
+PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC glad_eglSwapBuffersWithDamageEXT = NULL;
+PFNEGLUNSIGNALSYNCEXTPROC glad_eglUnsignalSyncEXT = NULL;
+PFNEGLCREATEPIXMAPSURFACEHIPROC glad_eglCreatePixmapSurfaceHI = NULL;
+PFNEGLCREATESYNC64KHRPROC glad_eglCreateSync64KHR = NULL;
+PFNEGLDEBUGMESSAGECONTROLKHRPROC glad_eglDebugMessageControlKHR = NULL;
+PFNEGLQUERYDEBUGKHRPROC glad_eglQueryDebugKHR = NULL;
+PFNEGLLABELOBJECTKHRPROC glad_eglLabelObjectKHR = NULL;
+PFNEGLQUERYDISPLAYATTRIBKHRPROC glad_eglQueryDisplayAttribKHR = NULL;
+PFNEGLCREATESYNCKHRPROC glad_eglCreateSyncKHR = NULL;
+PFNEGLDESTROYSYNCKHRPROC glad_eglDestroySyncKHR = NULL;
+PFNEGLCLIENTWAITSYNCKHRPROC glad_eglClientWaitSyncKHR = NULL;
+PFNEGLGETSYNCATTRIBKHRPROC glad_eglGetSyncAttribKHR = NULL;
+PFNEGLCREATEIMAGEKHRPROC glad_eglCreateImageKHR = NULL;
+PFNEGLDESTROYIMAGEKHRPROC glad_eglDestroyImageKHR = NULL;
+PFNEGLLOCKSURFACEKHRPROC glad_eglLockSurfaceKHR = NULL;
+PFNEGLUNLOCKSURFACEKHRPROC glad_eglUnlockSurfaceKHR = NULL;
+PFNEGLQUERYSURFACE64KHRPROC glad_eglQuerySurface64KHR = NULL;
+PFNEGLSETDAMAGEREGIONKHRPROC glad_eglSetDamageRegionKHR = NULL;
+PFNEGLSIGNALSYNCKHRPROC glad_eglSignalSyncKHR = NULL;
+PFNEGLCREATESTREAMKHRPROC glad_eglCreateStreamKHR = NULL;
+PFNEGLDESTROYSTREAMKHRPROC glad_eglDestroyStreamKHR = NULL;
+PFNEGLSTREAMATTRIBKHRPROC glad_eglStreamAttribKHR = NULL;
+PFNEGLQUERYSTREAMKHRPROC glad_eglQueryStreamKHR = NULL;
+PFNEGLQUERYSTREAMU64KHRPROC glad_eglQueryStreamu64KHR = NULL;
+PFNEGLCREATESTREAMATTRIBKHRPROC glad_eglCreateStreamAttribKHR = NULL;
+PFNEGLSETSTREAMATTRIBKHRPROC glad_eglSetStreamAttribKHR = NULL;
+PFNEGLQUERYSTREAMATTRIBKHRPROC glad_eglQueryStreamAttribKHR = NULL;
+PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC glad_eglStreamConsumerAcquireAttribKHR = NULL;
+PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC glad_eglStreamConsumerReleaseAttribKHR = NULL;
+PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC glad_eglStreamConsumerGLTextureExternalKHR = NULL;
+PFNEGLSTREAMCONSUMERACQUIREKHRPROC glad_eglStreamConsumerAcquireKHR = NULL;
+PFNEGLSTREAMCONSUMERRELEASEKHRPROC glad_eglStreamConsumerReleaseKHR = NULL;
+PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC glad_eglGetStreamFileDescriptorKHR = NULL;
+PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC glad_eglCreateStreamFromFileDescriptorKHR = NULL;
+PFNEGLQUERYSTREAMTIMEKHRPROC glad_eglQueryStreamTimeKHR = NULL;
+PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC glad_eglCreateStreamProducerSurfaceKHR = NULL;
+PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC glad_eglSwapBuffersWithDamageKHR = NULL;
+PFNEGLWAITSYNCKHRPROC glad_eglWaitSyncKHR = NULL;
+PFNEGLCREATEDRMIMAGEMESAPROC glad_eglCreateDRMImageMESA = NULL;
+PFNEGLEXPORTDRMIMAGEMESAPROC glad_eglExportDRMImageMESA = NULL;
+PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC glad_eglExportDMABUFImageQueryMESA = NULL;
+PFNEGLEXPORTDMABUFIMAGEMESAPROC glad_eglExportDMABUFImageMESA = NULL;
+PFNEGLGETDISPLAYDRIVERCONFIGPROC glad_eglGetDisplayDriverConfig = NULL;
+PFNEGLGETDISPLAYDRIVERNAMEPROC glad_eglGetDisplayDriverName = NULL;
+PFNEGLSWAPBUFFERSREGIONNOKPROC glad_eglSwapBuffersRegionNOK = NULL;
+PFNEGLSWAPBUFFERSREGION2NOKPROC glad_eglSwapBuffersRegion2NOK = NULL;
+PFNEGLQUERYNATIVEDISPLAYNVPROC glad_eglQueryNativeDisplayNV = NULL;
+PFNEGLQUERYNATIVEWINDOWNVPROC glad_eglQueryNativeWindowNV = NULL;
+PFNEGLQUERYNATIVEPIXMAPNVPROC glad_eglQueryNativePixmapNV = NULL;
+PFNEGLPOSTSUBBUFFERNVPROC glad_eglPostSubBufferNV = NULL;
+PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC glad_eglStreamConsumerGLTextureExternalAttribsNV = NULL;
+PFNEGLSTREAMFLUSHNVPROC glad_eglStreamFlushNV = NULL;
+PFNEGLQUERYDISPLAYATTRIBNVPROC glad_eglQueryDisplayAttribNV = NULL;
+PFNEGLSETSTREAMMETADATANVPROC glad_eglSetStreamMetadataNV = NULL;
+PFNEGLQUERYSTREAMMETADATANVPROC glad_eglQueryStreamMetadataNV = NULL;
+PFNEGLRESETSTREAMNVPROC glad_eglResetStreamNV = NULL;
+PFNEGLCREATESTREAMSYNCNVPROC glad_eglCreateStreamSyncNV = NULL;
+PFNEGLCREATEFENCESYNCNVPROC glad_eglCreateFenceSyncNV = NULL;
+PFNEGLDESTROYSYNCNVPROC glad_eglDestroySyncNV = NULL;
+PFNEGLFENCENVPROC glad_eglFenceNV = NULL;
+PFNEGLCLIENTWAITSYNCNVPROC glad_eglClientWaitSyncNV = NULL;
+PFNEGLSIGNALSYNCNVPROC glad_eglSignalSyncNV = NULL;
+PFNEGLGETSYNCATTRIBNVPROC glad_eglGetSyncAttribNV = NULL;
+PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC glad_eglGetSystemTimeFrequencyNV = NULL;
+PFNEGLGETSYSTEMTIMENVPROC glad_eglGetSystemTimeNV = NULL;
+PFNEGLBINDWAYLANDDISPLAYWLPROC glad_eglBindWaylandDisplayWL = NULL;
+PFNEGLUNBINDWAYLANDDISPLAYWLPROC glad_eglUnbindWaylandDisplayWL = NULL;
+PFNEGLQUERYWAYLANDBUFFERWLPROC glad_eglQueryWaylandBufferWL = NULL;
+PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC glad_eglCreateWaylandBufferFromImageWL = NULL;
+static void load_EGL_ANDROID_blob_cache(GLADloadproc load) {
+ glad_eglSetBlobCacheFuncsANDROID = (PFNEGLSETBLOBCACHEFUNCSANDROIDPROC)load("eglSetBlobCacheFuncsANDROID");
+}
+static void load_EGL_ANDROID_create_native_client_buffer(GLADloadproc load) {
+ glad_eglCreateNativeClientBufferANDROID = (PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC)load("eglCreateNativeClientBufferANDROID");
+}
+static void load_EGL_ANDROID_get_frame_timestamps(GLADloadproc load) {
+ glad_eglGetCompositorTimingSupportedANDROID = (PFNEGLGETCOMPOSITORTIMINGSUPPORTEDANDROIDPROC)load("eglGetCompositorTimingSupportedANDROID");
+ glad_eglGetCompositorTimingANDROID = (PFNEGLGETCOMPOSITORTIMINGANDROIDPROC)load("eglGetCompositorTimingANDROID");
+ glad_eglGetNextFrameIdANDROID = (PFNEGLGETNEXTFRAMEIDANDROIDPROC)load("eglGetNextFrameIdANDROID");
+ glad_eglGetFrameTimestampSupportedANDROID = (PFNEGLGETFRAMETIMESTAMPSUPPORTEDANDROIDPROC)load("eglGetFrameTimestampSupportedANDROID");
+ glad_eglGetFrameTimestampsANDROID = (PFNEGLGETFRAMETIMESTAMPSANDROIDPROC)load("eglGetFrameTimestampsANDROID");
+}
+static void load_EGL_ANDROID_get_native_client_buffer(GLADloadproc load) {
+ glad_eglGetNativeClientBufferANDROID = (PFNEGLGETNATIVECLIENTBUFFERANDROIDPROC)load("eglGetNativeClientBufferANDROID");
+}
+static void load_EGL_ANDROID_native_fence_sync(GLADloadproc load) {
+ glad_eglDupNativeFenceFDANDROID = (PFNEGLDUPNATIVEFENCEFDANDROIDPROC)load("eglDupNativeFenceFDANDROID");
+}
+static void load_EGL_ANDROID_presentation_time(GLADloadproc load) {
+ glad_eglPresentationTimeANDROID = (PFNEGLPRESENTATIONTIMEANDROIDPROC)load("eglPresentationTimeANDROID");
+}
+static void load_EGL_ANGLE_query_surface_pointer(GLADloadproc load) {
+ glad_eglQuerySurfacePointerANGLE = (PFNEGLQUERYSURFACEPOINTERANGLEPROC)load("eglQuerySurfacePointerANGLE");
+}
+static void load_EGL_EXT_client_sync(GLADloadproc load) {
+ glad_eglClientSignalSyncEXT = (PFNEGLCLIENTSIGNALSYNCEXTPROC)load("eglClientSignalSyncEXT");
+}
+static void load_EGL_EXT_compositor(GLADloadproc load) {
+ glad_eglCompositorSetContextListEXT = (PFNEGLCOMPOSITORSETCONTEXTLISTEXTPROC)load("eglCompositorSetContextListEXT");
+ glad_eglCompositorSetContextAttributesEXT = (PFNEGLCOMPOSITORSETCONTEXTATTRIBUTESEXTPROC)load("eglCompositorSetContextAttributesEXT");
+ glad_eglCompositorSetWindowListEXT = (PFNEGLCOMPOSITORSETWINDOWLISTEXTPROC)load("eglCompositorSetWindowListEXT");
+ glad_eglCompositorSetWindowAttributesEXT = (PFNEGLCOMPOSITORSETWINDOWATTRIBUTESEXTPROC)load("eglCompositorSetWindowAttributesEXT");
+ glad_eglCompositorBindTexWindowEXT = (PFNEGLCOMPOSITORBINDTEXWINDOWEXTPROC)load("eglCompositorBindTexWindowEXT");
+ glad_eglCompositorSetSizeEXT = (PFNEGLCOMPOSITORSETSIZEEXTPROC)load("eglCompositorSetSizeEXT");
+ glad_eglCompositorSwapPolicyEXT = (PFNEGLCOMPOSITORSWAPPOLICYEXTPROC)load("eglCompositorSwapPolicyEXT");
+}
+static void load_EGL_EXT_device_base(GLADloadproc load) {
+ glad_eglQueryDeviceAttribEXT = (PFNEGLQUERYDEVICEATTRIBEXTPROC)load("eglQueryDeviceAttribEXT");
+ glad_eglQueryDeviceStringEXT = (PFNEGLQUERYDEVICESTRINGEXTPROC)load("eglQueryDeviceStringEXT");
+ glad_eglQueryDevicesEXT = (PFNEGLQUERYDEVICESEXTPROC)load("eglQueryDevicesEXT");
+ glad_eglQueryDisplayAttribEXT = (PFNEGLQUERYDISPLAYATTRIBEXTPROC)load("eglQueryDisplayAttribEXT");
+}
+static void load_EGL_EXT_device_enumeration(GLADloadproc load) {
+ glad_eglQueryDevicesEXT = (PFNEGLQUERYDEVICESEXTPROC)load("eglQueryDevicesEXT");
+}
+static void load_EGL_EXT_device_query(GLADloadproc load) {
+ glad_eglQueryDeviceAttribEXT = (PFNEGLQUERYDEVICEATTRIBEXTPROC)load("eglQueryDeviceAttribEXT");
+ glad_eglQueryDeviceStringEXT = (PFNEGLQUERYDEVICESTRINGEXTPROC)load("eglQueryDeviceStringEXT");
+ glad_eglQueryDisplayAttribEXT = (PFNEGLQUERYDISPLAYATTRIBEXTPROC)load("eglQueryDisplayAttribEXT");
+}
+static void load_EGL_EXT_image_dma_buf_import_modifiers(GLADloadproc load) {
+ glad_eglQueryDmaBufFormatsEXT = (PFNEGLQUERYDMABUFFORMATSEXTPROC)load("eglQueryDmaBufFormatsEXT");
+ glad_eglQueryDmaBufModifiersEXT = (PFNEGLQUERYDMABUFMODIFIERSEXTPROC)load("eglQueryDmaBufModifiersEXT");
+}
+static void load_EGL_EXT_output_base(GLADloadproc load) {
+ glad_eglGetOutputLayersEXT = (PFNEGLGETOUTPUTLAYERSEXTPROC)load("eglGetOutputLayersEXT");
+ glad_eglGetOutputPortsEXT = (PFNEGLGETOUTPUTPORTSEXTPROC)load("eglGetOutputPortsEXT");
+ glad_eglOutputLayerAttribEXT = (PFNEGLOUTPUTLAYERATTRIBEXTPROC)load("eglOutputLayerAttribEXT");
+ glad_eglQueryOutputLayerAttribEXT = (PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC)load("eglQueryOutputLayerAttribEXT");
+ glad_eglQueryOutputLayerStringEXT = (PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC)load("eglQueryOutputLayerStringEXT");
+ glad_eglOutputPortAttribEXT = (PFNEGLOUTPUTPORTATTRIBEXTPROC)load("eglOutputPortAttribEXT");
+ glad_eglQueryOutputPortAttribEXT = (PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC)load("eglQueryOutputPortAttribEXT");
+ glad_eglQueryOutputPortStringEXT = (PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC)load("eglQueryOutputPortStringEXT");
+}
+static void load_EGL_EXT_platform_base(GLADloadproc load) {
+ glad_eglGetPlatformDisplayEXT = (PFNEGLGETPLATFORMDISPLAYEXTPROC)load("eglGetPlatformDisplayEXT");
+ glad_eglCreatePlatformWindowSurfaceEXT = (PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)load("eglCreatePlatformWindowSurfaceEXT");
+ glad_eglCreatePlatformPixmapSurfaceEXT = (PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC)load("eglCreatePlatformPixmapSurfaceEXT");
+}
+static void load_EGL_EXT_stream_consumer_egloutput(GLADloadproc load) {
+ glad_eglStreamConsumerOutputEXT = (PFNEGLSTREAMCONSUMEROUTPUTEXTPROC)load("eglStreamConsumerOutputEXT");
+}
+static void load_EGL_EXT_swap_buffers_with_damage(GLADloadproc load) {
+ glad_eglSwapBuffersWithDamageEXT = (PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC)load("eglSwapBuffersWithDamageEXT");
+}
+static void load_EGL_EXT_sync_reuse(GLADloadproc load) {
+ glad_eglUnsignalSyncEXT = (PFNEGLUNSIGNALSYNCEXTPROC)load("eglUnsignalSyncEXT");
+}
+static void load_EGL_HI_clientpixmap(GLADloadproc load) {
+ glad_eglCreatePixmapSurfaceHI = (PFNEGLCREATEPIXMAPSURFACEHIPROC)load("eglCreatePixmapSurfaceHI");
+}
+static void load_EGL_KHR_cl_event2(GLADloadproc load) {
+ glad_eglCreateSync64KHR = (PFNEGLCREATESYNC64KHRPROC)load("eglCreateSync64KHR");
+}
+static void load_EGL_KHR_debug(GLADloadproc load) {
+ glad_eglDebugMessageControlKHR = (PFNEGLDEBUGMESSAGECONTROLKHRPROC)load("eglDebugMessageControlKHR");
+ glad_eglQueryDebugKHR = (PFNEGLQUERYDEBUGKHRPROC)load("eglQueryDebugKHR");
+ glad_eglLabelObjectKHR = (PFNEGLLABELOBJECTKHRPROC)load("eglLabelObjectKHR");
+}
+static void load_EGL_KHR_display_reference(GLADloadproc load) {
+ glad_eglQueryDisplayAttribKHR = (PFNEGLQUERYDISPLAYATTRIBKHRPROC)load("eglQueryDisplayAttribKHR");
+}
+static void load_EGL_KHR_fence_sync(GLADloadproc load) {
+ glad_eglCreateSyncKHR = (PFNEGLCREATESYNCKHRPROC)load("eglCreateSyncKHR");
+ glad_eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC)load("eglDestroySyncKHR");
+ glad_eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC)load("eglClientWaitSyncKHR");
+ glad_eglGetSyncAttribKHR = (PFNEGLGETSYNCATTRIBKHRPROC)load("eglGetSyncAttribKHR");
+}
+static void load_EGL_KHR_image(GLADloadproc load) {
+ glad_eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC)load("eglCreateImageKHR");
+ glad_eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC)load("eglDestroyImageKHR");
+}
+static void load_EGL_KHR_image_base(GLADloadproc load) {
+ glad_eglCreateImageKHR = (PFNEGLCREATEIMAGEKHRPROC)load("eglCreateImageKHR");
+ glad_eglDestroyImageKHR = (PFNEGLDESTROYIMAGEKHRPROC)load("eglDestroyImageKHR");
+}
+static void load_EGL_KHR_lock_surface(GLADloadproc load) {
+ glad_eglLockSurfaceKHR = (PFNEGLLOCKSURFACEKHRPROC)load("eglLockSurfaceKHR");
+ glad_eglUnlockSurfaceKHR = (PFNEGLUNLOCKSURFACEKHRPROC)load("eglUnlockSurfaceKHR");
+}
+static void load_EGL_KHR_lock_surface3(GLADloadproc load) {
+ glad_eglLockSurfaceKHR = (PFNEGLLOCKSURFACEKHRPROC)load("eglLockSurfaceKHR");
+ glad_eglUnlockSurfaceKHR = (PFNEGLUNLOCKSURFACEKHRPROC)load("eglUnlockSurfaceKHR");
+ glad_eglQuerySurface64KHR = (PFNEGLQUERYSURFACE64KHRPROC)load("eglQuerySurface64KHR");
+}
+static void load_EGL_KHR_partial_update(GLADloadproc load) {
+ glad_eglSetDamageRegionKHR = (PFNEGLSETDAMAGEREGIONKHRPROC)load("eglSetDamageRegionKHR");
+}
+static void load_EGL_KHR_reusable_sync(GLADloadproc load) {
+ glad_eglCreateSyncKHR = (PFNEGLCREATESYNCKHRPROC)load("eglCreateSyncKHR");
+ glad_eglDestroySyncKHR = (PFNEGLDESTROYSYNCKHRPROC)load("eglDestroySyncKHR");
+ glad_eglClientWaitSyncKHR = (PFNEGLCLIENTWAITSYNCKHRPROC)load("eglClientWaitSyncKHR");
+ glad_eglSignalSyncKHR = (PFNEGLSIGNALSYNCKHRPROC)load("eglSignalSyncKHR");
+ glad_eglGetSyncAttribKHR = (PFNEGLGETSYNCATTRIBKHRPROC)load("eglGetSyncAttribKHR");
+}
+static void load_EGL_KHR_stream(GLADloadproc load) {
+ glad_eglCreateStreamKHR = (PFNEGLCREATESTREAMKHRPROC)load("eglCreateStreamKHR");
+ glad_eglDestroyStreamKHR = (PFNEGLDESTROYSTREAMKHRPROC)load("eglDestroyStreamKHR");
+ glad_eglStreamAttribKHR = (PFNEGLSTREAMATTRIBKHRPROC)load("eglStreamAttribKHR");
+ glad_eglQueryStreamKHR = (PFNEGLQUERYSTREAMKHRPROC)load("eglQueryStreamKHR");
+ glad_eglQueryStreamu64KHR = (PFNEGLQUERYSTREAMU64KHRPROC)load("eglQueryStreamu64KHR");
+}
+static void load_EGL_KHR_stream_attrib(GLADloadproc load) {
+ glad_eglCreateStreamAttribKHR = (PFNEGLCREATESTREAMATTRIBKHRPROC)load("eglCreateStreamAttribKHR");
+ glad_eglSetStreamAttribKHR = (PFNEGLSETSTREAMATTRIBKHRPROC)load("eglSetStreamAttribKHR");
+ glad_eglQueryStreamAttribKHR = (PFNEGLQUERYSTREAMATTRIBKHRPROC)load("eglQueryStreamAttribKHR");
+ glad_eglStreamConsumerAcquireAttribKHR = (PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC)load("eglStreamConsumerAcquireAttribKHR");
+ glad_eglStreamConsumerReleaseAttribKHR = (PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC)load("eglStreamConsumerReleaseAttribKHR");
+}
+static void load_EGL_KHR_stream_consumer_gltexture(GLADloadproc load) {
+ glad_eglStreamConsumerGLTextureExternalKHR = (PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC)load("eglStreamConsumerGLTextureExternalKHR");
+ glad_eglStreamConsumerAcquireKHR = (PFNEGLSTREAMCONSUMERACQUIREKHRPROC)load("eglStreamConsumerAcquireKHR");
+ glad_eglStreamConsumerReleaseKHR = (PFNEGLSTREAMCONSUMERRELEASEKHRPROC)load("eglStreamConsumerReleaseKHR");
+}
+static void load_EGL_KHR_stream_cross_process_fd(GLADloadproc load) {
+ glad_eglGetStreamFileDescriptorKHR = (PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC)load("eglGetStreamFileDescriptorKHR");
+ glad_eglCreateStreamFromFileDescriptorKHR = (PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC)load("eglCreateStreamFromFileDescriptorKHR");
+}
+static void load_EGL_KHR_stream_fifo(GLADloadproc load) {
+ glad_eglQueryStreamTimeKHR = (PFNEGLQUERYSTREAMTIMEKHRPROC)load("eglQueryStreamTimeKHR");
+}
+static void load_EGL_KHR_stream_producer_eglsurface(GLADloadproc load) {
+ glad_eglCreateStreamProducerSurfaceKHR = (PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC)load("eglCreateStreamProducerSurfaceKHR");
+}
+static void load_EGL_KHR_swap_buffers_with_damage(GLADloadproc load) {
+ glad_eglSwapBuffersWithDamageKHR = (PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC)load("eglSwapBuffersWithDamageKHR");
+}
+static void load_EGL_KHR_wait_sync(GLADloadproc load) {
+ glad_eglWaitSyncKHR = (PFNEGLWAITSYNCKHRPROC)load("eglWaitSyncKHR");
+}
+static void load_EGL_MESA_drm_image(GLADloadproc load) {
+ glad_eglCreateDRMImageMESA = (PFNEGLCREATEDRMIMAGEMESAPROC)load("eglCreateDRMImageMESA");
+ glad_eglExportDRMImageMESA = (PFNEGLEXPORTDRMIMAGEMESAPROC)load("eglExportDRMImageMESA");
+}
+static void load_EGL_MESA_image_dma_buf_export(GLADloadproc load) {
+ glad_eglExportDMABUFImageQueryMESA = (PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC)load("eglExportDMABUFImageQueryMESA");
+ glad_eglExportDMABUFImageMESA = (PFNEGLEXPORTDMABUFIMAGEMESAPROC)load("eglExportDMABUFImageMESA");
+}
+static void load_EGL_MESA_query_driver(GLADloadproc load) {
+ glad_eglGetDisplayDriverConfig = (PFNEGLGETDISPLAYDRIVERCONFIGPROC)load("eglGetDisplayDriverConfig");
+ glad_eglGetDisplayDriverName = (PFNEGLGETDISPLAYDRIVERNAMEPROC)load("eglGetDisplayDriverName");
+}
+static void load_EGL_NOK_swap_region(GLADloadproc load) {
+ glad_eglSwapBuffersRegionNOK = (PFNEGLSWAPBUFFERSREGIONNOKPROC)load("eglSwapBuffersRegionNOK");
+}
+static void load_EGL_NOK_swap_region2(GLADloadproc load) {
+ glad_eglSwapBuffersRegion2NOK = (PFNEGLSWAPBUFFERSREGION2NOKPROC)load("eglSwapBuffersRegion2NOK");
+}
+static void load_EGL_NV_native_query(GLADloadproc load) {
+ glad_eglQueryNativeDisplayNV = (PFNEGLQUERYNATIVEDISPLAYNVPROC)load("eglQueryNativeDisplayNV");
+ glad_eglQueryNativeWindowNV = (PFNEGLQUERYNATIVEWINDOWNVPROC)load("eglQueryNativeWindowNV");
+ glad_eglQueryNativePixmapNV = (PFNEGLQUERYNATIVEPIXMAPNVPROC)load("eglQueryNativePixmapNV");
+}
+static void load_EGL_NV_post_sub_buffer(GLADloadproc load) {
+ glad_eglPostSubBufferNV = (PFNEGLPOSTSUBBUFFERNVPROC)load("eglPostSubBufferNV");
+}
+static void load_EGL_NV_stream_consumer_gltexture_yuv(GLADloadproc load) {
+ glad_eglStreamConsumerGLTextureExternalAttribsNV = (PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC)load("eglStreamConsumerGLTextureExternalAttribsNV");
+}
+static void load_EGL_NV_stream_flush(GLADloadproc load) {
+ glad_eglStreamFlushNV = (PFNEGLSTREAMFLUSHNVPROC)load("eglStreamFlushNV");
+}
+static void load_EGL_NV_stream_metadata(GLADloadproc load) {
+ glad_eglQueryDisplayAttribNV = (PFNEGLQUERYDISPLAYATTRIBNVPROC)load("eglQueryDisplayAttribNV");
+ glad_eglSetStreamMetadataNV = (PFNEGLSETSTREAMMETADATANVPROC)load("eglSetStreamMetadataNV");
+ glad_eglQueryStreamMetadataNV = (PFNEGLQUERYSTREAMMETADATANVPROC)load("eglQueryStreamMetadataNV");
+}
+static void load_EGL_NV_stream_reset(GLADloadproc load) {
+ glad_eglResetStreamNV = (PFNEGLRESETSTREAMNVPROC)load("eglResetStreamNV");
+}
+static void load_EGL_NV_stream_sync(GLADloadproc load) {
+ glad_eglCreateStreamSyncNV = (PFNEGLCREATESTREAMSYNCNVPROC)load("eglCreateStreamSyncNV");
+}
+static void load_EGL_NV_sync(GLADloadproc load) {
+ glad_eglCreateFenceSyncNV = (PFNEGLCREATEFENCESYNCNVPROC)load("eglCreateFenceSyncNV");
+ glad_eglDestroySyncNV = (PFNEGLDESTROYSYNCNVPROC)load("eglDestroySyncNV");
+ glad_eglFenceNV = (PFNEGLFENCENVPROC)load("eglFenceNV");
+ glad_eglClientWaitSyncNV = (PFNEGLCLIENTWAITSYNCNVPROC)load("eglClientWaitSyncNV");
+ glad_eglSignalSyncNV = (PFNEGLSIGNALSYNCNVPROC)load("eglSignalSyncNV");
+ glad_eglGetSyncAttribNV = (PFNEGLGETSYNCATTRIBNVPROC)load("eglGetSyncAttribNV");
+}
+static void load_EGL_NV_system_time(GLADloadproc load) {
+ glad_eglGetSystemTimeFrequencyNV = (PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC)load("eglGetSystemTimeFrequencyNV");
+ glad_eglGetSystemTimeNV = (PFNEGLGETSYSTEMTIMENVPROC)load("eglGetSystemTimeNV");
+}
+static void load_EGL_WL_bind_wayland_display(GLADloadproc load) {
+ glad_eglBindWaylandDisplayWL = (PFNEGLBINDWAYLANDDISPLAYWLPROC)load("eglBindWaylandDisplayWL");
+ glad_eglUnbindWaylandDisplayWL = (PFNEGLUNBINDWAYLANDDISPLAYWLPROC)load("eglUnbindWaylandDisplayWL");
+ glad_eglQueryWaylandBufferWL = (PFNEGLQUERYWAYLANDBUFFERWLPROC)load("eglQueryWaylandBufferWL");
+}
+static void load_EGL_WL_create_wayland_buffer_from_image(GLADloadproc load) {
+ glad_eglCreateWaylandBufferFromImageWL = (PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC)load("eglCreateWaylandBufferFromImageWL");
+}
+static int find_extensionsEGL(void) {
+ return 1;
+}
+
+static void find_coreEGL(void) {
+}
+
+int gladLoadEGLLoader(GLADloadproc load) {
+ (void) load;
+ find_coreEGL();
+
+ if (!find_extensionsEGL()) return 0;
+ load_EGL_ANDROID_blob_cache(load);
+ load_EGL_ANDROID_create_native_client_buffer(load);
+ load_EGL_ANDROID_get_frame_timestamps(load);
+ load_EGL_ANDROID_get_native_client_buffer(load);
+ load_EGL_ANDROID_native_fence_sync(load);
+ load_EGL_ANDROID_presentation_time(load);
+ load_EGL_ANGLE_query_surface_pointer(load);
+ load_EGL_EXT_client_sync(load);
+ load_EGL_EXT_compositor(load);
+ load_EGL_EXT_device_base(load);
+ load_EGL_EXT_device_enumeration(load);
+ load_EGL_EXT_device_query(load);
+ load_EGL_EXT_image_dma_buf_import_modifiers(load);
+ load_EGL_EXT_output_base(load);
+ load_EGL_EXT_platform_base(load);
+ load_EGL_EXT_stream_consumer_egloutput(load);
+ load_EGL_EXT_swap_buffers_with_damage(load);
+ load_EGL_EXT_sync_reuse(load);
+ load_EGL_HI_clientpixmap(load);
+ load_EGL_KHR_cl_event2(load);
+ load_EGL_KHR_debug(load);
+ load_EGL_KHR_display_reference(load);
+ load_EGL_KHR_fence_sync(load);
+ load_EGL_KHR_image(load);
+ load_EGL_KHR_image_base(load);
+ load_EGL_KHR_lock_surface(load);
+ load_EGL_KHR_lock_surface3(load);
+ load_EGL_KHR_partial_update(load);
+ load_EGL_KHR_reusable_sync(load);
+ load_EGL_KHR_stream(load);
+ load_EGL_KHR_stream_attrib(load);
+ load_EGL_KHR_stream_consumer_gltexture(load);
+ load_EGL_KHR_stream_cross_process_fd(load);
+ load_EGL_KHR_stream_fifo(load);
+ load_EGL_KHR_stream_producer_eglsurface(load);
+ load_EGL_KHR_swap_buffers_with_damage(load);
+ load_EGL_KHR_wait_sync(load);
+ load_EGL_MESA_drm_image(load);
+ load_EGL_MESA_image_dma_buf_export(load);
+ load_EGL_MESA_query_driver(load);
+ load_EGL_NOK_swap_region(load);
+ load_EGL_NOK_swap_region2(load);
+ load_EGL_NV_native_query(load);
+ load_EGL_NV_post_sub_buffer(load);
+ load_EGL_NV_stream_consumer_gltexture_yuv(load);
+ load_EGL_NV_stream_flush(load);
+ load_EGL_NV_stream_metadata(load);
+ load_EGL_NV_stream_reset(load);
+ load_EGL_NV_stream_sync(load);
+ load_EGL_NV_sync(load);
+ load_EGL_NV_system_time(load);
+ load_EGL_WL_bind_wayland_display(load);
+ load_EGL_WL_create_wayland_buffer_from_image(load);
+ return 1;
+}
+
diff --git a/dep/glad/src/glad_glx.c b/dep/glad/src/glad_glx.c
new file mode 100644
index 000000000..f7f628c1e
--- /dev/null
+++ b/dep/glad/src/glad_glx.c
@@ -0,0 +1,874 @@
+/*
+
+ GLX loader generated by glad 0.1.33 on Sun May 3 16:48:35 2020.
+
+ Language/Generator: C/C++
+ Specification: glx
+ APIs: glx=1.4
+ Profile: -
+ Extensions:
+ GLX_3DFX_multisample,
+ GLX_AMD_gpu_association,
+ GLX_ARB_context_flush_control,
+ GLX_ARB_create_context,
+ GLX_ARB_create_context_no_error,
+ GLX_ARB_create_context_profile,
+ GLX_ARB_create_context_robustness,
+ GLX_ARB_fbconfig_float,
+ GLX_ARB_framebuffer_sRGB,
+ GLX_ARB_get_proc_address,
+ GLX_ARB_multisample,
+ GLX_ARB_robustness_application_isolation,
+ GLX_ARB_robustness_share_group_isolation,
+ GLX_ARB_vertex_buffer_object,
+ GLX_EXT_buffer_age,
+ GLX_EXT_context_priority,
+ 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_libglvnd,
+ GLX_EXT_no_config_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_INTEL_swap_event,
+ GLX_MESA_agp_offset,
+ GLX_MESA_copy_sub_buffer,
+ GLX_MESA_pixmap_colormap,
+ GLX_MESA_query_renderer,
+ GLX_MESA_release_buffers,
+ GLX_MESA_set_3dfx_mode,
+ GLX_MESA_swap_control,
+ GLX_NV_copy_buffer,
+ GLX_NV_copy_image,
+ GLX_NV_delay_before_swap,
+ GLX_NV_float_buffer,
+ GLX_NV_multigpu_context,
+ 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_OML_swap_method,
+ GLX_OML_sync_control,
+ GLX_SGIS_blended_overlay,
+ GLX_SGIS_multisample,
+ GLX_SGIS_shared_multisample,
+ GLX_SGIX_dmbuffer,
+ GLX_SGIX_fbconfig,
+ GLX_SGIX_hyperpipe,
+ GLX_SGIX_pbuffer,
+ GLX_SGIX_swap_barrier,
+ GLX_SGIX_swap_group,
+ GLX_SGIX_video_resize,
+ GLX_SGIX_video_source,
+ GLX_SGIX_visual_select_group,
+ GLX_SGI_cushion,
+ GLX_SGI_make_current_read,
+ GLX_SGI_swap_control,
+ GLX_SGI_video_sync,
+ GLX_SUN_get_transparent_index
+ Loader: True
+ Local files: False
+ Omit khrplatform: False
+ Reproducible: False
+
+ Commandline:
+ --api="glx=1.4" --generator="c" --spec="glx" --extensions="GLX_3DFX_multisample,GLX_AMD_gpu_association,GLX_ARB_context_flush_control,GLX_ARB_create_context,GLX_ARB_create_context_no_error,GLX_ARB_create_context_profile,GLX_ARB_create_context_robustness,GLX_ARB_fbconfig_float,GLX_ARB_framebuffer_sRGB,GLX_ARB_get_proc_address,GLX_ARB_multisample,GLX_ARB_robustness_application_isolation,GLX_ARB_robustness_share_group_isolation,GLX_ARB_vertex_buffer_object,GLX_EXT_buffer_age,GLX_EXT_context_priority,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_libglvnd,GLX_EXT_no_config_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_INTEL_swap_event,GLX_MESA_agp_offset,GLX_MESA_copy_sub_buffer,GLX_MESA_pixmap_colormap,GLX_MESA_query_renderer,GLX_MESA_release_buffers,GLX_MESA_set_3dfx_mode,GLX_MESA_swap_control,GLX_NV_copy_buffer,GLX_NV_copy_image,GLX_NV_delay_before_swap,GLX_NV_float_buffer,GLX_NV_multigpu_context,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_OML_swap_method,GLX_OML_sync_control,GLX_SGIS_blended_overlay,GLX_SGIS_multisample,GLX_SGIS_shared_multisample,GLX_SGIX_dmbuffer,GLX_SGIX_fbconfig,GLX_SGIX_hyperpipe,GLX_SGIX_pbuffer,GLX_SGIX_swap_barrier,GLX_SGIX_swap_group,GLX_SGIX_video_resize,GLX_SGIX_video_source,GLX_SGIX_visual_select_group,GLX_SGI_cushion,GLX_SGI_make_current_read,GLX_SGI_swap_control,GLX_SGI_video_sync,GLX_SUN_get_transparent_index"
+ Online:
+ Too many extensions
+*/
+
+#include
+#include
+#include
+#include "glad_glx.h"
+
+static void* get_proc(const char *namez);
+
+#if defined(_WIN32) || defined(__CYGWIN__)
+#ifndef _WINDOWS_
+#undef APIENTRY
+#endif
+#include
+static HMODULE libGL;
+
+typedef void* (APIENTRYP PFNWGLGETPROCADDRESSPROC_PRIVATE)(const char*);
+static PFNWGLGETPROCADDRESSPROC_PRIVATE gladGetProcAddressPtr;
+
+#ifdef _MSC_VER
+#ifdef __has_include
+ #if __has_include()
+ #define HAVE_WINAPIFAMILY 1
+ #endif
+#elif _MSC_VER >= 1700 && !_USING_V110_SDK71_
+ #define HAVE_WINAPIFAMILY 1
+#endif
+#endif
+
+#ifdef HAVE_WINAPIFAMILY
+ #include
+ #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+ #define IS_UWP 1
+ #endif
+#endif
+
+static
+int open_gl(void) {
+#ifndef IS_UWP
+ libGL = LoadLibraryW(L"opengl32.dll");
+ if(libGL != NULL) {
+ void (* tmp)(void);
+ tmp = (void(*)(void)) GetProcAddress(libGL, "wglGetProcAddress");
+ gladGetProcAddressPtr = (PFNWGLGETPROCADDRESSPROC_PRIVATE) tmp;
+ return gladGetProcAddressPtr != NULL;
+ }
+#endif
+
+ return 0;
+}
+
+static
+void close_gl(void) {
+ if(libGL != NULL) {
+ FreeLibrary((HMODULE) libGL);
+ libGL = NULL;
+ }
+}
+#else
+#include
+static void* libGL;
+
+#if !defined(__APPLE__) && !defined(__HAIKU__)
+typedef void* (APIENTRYP PFNGLXGETPROCADDRESSPROC_PRIVATE)(const char*);
+static PFNGLXGETPROCADDRESSPROC_PRIVATE gladGetProcAddressPtr;
+#endif
+
+static
+int open_gl(void) {
+#ifdef __APPLE__
+ static const char *NAMES[] = {
+ "../Frameworks/OpenGL.framework/OpenGL",
+ "/Library/Frameworks/OpenGL.framework/OpenGL",
+ "/System/Library/Frameworks/OpenGL.framework/OpenGL",
+ "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL"
+ };
+#else
+ static const char *NAMES[] = {"libGL.so.1", "libGL.so"};
+#endif
+
+ unsigned int index = 0;
+ for(index = 0; index < (sizeof(NAMES) / sizeof(NAMES[0])); index++) {
+ libGL = dlopen(NAMES[index], RTLD_NOW | RTLD_GLOBAL);
+
+ if(libGL != NULL) {
+#if defined(__APPLE__) || defined(__HAIKU__)
+ return 1;
+#else
+ gladGetProcAddressPtr = (PFNGLXGETPROCADDRESSPROC_PRIVATE)dlsym(libGL,
+ "glXGetProcAddressARB");
+ return gladGetProcAddressPtr != NULL;
+#endif
+ }
+ }
+
+ return 0;
+}
+
+static
+void close_gl(void) {
+ if(libGL != NULL) {
+ dlclose(libGL);
+ libGL = NULL;
+ }
+}
+#endif
+
+static
+void* get_proc(const char *namez) {
+ void* result = NULL;
+ if(libGL == NULL) return NULL;
+
+#if !defined(__APPLE__) && !defined(__HAIKU__)
+ if(gladGetProcAddressPtr != NULL) {
+ result = gladGetProcAddressPtr(namez);
+ }
+#endif
+ if(result == NULL) {
+#if defined(_WIN32) || defined(__CYGWIN__)
+ result = (void*)GetProcAddress((HMODULE) libGL, namez);
+#else
+ result = dlsym(libGL, namez);
+#endif
+ }
+
+ return result;
+}
+
+int gladLoadGLX(Display *dpy, int screen) {
+ int status = 0;
+
+ if(open_gl()) {
+ status = gladLoadGLXLoader((GLADloadproc)get_proc, dpy, screen);
+ close_gl();
+ }
+
+ return status;
+}
+
+static Display *GLADGLXDisplay = 0;
+static int GLADGLXscreen = 0;
+
+static int get_exts(void) {
+ return 1;
+}
+
+static void free_exts(void) {
+ return;
+}
+
+static int has_ext(const char *ext) {
+ const char *terminator;
+ const char *loc;
+ const char *extensions;
+
+ if(!GLAD_GLX_VERSION_1_1)
+ return 0;
+
+ extensions = glXQueryExtensionsString(GLADGLXDisplay, GLADGLXscreen);
+
+ if(extensions == NULL || ext == NULL)
+ return 0;
+
+ while(1) {
+ loc = strstr(extensions, ext);
+ if(loc == NULL)
+ break;
+
+ terminator = loc + strlen(ext);
+ if((loc == extensions || *(loc - 1) == ' ') &&
+ (*terminator == ' ' || *terminator == '\0'))
+ {
+ return 1;
+ }
+ extensions = terminator;
+ }
+
+ return 0;
+}
+
+int GLAD_GLX_VERSION_1_0 = 0;
+int GLAD_GLX_VERSION_1_1 = 0;
+int GLAD_GLX_VERSION_1_2 = 0;
+int GLAD_GLX_VERSION_1_3 = 0;
+int GLAD_GLX_VERSION_1_4 = 0;
+PFNGLXCHOOSEFBCONFIGPROC glad_glXChooseFBConfig = NULL;
+PFNGLXCHOOSEVISUALPROC glad_glXChooseVisual = NULL;
+PFNGLXCOPYCONTEXTPROC glad_glXCopyContext = NULL;
+PFNGLXCREATECONTEXTPROC glad_glXCreateContext = NULL;
+PFNGLXCREATEGLXPIXMAPPROC glad_glXCreateGLXPixmap = NULL;
+PFNGLXCREATENEWCONTEXTPROC glad_glXCreateNewContext = NULL;
+PFNGLXCREATEPBUFFERPROC glad_glXCreatePbuffer = NULL;
+PFNGLXCREATEPIXMAPPROC glad_glXCreatePixmap = NULL;
+PFNGLXCREATEWINDOWPROC glad_glXCreateWindow = NULL;
+PFNGLXDESTROYCONTEXTPROC glad_glXDestroyContext = NULL;
+PFNGLXDESTROYGLXPIXMAPPROC glad_glXDestroyGLXPixmap = NULL;
+PFNGLXDESTROYPBUFFERPROC glad_glXDestroyPbuffer = NULL;
+PFNGLXDESTROYPIXMAPPROC glad_glXDestroyPixmap = NULL;
+PFNGLXDESTROYWINDOWPROC glad_glXDestroyWindow = NULL;
+PFNGLXGETCLIENTSTRINGPROC glad_glXGetClientString = NULL;
+PFNGLXGETCONFIGPROC glad_glXGetConfig = NULL;
+PFNGLXGETCURRENTCONTEXTPROC glad_glXGetCurrentContext = NULL;
+PFNGLXGETCURRENTDISPLAYPROC glad_glXGetCurrentDisplay = NULL;
+PFNGLXGETCURRENTDRAWABLEPROC glad_glXGetCurrentDrawable = NULL;
+PFNGLXGETCURRENTREADDRAWABLEPROC glad_glXGetCurrentReadDrawable = NULL;
+PFNGLXGETFBCONFIGATTRIBPROC glad_glXGetFBConfigAttrib = NULL;
+PFNGLXGETFBCONFIGSPROC glad_glXGetFBConfigs = NULL;
+PFNGLXGETPROCADDRESSPROC glad_glXGetProcAddress = NULL;
+PFNGLXGETSELECTEDEVENTPROC glad_glXGetSelectedEvent = NULL;
+PFNGLXGETVISUALFROMFBCONFIGPROC glad_glXGetVisualFromFBConfig = NULL;
+PFNGLXISDIRECTPROC glad_glXIsDirect = NULL;
+PFNGLXMAKECONTEXTCURRENTPROC glad_glXMakeContextCurrent = NULL;
+PFNGLXMAKECURRENTPROC glad_glXMakeCurrent = NULL;
+PFNGLXQUERYCONTEXTPROC glad_glXQueryContext = NULL;
+PFNGLXQUERYDRAWABLEPROC glad_glXQueryDrawable = NULL;
+PFNGLXQUERYEXTENSIONPROC glad_glXQueryExtension = NULL;
+PFNGLXQUERYEXTENSIONSSTRINGPROC glad_glXQueryExtensionsString = NULL;
+PFNGLXQUERYSERVERSTRINGPROC glad_glXQueryServerString = NULL;
+PFNGLXQUERYVERSIONPROC glad_glXQueryVersion = NULL;
+PFNGLXSELECTEVENTPROC glad_glXSelectEvent = NULL;
+PFNGLXSWAPBUFFERSPROC glad_glXSwapBuffers = NULL;
+PFNGLXUSEXFONTPROC glad_glXUseXFont = NULL;
+PFNGLXWAITGLPROC glad_glXWaitGL = NULL;
+PFNGLXWAITXPROC glad_glXWaitX = NULL;
+int GLAD_GLX_3DFX_multisample = 0;
+int GLAD_GLX_AMD_gpu_association = 0;
+int GLAD_GLX_ARB_context_flush_control = 0;
+int GLAD_GLX_ARB_create_context = 0;
+int GLAD_GLX_ARB_create_context_no_error = 0;
+int GLAD_GLX_ARB_create_context_profile = 0;
+int GLAD_GLX_ARB_create_context_robustness = 0;
+int GLAD_GLX_ARB_fbconfig_float = 0;
+int GLAD_GLX_ARB_framebuffer_sRGB = 0;
+int GLAD_GLX_ARB_get_proc_address = 0;
+int GLAD_GLX_ARB_multisample = 0;
+int GLAD_GLX_ARB_robustness_application_isolation = 0;
+int GLAD_GLX_ARB_robustness_share_group_isolation = 0;
+int GLAD_GLX_ARB_vertex_buffer_object = 0;
+int GLAD_GLX_EXT_buffer_age = 0;
+int GLAD_GLX_EXT_context_priority = 0;
+int GLAD_GLX_EXT_create_context_es2_profile = 0;
+int GLAD_GLX_EXT_create_context_es_profile = 0;
+int GLAD_GLX_EXT_fbconfig_packed_float = 0;
+int GLAD_GLX_EXT_framebuffer_sRGB = 0;
+int GLAD_GLX_EXT_import_context = 0;
+int GLAD_GLX_EXT_libglvnd = 0;
+int GLAD_GLX_EXT_no_config_context = 0;
+int GLAD_GLX_EXT_stereo_tree = 0;
+int GLAD_GLX_EXT_swap_control = 0;
+int GLAD_GLX_EXT_swap_control_tear = 0;
+int GLAD_GLX_EXT_texture_from_pixmap = 0;
+int GLAD_GLX_EXT_visual_info = 0;
+int GLAD_GLX_EXT_visual_rating = 0;
+int GLAD_GLX_INTEL_swap_event = 0;
+int GLAD_GLX_MESA_agp_offset = 0;
+int GLAD_GLX_MESA_copy_sub_buffer = 0;
+int GLAD_GLX_MESA_pixmap_colormap = 0;
+int GLAD_GLX_MESA_query_renderer = 0;
+int GLAD_GLX_MESA_release_buffers = 0;
+int GLAD_GLX_MESA_set_3dfx_mode = 0;
+int GLAD_GLX_MESA_swap_control = 0;
+int GLAD_GLX_NV_copy_buffer = 0;
+int GLAD_GLX_NV_copy_image = 0;
+int GLAD_GLX_NV_delay_before_swap = 0;
+int GLAD_GLX_NV_float_buffer = 0;
+int GLAD_GLX_NV_multigpu_context = 0;
+int GLAD_GLX_NV_multisample_coverage = 0;
+int GLAD_GLX_NV_present_video = 0;
+int GLAD_GLX_NV_robustness_video_memory_purge = 0;
+int GLAD_GLX_NV_swap_group = 0;
+int GLAD_GLX_NV_video_capture = 0;
+int GLAD_GLX_NV_video_out = 0;
+int GLAD_GLX_OML_swap_method = 0;
+int GLAD_GLX_OML_sync_control = 0;
+int GLAD_GLX_SGIS_blended_overlay = 0;
+int GLAD_GLX_SGIS_multisample = 0;
+int GLAD_GLX_SGIS_shared_multisample = 0;
+int GLAD_GLX_SGIX_dmbuffer = 0;
+int GLAD_GLX_SGIX_fbconfig = 0;
+int GLAD_GLX_SGIX_hyperpipe = 0;
+int GLAD_GLX_SGIX_pbuffer = 0;
+int GLAD_GLX_SGIX_swap_barrier = 0;
+int GLAD_GLX_SGIX_swap_group = 0;
+int GLAD_GLX_SGIX_video_resize = 0;
+int GLAD_GLX_SGIX_video_source = 0;
+int GLAD_GLX_SGIX_visual_select_group = 0;
+int GLAD_GLX_SGI_cushion = 0;
+int GLAD_GLX_SGI_make_current_read = 0;
+int GLAD_GLX_SGI_swap_control = 0;
+int GLAD_GLX_SGI_video_sync = 0;
+int GLAD_GLX_SUN_get_transparent_index = 0;
+PFNGLXGETGPUIDSAMDPROC glad_glXGetGPUIDsAMD = NULL;
+PFNGLXGETGPUINFOAMDPROC glad_glXGetGPUInfoAMD = NULL;
+PFNGLXGETCONTEXTGPUIDAMDPROC glad_glXGetContextGPUIDAMD = NULL;
+PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC glad_glXCreateAssociatedContextAMD = NULL;
+PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC glad_glXCreateAssociatedContextAttribsAMD = NULL;
+PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC glad_glXDeleteAssociatedContextAMD = NULL;
+PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC glad_glXMakeAssociatedContextCurrentAMD = NULL;
+PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC glad_glXGetCurrentAssociatedContextAMD = NULL;
+PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC glad_glXBlitContextFramebufferAMD = NULL;
+PFNGLXCREATECONTEXTATTRIBSARBPROC glad_glXCreateContextAttribsARB = NULL;
+PFNGLXGETPROCADDRESSARBPROC glad_glXGetProcAddressARB = NULL;
+PFNGLXGETCURRENTDISPLAYEXTPROC glad_glXGetCurrentDisplayEXT = NULL;
+PFNGLXQUERYCONTEXTINFOEXTPROC glad_glXQueryContextInfoEXT = NULL;
+PFNGLXGETCONTEXTIDEXTPROC glad_glXGetContextIDEXT = NULL;
+PFNGLXIMPORTCONTEXTEXTPROC glad_glXImportContextEXT = NULL;
+PFNGLXFREECONTEXTEXTPROC glad_glXFreeContextEXT = NULL;
+PFNGLXSWAPINTERVALEXTPROC glad_glXSwapIntervalEXT = NULL;
+PFNGLXBINDTEXIMAGEEXTPROC glad_glXBindTexImageEXT = NULL;
+PFNGLXRELEASETEXIMAGEEXTPROC glad_glXReleaseTexImageEXT = NULL;
+PFNGLXGETAGPOFFSETMESAPROC glad_glXGetAGPOffsetMESA = NULL;
+PFNGLXCOPYSUBBUFFERMESAPROC glad_glXCopySubBufferMESA = NULL;
+PFNGLXCREATEGLXPIXMAPMESAPROC glad_glXCreateGLXPixmapMESA = NULL;
+PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC glad_glXQueryCurrentRendererIntegerMESA = NULL;
+PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC glad_glXQueryCurrentRendererStringMESA = NULL;
+PFNGLXQUERYRENDERERINTEGERMESAPROC glad_glXQueryRendererIntegerMESA = NULL;
+PFNGLXQUERYRENDERERSTRINGMESAPROC glad_glXQueryRendererStringMESA = NULL;
+PFNGLXRELEASEBUFFERSMESAPROC glad_glXReleaseBuffersMESA = NULL;
+PFNGLXSET3DFXMODEMESAPROC glad_glXSet3DfxModeMESA = NULL;
+PFNGLXGETSWAPINTERVALMESAPROC glad_glXGetSwapIntervalMESA = NULL;
+PFNGLXSWAPINTERVALMESAPROC glad_glXSwapIntervalMESA = NULL;
+PFNGLXCOPYBUFFERSUBDATANVPROC glad_glXCopyBufferSubDataNV = NULL;
+PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC glad_glXNamedCopyBufferSubDataNV = NULL;
+PFNGLXCOPYIMAGESUBDATANVPROC glad_glXCopyImageSubDataNV = NULL;
+PFNGLXDELAYBEFORESWAPNVPROC glad_glXDelayBeforeSwapNV = NULL;
+PFNGLXENUMERATEVIDEODEVICESNVPROC glad_glXEnumerateVideoDevicesNV = NULL;
+PFNGLXBINDVIDEODEVICENVPROC glad_glXBindVideoDeviceNV = NULL;
+PFNGLXJOINSWAPGROUPNVPROC glad_glXJoinSwapGroupNV = NULL;
+PFNGLXBINDSWAPBARRIERNVPROC glad_glXBindSwapBarrierNV = NULL;
+PFNGLXQUERYSWAPGROUPNVPROC glad_glXQuerySwapGroupNV = NULL;
+PFNGLXQUERYMAXSWAPGROUPSNVPROC glad_glXQueryMaxSwapGroupsNV = NULL;
+PFNGLXQUERYFRAMECOUNTNVPROC glad_glXQueryFrameCountNV = NULL;
+PFNGLXRESETFRAMECOUNTNVPROC glad_glXResetFrameCountNV = NULL;
+PFNGLXBINDVIDEOCAPTUREDEVICENVPROC glad_glXBindVideoCaptureDeviceNV = NULL;
+PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC glad_glXEnumerateVideoCaptureDevicesNV = NULL;
+PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC glad_glXLockVideoCaptureDeviceNV = NULL;
+PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC glad_glXQueryVideoCaptureDeviceNV = NULL;
+PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC glad_glXReleaseVideoCaptureDeviceNV = NULL;
+PFNGLXGETVIDEODEVICENVPROC glad_glXGetVideoDeviceNV = NULL;
+PFNGLXRELEASEVIDEODEVICENVPROC glad_glXReleaseVideoDeviceNV = NULL;
+PFNGLXBINDVIDEOIMAGENVPROC glad_glXBindVideoImageNV = NULL;
+PFNGLXRELEASEVIDEOIMAGENVPROC glad_glXReleaseVideoImageNV = NULL;
+PFNGLXSENDPBUFFERTOVIDEONVPROC glad_glXSendPbufferToVideoNV = NULL;
+PFNGLXGETVIDEOINFONVPROC glad_glXGetVideoInfoNV = NULL;
+PFNGLXGETSYNCVALUESOMLPROC glad_glXGetSyncValuesOML = NULL;
+PFNGLXGETMSCRATEOMLPROC glad_glXGetMscRateOML = NULL;
+PFNGLXSWAPBUFFERSMSCOMLPROC glad_glXSwapBuffersMscOML = NULL;
+PFNGLXWAITFORMSCOMLPROC glad_glXWaitForMscOML = NULL;
+PFNGLXWAITFORSBCOMLPROC glad_glXWaitForSbcOML = NULL;
+#ifdef _DM_BUFFER_H_
+PFNGLXASSOCIATEDMPBUFFERSGIXPROC glad_glXAssociateDMPbufferSGIX = NULL;
+#endif
+PFNGLXGETFBCONFIGATTRIBSGIXPROC glad_glXGetFBConfigAttribSGIX = NULL;
+PFNGLXCHOOSEFBCONFIGSGIXPROC glad_glXChooseFBConfigSGIX = NULL;
+PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC glad_glXCreateGLXPixmapWithConfigSGIX = NULL;
+PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC glad_glXCreateContextWithConfigSGIX = NULL;
+PFNGLXGETVISUALFROMFBCONFIGSGIXPROC glad_glXGetVisualFromFBConfigSGIX = NULL;
+PFNGLXGETFBCONFIGFROMVISUALSGIXPROC glad_glXGetFBConfigFromVisualSGIX = NULL;
+PFNGLXQUERYHYPERPIPENETWORKSGIXPROC glad_glXQueryHyperpipeNetworkSGIX = NULL;
+PFNGLXHYPERPIPECONFIGSGIXPROC glad_glXHyperpipeConfigSGIX = NULL;
+PFNGLXQUERYHYPERPIPECONFIGSGIXPROC glad_glXQueryHyperpipeConfigSGIX = NULL;
+PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC glad_glXDestroyHyperpipeConfigSGIX = NULL;
+PFNGLXBINDHYPERPIPESGIXPROC glad_glXBindHyperpipeSGIX = NULL;
+PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC glad_glXQueryHyperpipeBestAttribSGIX = NULL;
+PFNGLXHYPERPIPEATTRIBSGIXPROC glad_glXHyperpipeAttribSGIX = NULL;
+PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC glad_glXQueryHyperpipeAttribSGIX = NULL;
+PFNGLXCREATEGLXPBUFFERSGIXPROC glad_glXCreateGLXPbufferSGIX = NULL;
+PFNGLXDESTROYGLXPBUFFERSGIXPROC glad_glXDestroyGLXPbufferSGIX = NULL;
+PFNGLXQUERYGLXPBUFFERSGIXPROC glad_glXQueryGLXPbufferSGIX = NULL;
+PFNGLXSELECTEVENTSGIXPROC glad_glXSelectEventSGIX = NULL;
+PFNGLXGETSELECTEDEVENTSGIXPROC glad_glXGetSelectedEventSGIX = NULL;
+PFNGLXBINDSWAPBARRIERSGIXPROC glad_glXBindSwapBarrierSGIX = NULL;
+PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC glad_glXQueryMaxSwapBarriersSGIX = NULL;
+PFNGLXJOINSWAPGROUPSGIXPROC glad_glXJoinSwapGroupSGIX = NULL;
+PFNGLXBINDCHANNELTOWINDOWSGIXPROC glad_glXBindChannelToWindowSGIX = NULL;
+PFNGLXCHANNELRECTSGIXPROC glad_glXChannelRectSGIX = NULL;
+PFNGLXQUERYCHANNELRECTSGIXPROC glad_glXQueryChannelRectSGIX = NULL;
+PFNGLXQUERYCHANNELDELTASSGIXPROC glad_glXQueryChannelDeltasSGIX = NULL;
+PFNGLXCHANNELRECTSYNCSGIXPROC glad_glXChannelRectSyncSGIX = NULL;
+#ifdef _VL_H_
+PFNGLXCREATEGLXVIDEOSOURCESGIXPROC glad_glXCreateGLXVideoSourceSGIX = NULL;
+PFNGLXDESTROYGLXVIDEOSOURCESGIXPROC glad_glXDestroyGLXVideoSourceSGIX = NULL;
+#endif
+PFNGLXCUSHIONSGIPROC glad_glXCushionSGI = NULL;
+PFNGLXMAKECURRENTREADSGIPROC glad_glXMakeCurrentReadSGI = NULL;
+PFNGLXGETCURRENTREADDRAWABLESGIPROC glad_glXGetCurrentReadDrawableSGI = NULL;
+PFNGLXSWAPINTERVALSGIPROC glad_glXSwapIntervalSGI = NULL;
+PFNGLXGETVIDEOSYNCSGIPROC glad_glXGetVideoSyncSGI = NULL;
+PFNGLXWAITVIDEOSYNCSGIPROC glad_glXWaitVideoSyncSGI = NULL;
+PFNGLXGETTRANSPARENTINDEXSUNPROC glad_glXGetTransparentIndexSUN = NULL;
+static void load_GLX_VERSION_1_0(GLADloadproc load) {
+ if(!GLAD_GLX_VERSION_1_0) return;
+ glad_glXChooseVisual = (PFNGLXCHOOSEVISUALPROC)load("glXChooseVisual");
+ glad_glXCreateContext = (PFNGLXCREATECONTEXTPROC)load("glXCreateContext");
+ glad_glXDestroyContext = (PFNGLXDESTROYCONTEXTPROC)load("glXDestroyContext");
+ glad_glXMakeCurrent = (PFNGLXMAKECURRENTPROC)load("glXMakeCurrent");
+ glad_glXCopyContext = (PFNGLXCOPYCONTEXTPROC)load("glXCopyContext");
+ glad_glXSwapBuffers = (PFNGLXSWAPBUFFERSPROC)load("glXSwapBuffers");
+ glad_glXCreateGLXPixmap = (PFNGLXCREATEGLXPIXMAPPROC)load("glXCreateGLXPixmap");
+ glad_glXDestroyGLXPixmap = (PFNGLXDESTROYGLXPIXMAPPROC)load("glXDestroyGLXPixmap");
+ glad_glXQueryExtension = (PFNGLXQUERYEXTENSIONPROC)load("glXQueryExtension");
+ glad_glXQueryVersion = (PFNGLXQUERYVERSIONPROC)load("glXQueryVersion");
+ glad_glXIsDirect = (PFNGLXISDIRECTPROC)load("glXIsDirect");
+ glad_glXGetConfig = (PFNGLXGETCONFIGPROC)load("glXGetConfig");
+ glad_glXGetCurrentContext = (PFNGLXGETCURRENTCONTEXTPROC)load("glXGetCurrentContext");
+ glad_glXGetCurrentDrawable = (PFNGLXGETCURRENTDRAWABLEPROC)load("glXGetCurrentDrawable");
+ glad_glXWaitGL = (PFNGLXWAITGLPROC)load("glXWaitGL");
+ glad_glXWaitX = (PFNGLXWAITXPROC)load("glXWaitX");
+ glad_glXUseXFont = (PFNGLXUSEXFONTPROC)load("glXUseXFont");
+}
+static void load_GLX_VERSION_1_1(GLADloadproc load) {
+ if(!GLAD_GLX_VERSION_1_1) return;
+ glad_glXQueryExtensionsString = (PFNGLXQUERYEXTENSIONSSTRINGPROC)load("glXQueryExtensionsString");
+ glad_glXQueryServerString = (PFNGLXQUERYSERVERSTRINGPROC)load("glXQueryServerString");
+ glad_glXGetClientString = (PFNGLXGETCLIENTSTRINGPROC)load("glXGetClientString");
+}
+static void load_GLX_VERSION_1_2(GLADloadproc load) {
+ if(!GLAD_GLX_VERSION_1_2) return;
+ glad_glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC)load("glXGetCurrentDisplay");
+}
+static void load_GLX_VERSION_1_3(GLADloadproc load) {
+ if(!GLAD_GLX_VERSION_1_3) return;
+ glad_glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC)load("glXGetFBConfigs");
+ glad_glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC)load("glXChooseFBConfig");
+ glad_glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC)load("glXGetFBConfigAttrib");
+ glad_glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC)load("glXGetVisualFromFBConfig");
+ glad_glXCreateWindow = (PFNGLXCREATEWINDOWPROC)load("glXCreateWindow");
+ glad_glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC)load("glXDestroyWindow");
+ glad_glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC)load("glXCreatePixmap");
+ glad_glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC)load("glXDestroyPixmap");
+ glad_glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC)load("glXCreatePbuffer");
+ glad_glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC)load("glXDestroyPbuffer");
+ glad_glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC)load("glXQueryDrawable");
+ glad_glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC)load("glXCreateNewContext");
+ glad_glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC)load("glXMakeContextCurrent");
+ glad_glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC)load("glXGetCurrentReadDrawable");
+ glad_glXQueryContext = (PFNGLXQUERYCONTEXTPROC)load("glXQueryContext");
+ glad_glXSelectEvent = (PFNGLXSELECTEVENTPROC)load("glXSelectEvent");
+ glad_glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC)load("glXGetSelectedEvent");
+}
+static void load_GLX_VERSION_1_4(GLADloadproc load) {
+ if(!GLAD_GLX_VERSION_1_4) return;
+ glad_glXGetProcAddress = (PFNGLXGETPROCADDRESSPROC)load("glXGetProcAddress");
+}
+static void load_GLX_AMD_gpu_association(GLADloadproc load) {
+ if(!GLAD_GLX_AMD_gpu_association) return;
+ glad_glXGetGPUIDsAMD = (PFNGLXGETGPUIDSAMDPROC)load("glXGetGPUIDsAMD");
+ glad_glXGetGPUInfoAMD = (PFNGLXGETGPUINFOAMDPROC)load("glXGetGPUInfoAMD");
+ glad_glXGetContextGPUIDAMD = (PFNGLXGETCONTEXTGPUIDAMDPROC)load("glXGetContextGPUIDAMD");
+ glad_glXCreateAssociatedContextAMD = (PFNGLXCREATEASSOCIATEDCONTEXTAMDPROC)load("glXCreateAssociatedContextAMD");
+ glad_glXCreateAssociatedContextAttribsAMD = (PFNGLXCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)load("glXCreateAssociatedContextAttribsAMD");
+ glad_glXDeleteAssociatedContextAMD = (PFNGLXDELETEASSOCIATEDCONTEXTAMDPROC)load("glXDeleteAssociatedContextAMD");
+ glad_glXMakeAssociatedContextCurrentAMD = (PFNGLXMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)load("glXMakeAssociatedContextCurrentAMD");
+ glad_glXGetCurrentAssociatedContextAMD = (PFNGLXGETCURRENTASSOCIATEDCONTEXTAMDPROC)load("glXGetCurrentAssociatedContextAMD");
+ glad_glXBlitContextFramebufferAMD = (PFNGLXBLITCONTEXTFRAMEBUFFERAMDPROC)load("glXBlitContextFramebufferAMD");
+}
+static void load_GLX_ARB_create_context(GLADloadproc load) {
+ if(!GLAD_GLX_ARB_create_context) return;
+ glad_glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)load("glXCreateContextAttribsARB");
+}
+static void load_GLX_ARB_get_proc_address(GLADloadproc load) {
+ if(!GLAD_GLX_ARB_get_proc_address) return;
+ glad_glXGetProcAddressARB = (PFNGLXGETPROCADDRESSARBPROC)load("glXGetProcAddressARB");
+}
+static void load_GLX_EXT_import_context(GLADloadproc load) {
+ if(!GLAD_GLX_EXT_import_context) return;
+ glad_glXGetCurrentDisplayEXT = (PFNGLXGETCURRENTDISPLAYEXTPROC)load("glXGetCurrentDisplayEXT");
+ glad_glXQueryContextInfoEXT = (PFNGLXQUERYCONTEXTINFOEXTPROC)load("glXQueryContextInfoEXT");
+ glad_glXGetContextIDEXT = (PFNGLXGETCONTEXTIDEXTPROC)load("glXGetContextIDEXT");
+ glad_glXImportContextEXT = (PFNGLXIMPORTCONTEXTEXTPROC)load("glXImportContextEXT");
+ glad_glXFreeContextEXT = (PFNGLXFREECONTEXTEXTPROC)load("glXFreeContextEXT");
+}
+static void load_GLX_EXT_swap_control(GLADloadproc load) {
+ if(!GLAD_GLX_EXT_swap_control) return;
+ glad_glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC)load("glXSwapIntervalEXT");
+}
+static void load_GLX_EXT_texture_from_pixmap(GLADloadproc load) {
+ if(!GLAD_GLX_EXT_texture_from_pixmap) return;
+ glad_glXBindTexImageEXT = (PFNGLXBINDTEXIMAGEEXTPROC)load("glXBindTexImageEXT");
+ glad_glXReleaseTexImageEXT = (PFNGLXRELEASETEXIMAGEEXTPROC)load("glXReleaseTexImageEXT");
+}
+static void load_GLX_MESA_agp_offset(GLADloadproc load) {
+ if(!GLAD_GLX_MESA_agp_offset) return;
+ glad_glXGetAGPOffsetMESA = (PFNGLXGETAGPOFFSETMESAPROC)load("glXGetAGPOffsetMESA");
+}
+static void load_GLX_MESA_copy_sub_buffer(GLADloadproc load) {
+ if(!GLAD_GLX_MESA_copy_sub_buffer) return;
+ glad_glXCopySubBufferMESA = (PFNGLXCOPYSUBBUFFERMESAPROC)load("glXCopySubBufferMESA");
+}
+static void load_GLX_MESA_pixmap_colormap(GLADloadproc load) {
+ if(!GLAD_GLX_MESA_pixmap_colormap) return;
+ glad_glXCreateGLXPixmapMESA = (PFNGLXCREATEGLXPIXMAPMESAPROC)load("glXCreateGLXPixmapMESA");
+}
+static void load_GLX_MESA_query_renderer(GLADloadproc load) {
+ if(!GLAD_GLX_MESA_query_renderer) return;
+ glad_glXQueryCurrentRendererIntegerMESA = (PFNGLXQUERYCURRENTRENDERERINTEGERMESAPROC)load("glXQueryCurrentRendererIntegerMESA");
+ glad_glXQueryCurrentRendererStringMESA = (PFNGLXQUERYCURRENTRENDERERSTRINGMESAPROC)load("glXQueryCurrentRendererStringMESA");
+ glad_glXQueryRendererIntegerMESA = (PFNGLXQUERYRENDERERINTEGERMESAPROC)load("glXQueryRendererIntegerMESA");
+ glad_glXQueryRendererStringMESA = (PFNGLXQUERYRENDERERSTRINGMESAPROC)load("glXQueryRendererStringMESA");
+}
+static void load_GLX_MESA_release_buffers(GLADloadproc load) {
+ if(!GLAD_GLX_MESA_release_buffers) return;
+ glad_glXReleaseBuffersMESA = (PFNGLXRELEASEBUFFERSMESAPROC)load("glXReleaseBuffersMESA");
+}
+static void load_GLX_MESA_set_3dfx_mode(GLADloadproc load) {
+ if(!GLAD_GLX_MESA_set_3dfx_mode) return;
+ glad_glXSet3DfxModeMESA = (PFNGLXSET3DFXMODEMESAPROC)load("glXSet3DfxModeMESA");
+}
+static void load_GLX_MESA_swap_control(GLADloadproc load) {
+ if(!GLAD_GLX_MESA_swap_control) return;
+ glad_glXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC)load("glXGetSwapIntervalMESA");
+ glad_glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC)load("glXSwapIntervalMESA");
+}
+static void load_GLX_NV_copy_buffer(GLADloadproc load) {
+ if(!GLAD_GLX_NV_copy_buffer) return;
+ glad_glXCopyBufferSubDataNV = (PFNGLXCOPYBUFFERSUBDATANVPROC)load("glXCopyBufferSubDataNV");
+ glad_glXNamedCopyBufferSubDataNV = (PFNGLXNAMEDCOPYBUFFERSUBDATANVPROC)load("glXNamedCopyBufferSubDataNV");
+}
+static void load_GLX_NV_copy_image(GLADloadproc load) {
+ if(!GLAD_GLX_NV_copy_image) return;
+ glad_glXCopyImageSubDataNV = (PFNGLXCOPYIMAGESUBDATANVPROC)load("glXCopyImageSubDataNV");
+}
+static void load_GLX_NV_delay_before_swap(GLADloadproc load) {
+ if(!GLAD_GLX_NV_delay_before_swap) return;
+ glad_glXDelayBeforeSwapNV = (PFNGLXDELAYBEFORESWAPNVPROC)load("glXDelayBeforeSwapNV");
+}
+static void load_GLX_NV_present_video(GLADloadproc load) {
+ if(!GLAD_GLX_NV_present_video) return;
+ glad_glXEnumerateVideoDevicesNV = (PFNGLXENUMERATEVIDEODEVICESNVPROC)load("glXEnumerateVideoDevicesNV");
+ glad_glXBindVideoDeviceNV = (PFNGLXBINDVIDEODEVICENVPROC)load("glXBindVideoDeviceNV");
+}
+static void load_GLX_NV_swap_group(GLADloadproc load) {
+ if(!GLAD_GLX_NV_swap_group) return;
+ glad_glXJoinSwapGroupNV = (PFNGLXJOINSWAPGROUPNVPROC)load("glXJoinSwapGroupNV");
+ glad_glXBindSwapBarrierNV = (PFNGLXBINDSWAPBARRIERNVPROC)load("glXBindSwapBarrierNV");
+ glad_glXQuerySwapGroupNV = (PFNGLXQUERYSWAPGROUPNVPROC)load("glXQuerySwapGroupNV");
+ glad_glXQueryMaxSwapGroupsNV = (PFNGLXQUERYMAXSWAPGROUPSNVPROC)load("glXQueryMaxSwapGroupsNV");
+ glad_glXQueryFrameCountNV = (PFNGLXQUERYFRAMECOUNTNVPROC)load("glXQueryFrameCountNV");
+ glad_glXResetFrameCountNV = (PFNGLXRESETFRAMECOUNTNVPROC)load("glXResetFrameCountNV");
+}
+static void load_GLX_NV_video_capture(GLADloadproc load) {
+ if(!GLAD_GLX_NV_video_capture) return;
+ glad_glXBindVideoCaptureDeviceNV = (PFNGLXBINDVIDEOCAPTUREDEVICENVPROC)load("glXBindVideoCaptureDeviceNV");
+ glad_glXEnumerateVideoCaptureDevicesNV = (PFNGLXENUMERATEVIDEOCAPTUREDEVICESNVPROC)load("glXEnumerateVideoCaptureDevicesNV");
+ glad_glXLockVideoCaptureDeviceNV = (PFNGLXLOCKVIDEOCAPTUREDEVICENVPROC)load("glXLockVideoCaptureDeviceNV");
+ glad_glXQueryVideoCaptureDeviceNV = (PFNGLXQUERYVIDEOCAPTUREDEVICENVPROC)load("glXQueryVideoCaptureDeviceNV");
+ glad_glXReleaseVideoCaptureDeviceNV = (PFNGLXRELEASEVIDEOCAPTUREDEVICENVPROC)load("glXReleaseVideoCaptureDeviceNV");
+}
+static void load_GLX_NV_video_out(GLADloadproc load) {
+ if(!GLAD_GLX_NV_video_out) return;
+ glad_glXGetVideoDeviceNV = (PFNGLXGETVIDEODEVICENVPROC)load("glXGetVideoDeviceNV");
+ glad_glXReleaseVideoDeviceNV = (PFNGLXRELEASEVIDEODEVICENVPROC)load("glXReleaseVideoDeviceNV");
+ glad_glXBindVideoImageNV = (PFNGLXBINDVIDEOIMAGENVPROC)load("glXBindVideoImageNV");
+ glad_glXReleaseVideoImageNV = (PFNGLXRELEASEVIDEOIMAGENVPROC)load("glXReleaseVideoImageNV");
+ glad_glXSendPbufferToVideoNV = (PFNGLXSENDPBUFFERTOVIDEONVPROC)load("glXSendPbufferToVideoNV");
+ glad_glXGetVideoInfoNV = (PFNGLXGETVIDEOINFONVPROC)load("glXGetVideoInfoNV");
+}
+static void load_GLX_OML_sync_control(GLADloadproc load) {
+ if(!GLAD_GLX_OML_sync_control) return;
+ glad_glXGetSyncValuesOML = (PFNGLXGETSYNCVALUESOMLPROC)load("glXGetSyncValuesOML");
+ glad_glXGetMscRateOML = (PFNGLXGETMSCRATEOMLPROC)load("glXGetMscRateOML");
+ glad_glXSwapBuffersMscOML = (PFNGLXSWAPBUFFERSMSCOMLPROC)load("glXSwapBuffersMscOML");
+ glad_glXWaitForMscOML = (PFNGLXWAITFORMSCOMLPROC)load("glXWaitForMscOML");
+ glad_glXWaitForSbcOML = (PFNGLXWAITFORSBCOMLPROC)load("glXWaitForSbcOML");
+}
+static void load_GLX_SGIX_dmbuffer(GLADloadproc load) {
+ if(!GLAD_GLX_SGIX_dmbuffer) return;
+#ifdef _DM_BUFFER_H_
+ glad_glXAssociateDMPbufferSGIX = (PFNGLXASSOCIATEDMPBUFFERSGIXPROC)load("glXAssociateDMPbufferSGIX");
+#else
+ (void)load;
+#endif
+}
+static void load_GLX_SGIX_fbconfig(GLADloadproc load) {
+ if(!GLAD_GLX_SGIX_fbconfig) return;
+ glad_glXGetFBConfigAttribSGIX = (PFNGLXGETFBCONFIGATTRIBSGIXPROC)load("glXGetFBConfigAttribSGIX");
+ glad_glXChooseFBConfigSGIX = (PFNGLXCHOOSEFBCONFIGSGIXPROC)load("glXChooseFBConfigSGIX");
+ glad_glXCreateGLXPixmapWithConfigSGIX = (PFNGLXCREATEGLXPIXMAPWITHCONFIGSGIXPROC)load("glXCreateGLXPixmapWithConfigSGIX");
+ glad_glXCreateContextWithConfigSGIX = (PFNGLXCREATECONTEXTWITHCONFIGSGIXPROC)load("glXCreateContextWithConfigSGIX");
+ glad_glXGetVisualFromFBConfigSGIX = (PFNGLXGETVISUALFROMFBCONFIGSGIXPROC)load("glXGetVisualFromFBConfigSGIX");
+ glad_glXGetFBConfigFromVisualSGIX = (PFNGLXGETFBCONFIGFROMVISUALSGIXPROC)load("glXGetFBConfigFromVisualSGIX");
+}
+static void load_GLX_SGIX_hyperpipe(GLADloadproc load) {
+ if(!GLAD_GLX_SGIX_hyperpipe) return;
+ glad_glXQueryHyperpipeNetworkSGIX = (PFNGLXQUERYHYPERPIPENETWORKSGIXPROC)load("glXQueryHyperpipeNetworkSGIX");
+ glad_glXHyperpipeConfigSGIX = (PFNGLXHYPERPIPECONFIGSGIXPROC)load("glXHyperpipeConfigSGIX");
+ glad_glXQueryHyperpipeConfigSGIX = (PFNGLXQUERYHYPERPIPECONFIGSGIXPROC)load("glXQueryHyperpipeConfigSGIX");
+ glad_glXDestroyHyperpipeConfigSGIX = (PFNGLXDESTROYHYPERPIPECONFIGSGIXPROC)load("glXDestroyHyperpipeConfigSGIX");
+ glad_glXBindHyperpipeSGIX = (PFNGLXBINDHYPERPIPESGIXPROC)load("glXBindHyperpipeSGIX");
+ glad_glXQueryHyperpipeBestAttribSGIX = (PFNGLXQUERYHYPERPIPEBESTATTRIBSGIXPROC)load("glXQueryHyperpipeBestAttribSGIX");
+ glad_glXHyperpipeAttribSGIX = (PFNGLXHYPERPIPEATTRIBSGIXPROC)load("glXHyperpipeAttribSGIX");
+ glad_glXQueryHyperpipeAttribSGIX = (PFNGLXQUERYHYPERPIPEATTRIBSGIXPROC)load("glXQueryHyperpipeAttribSGIX");
+}
+static void load_GLX_SGIX_pbuffer(GLADloadproc load) {
+ if(!GLAD_GLX_SGIX_pbuffer) return;
+ glad_glXCreateGLXPbufferSGIX = (PFNGLXCREATEGLXPBUFFERSGIXPROC)load("glXCreateGLXPbufferSGIX");
+ glad_glXDestroyGLXPbufferSGIX = (PFNGLXDESTROYGLXPBUFFERSGIXPROC)load("glXDestroyGLXPbufferSGIX");
+ glad_glXQueryGLXPbufferSGIX = (PFNGLXQUERYGLXPBUFFERSGIXPROC)load("glXQueryGLXPbufferSGIX");
+ glad_glXSelectEventSGIX = (PFNGLXSELECTEVENTSGIXPROC)load("glXSelectEventSGIX");
+ glad_glXGetSelectedEventSGIX = (PFNGLXGETSELECTEDEVENTSGIXPROC)load("glXGetSelectedEventSGIX");
+}
+static void load_GLX_SGIX_swap_barrier(GLADloadproc load) {
+ if(!GLAD_GLX_SGIX_swap_barrier) return;
+ glad_glXBindSwapBarrierSGIX = (PFNGLXBINDSWAPBARRIERSGIXPROC)load("glXBindSwapBarrierSGIX");
+ glad_glXQueryMaxSwapBarriersSGIX = (PFNGLXQUERYMAXSWAPBARRIERSSGIXPROC)load("glXQueryMaxSwapBarriersSGIX");
+}
+static void load_GLX_SGIX_swap_group(GLADloadproc load) {
+ if(!GLAD_GLX_SGIX_swap_group) return;
+ glad_glXJoinSwapGroupSGIX = (PFNGLXJOINSWAPGROUPSGIXPROC)load("glXJoinSwapGroupSGIX");
+}
+static void load_GLX_SGIX_video_resize(GLADloadproc load) {
+ if(!GLAD_GLX_SGIX_video_resize) return;
+ glad_glXBindChannelToWindowSGIX = (PFNGLXBINDCHANNELTOWINDOWSGIXPROC)load("glXBindChannelToWindowSGIX");
+ glad_glXChannelRectSGIX = (PFNGLXCHANNELRECTSGIXPROC)load("glXChannelRectSGIX");
+ glad_glXQueryChannelRectSGIX = (PFNGLXQUERYCHANNELRECTSGIXPROC)load("glXQueryChannelRectSGIX");
+ glad_glXQueryChannelDeltasSGIX = (PFNGLXQUERYCHANNELDELTASSGIXPROC)load("glXQueryChannelDeltasSGIX");
+ glad_glXChannelRectSyncSGIX = (PFNGLXCHANNELRECTSYNCSGIXPROC)load("glXChannelRectSyncSGIX");
+}
+static void load_GLX_SGIX_video_source(GLADloadproc load) {
+ if(!GLAD_GLX_SGIX_video_source) return;
+#ifdef _VL_H_
+ glad_glXCreateGLXVideoSourceSGIX = (PFNGLXCREATEGLXVIDEOSOURCESGIXPROC)load("glXCreateGLXVideoSourceSGIX");
+ glad_glXDestroyGLXVideoSourceSGIX = (PFNGLXDESTROYGLXVIDEOSOURCESGIXPROC)load("glXDestroyGLXVideoSourceSGIX");
+#else
+ (void)load;
+#endif
+}
+static void load_GLX_SGI_cushion(GLADloadproc load) {
+ if(!GLAD_GLX_SGI_cushion) return;
+ glad_glXCushionSGI = (PFNGLXCUSHIONSGIPROC)load("glXCushionSGI");
+}
+static void load_GLX_SGI_make_current_read(GLADloadproc load) {
+ if(!GLAD_GLX_SGI_make_current_read) return;
+ glad_glXMakeCurrentReadSGI = (PFNGLXMAKECURRENTREADSGIPROC)load("glXMakeCurrentReadSGI");
+ glad_glXGetCurrentReadDrawableSGI = (PFNGLXGETCURRENTREADDRAWABLESGIPROC)load("glXGetCurrentReadDrawableSGI");
+}
+static void load_GLX_SGI_swap_control(GLADloadproc load) {
+ if(!GLAD_GLX_SGI_swap_control) return;
+ glad_glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC)load("glXSwapIntervalSGI");
+}
+static void load_GLX_SGI_video_sync(GLADloadproc load) {
+ if(!GLAD_GLX_SGI_video_sync) return;
+ glad_glXGetVideoSyncSGI = (PFNGLXGETVIDEOSYNCSGIPROC)load("glXGetVideoSyncSGI");
+ glad_glXWaitVideoSyncSGI = (PFNGLXWAITVIDEOSYNCSGIPROC)load("glXWaitVideoSyncSGI");
+}
+static void load_GLX_SUN_get_transparent_index(GLADloadproc load) {
+ if(!GLAD_GLX_SUN_get_transparent_index) return;
+ glad_glXGetTransparentIndexSUN = (PFNGLXGETTRANSPARENTINDEXSUNPROC)load("glXGetTransparentIndexSUN");
+}
+static int find_extensionsGLX(void) {
+ if (!get_exts()) return 0;
+ GLAD_GLX_3DFX_multisample = has_ext("GLX_3DFX_multisample");
+ GLAD_GLX_AMD_gpu_association = has_ext("GLX_AMD_gpu_association");
+ GLAD_GLX_ARB_context_flush_control = has_ext("GLX_ARB_context_flush_control");
+ GLAD_GLX_ARB_create_context = has_ext("GLX_ARB_create_context");
+ GLAD_GLX_ARB_create_context_no_error = has_ext("GLX_ARB_create_context_no_error");
+ GLAD_GLX_ARB_create_context_profile = has_ext("GLX_ARB_create_context_profile");
+ GLAD_GLX_ARB_create_context_robustness = has_ext("GLX_ARB_create_context_robustness");
+ GLAD_GLX_ARB_fbconfig_float = has_ext("GLX_ARB_fbconfig_float");
+ GLAD_GLX_ARB_framebuffer_sRGB = has_ext("GLX_ARB_framebuffer_sRGB");
+ GLAD_GLX_ARB_get_proc_address = has_ext("GLX_ARB_get_proc_address");
+ GLAD_GLX_ARB_multisample = has_ext("GLX_ARB_multisample");
+ GLAD_GLX_ARB_robustness_application_isolation = has_ext("GLX_ARB_robustness_application_isolation");
+ GLAD_GLX_ARB_robustness_share_group_isolation = has_ext("GLX_ARB_robustness_share_group_isolation");
+ GLAD_GLX_ARB_vertex_buffer_object = has_ext("GLX_ARB_vertex_buffer_object");
+ GLAD_GLX_EXT_buffer_age = has_ext("GLX_EXT_buffer_age");
+ GLAD_GLX_EXT_context_priority = has_ext("GLX_EXT_context_priority");
+ GLAD_GLX_EXT_create_context_es2_profile = has_ext("GLX_EXT_create_context_es2_profile");
+ GLAD_GLX_EXT_create_context_es_profile = has_ext("GLX_EXT_create_context_es_profile");
+ GLAD_GLX_EXT_fbconfig_packed_float = has_ext("GLX_EXT_fbconfig_packed_float");
+ GLAD_GLX_EXT_framebuffer_sRGB = has_ext("GLX_EXT_framebuffer_sRGB");
+ GLAD_GLX_EXT_import_context = has_ext("GLX_EXT_import_context");
+ GLAD_GLX_EXT_libglvnd = has_ext("GLX_EXT_libglvnd");
+ GLAD_GLX_EXT_no_config_context = has_ext("GLX_EXT_no_config_context");
+ GLAD_GLX_EXT_stereo_tree = has_ext("GLX_EXT_stereo_tree");
+ GLAD_GLX_EXT_swap_control = has_ext("GLX_EXT_swap_control");
+ GLAD_GLX_EXT_swap_control_tear = has_ext("GLX_EXT_swap_control_tear");
+ GLAD_GLX_EXT_texture_from_pixmap = has_ext("GLX_EXT_texture_from_pixmap");
+ GLAD_GLX_EXT_visual_info = has_ext("GLX_EXT_visual_info");
+ GLAD_GLX_EXT_visual_rating = has_ext("GLX_EXT_visual_rating");
+ GLAD_GLX_INTEL_swap_event = has_ext("GLX_INTEL_swap_event");
+ GLAD_GLX_MESA_agp_offset = has_ext("GLX_MESA_agp_offset");
+ GLAD_GLX_MESA_copy_sub_buffer = has_ext("GLX_MESA_copy_sub_buffer");
+ GLAD_GLX_MESA_pixmap_colormap = has_ext("GLX_MESA_pixmap_colormap");
+ GLAD_GLX_MESA_query_renderer = has_ext("GLX_MESA_query_renderer");
+ GLAD_GLX_MESA_release_buffers = has_ext("GLX_MESA_release_buffers");
+ GLAD_GLX_MESA_set_3dfx_mode = has_ext("GLX_MESA_set_3dfx_mode");
+ GLAD_GLX_MESA_swap_control = has_ext("GLX_MESA_swap_control");
+ GLAD_GLX_NV_copy_buffer = has_ext("GLX_NV_copy_buffer");
+ GLAD_GLX_NV_copy_image = has_ext("GLX_NV_copy_image");
+ GLAD_GLX_NV_delay_before_swap = has_ext("GLX_NV_delay_before_swap");
+ GLAD_GLX_NV_float_buffer = has_ext("GLX_NV_float_buffer");
+ GLAD_GLX_NV_multigpu_context = has_ext("GLX_NV_multigpu_context");
+ GLAD_GLX_NV_multisample_coverage = has_ext("GLX_NV_multisample_coverage");
+ GLAD_GLX_NV_present_video = has_ext("GLX_NV_present_video");
+ GLAD_GLX_NV_robustness_video_memory_purge = has_ext("GLX_NV_robustness_video_memory_purge");
+ GLAD_GLX_NV_swap_group = has_ext("GLX_NV_swap_group");
+ GLAD_GLX_NV_video_capture = has_ext("GLX_NV_video_capture");
+ GLAD_GLX_NV_video_out = has_ext("GLX_NV_video_out");
+ GLAD_GLX_OML_swap_method = has_ext("GLX_OML_swap_method");
+ GLAD_GLX_OML_sync_control = has_ext("GLX_OML_sync_control");
+ GLAD_GLX_SGIS_blended_overlay = has_ext("GLX_SGIS_blended_overlay");
+ GLAD_GLX_SGIS_multisample = has_ext("GLX_SGIS_multisample");
+ GLAD_GLX_SGIS_shared_multisample = has_ext("GLX_SGIS_shared_multisample");
+ GLAD_GLX_SGIX_dmbuffer = has_ext("GLX_SGIX_dmbuffer");
+ GLAD_GLX_SGIX_fbconfig = has_ext("GLX_SGIX_fbconfig");
+ GLAD_GLX_SGIX_hyperpipe = has_ext("GLX_SGIX_hyperpipe");
+ GLAD_GLX_SGIX_pbuffer = has_ext("GLX_SGIX_pbuffer");
+ GLAD_GLX_SGIX_swap_barrier = has_ext("GLX_SGIX_swap_barrier");
+ GLAD_GLX_SGIX_swap_group = has_ext("GLX_SGIX_swap_group");
+ GLAD_GLX_SGIX_video_resize = has_ext("GLX_SGIX_video_resize");
+ GLAD_GLX_SGIX_video_source = has_ext("GLX_SGIX_video_source");
+ GLAD_GLX_SGIX_visual_select_group = has_ext("GLX_SGIX_visual_select_group");
+ GLAD_GLX_SGI_cushion = has_ext("GLX_SGI_cushion");
+ GLAD_GLX_SGI_make_current_read = has_ext("GLX_SGI_make_current_read");
+ GLAD_GLX_SGI_swap_control = has_ext("GLX_SGI_swap_control");
+ GLAD_GLX_SGI_video_sync = has_ext("GLX_SGI_video_sync");
+ GLAD_GLX_SUN_get_transparent_index = has_ext("GLX_SUN_get_transparent_index");
+ free_exts();
+ return 1;
+}
+
+static void find_coreGLX(Display *dpy, int screen) {
+ int major = 0, minor = 0;
+ if(dpy == 0 && GLADGLXDisplay == 0) {
+ dpy = XOpenDisplay(0);
+ screen = XScreenNumberOfScreen(XDefaultScreenOfDisplay(dpy));
+ } else if(dpy == 0) {
+ dpy = GLADGLXDisplay;
+ screen = GLADGLXscreen;
+ }
+ glXQueryVersion(dpy, &major, &minor);
+ GLADGLXDisplay = dpy;
+ GLADGLXscreen = screen;
+ GLAD_GLX_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1;
+ GLAD_GLX_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1;
+ GLAD_GLX_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1;
+ GLAD_GLX_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1;
+ GLAD_GLX_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1;
+}
+
+int gladLoadGLXLoader(GLADloadproc load, Display *dpy, int screen) {
+ glXQueryVersion = (PFNGLXQUERYVERSIONPROC)load("glXQueryVersion");
+ if(glXQueryVersion == NULL) return 0;
+ find_coreGLX(dpy, screen);
+ load_GLX_VERSION_1_0(load);
+ load_GLX_VERSION_1_1(load);
+ load_GLX_VERSION_1_2(load);
+ load_GLX_VERSION_1_3(load);
+ load_GLX_VERSION_1_4(load);
+
+ if (!find_extensionsGLX()) return 0;
+ load_GLX_AMD_gpu_association(load);
+ load_GLX_ARB_create_context(load);
+ load_GLX_ARB_get_proc_address(load);
+ load_GLX_EXT_import_context(load);
+ load_GLX_EXT_swap_control(load);
+ load_GLX_EXT_texture_from_pixmap(load);
+ load_GLX_MESA_agp_offset(load);
+ load_GLX_MESA_copy_sub_buffer(load);
+ load_GLX_MESA_pixmap_colormap(load);
+ load_GLX_MESA_query_renderer(load);
+ load_GLX_MESA_release_buffers(load);
+ load_GLX_MESA_set_3dfx_mode(load);
+ load_GLX_MESA_swap_control(load);
+ load_GLX_NV_copy_buffer(load);
+ load_GLX_NV_copy_image(load);
+ load_GLX_NV_delay_before_swap(load);
+ load_GLX_NV_present_video(load);
+ load_GLX_NV_swap_group(load);
+ load_GLX_NV_video_capture(load);
+ load_GLX_NV_video_out(load);
+ load_GLX_OML_sync_control(load);
+ load_GLX_SGIX_dmbuffer(load);
+ load_GLX_SGIX_fbconfig(load);
+ load_GLX_SGIX_hyperpipe(load);
+ load_GLX_SGIX_pbuffer(load);
+ load_GLX_SGIX_swap_barrier(load);
+ load_GLX_SGIX_swap_group(load);
+ load_GLX_SGIX_video_resize(load);
+ load_GLX_SGIX_video_source(load);
+ load_GLX_SGI_cushion(load);
+ load_GLX_SGI_make_current_read(load);
+ load_GLX_SGI_swap_control(load);
+ load_GLX_SGI_video_sync(load);
+ load_GLX_SUN_get_transparent_index(load);
+ return 1;
+}
+
diff --git a/dep/glad/src/glad_wgl.c b/dep/glad/src/glad_wgl.c
new file mode 100644
index 000000000..32824e057
--- /dev/null
+++ b/dep/glad/src/glad_wgl.c
@@ -0,0 +1,753 @@
+/*
+
+ WGL loader generated by glad 0.1.33 on Sun May 3 16:49:27 2020.
+
+ Language/Generator: C/C++
+ Specification: wgl
+ APIs: wgl=1.0
+ Profile: -
+ Extensions:
+ WGL_3DFX_multisample,
+ WGL_3DL_stereo_control,
+ WGL_AMD_gpu_association,
+ WGL_ARB_buffer_region,
+ WGL_ARB_context_flush_control,
+ WGL_ARB_create_context,
+ WGL_ARB_create_context_no_error,
+ WGL_ARB_create_context_profile,
+ WGL_ARB_create_context_robustness,
+ WGL_ARB_extensions_string,
+ WGL_ARB_framebuffer_sRGB,
+ WGL_ARB_make_current_read,
+ WGL_ARB_multisample,
+ WGL_ARB_pbuffer,
+ WGL_ARB_pixel_format,
+ WGL_ARB_pixel_format_float,
+ WGL_ARB_render_texture,
+ WGL_ARB_robustness_application_isolation,
+ WGL_ARB_robustness_share_group_isolation,
+ WGL_ATI_pixel_format_float,
+ WGL_ATI_render_texture_rectangle,
+ WGL_EXT_colorspace,
+ WGL_EXT_create_context_es2_profile,
+ WGL_EXT_create_context_es_profile,
+ WGL_EXT_depth_float,
+ WGL_EXT_display_color_table,
+ WGL_EXT_extensions_string,
+ WGL_EXT_framebuffer_sRGB,
+ WGL_EXT_make_current_read,
+ WGL_EXT_multisample,
+ WGL_EXT_pbuffer,
+ WGL_EXT_pixel_format,
+ WGL_EXT_pixel_format_packed_float,
+ WGL_EXT_swap_control,
+ WGL_EXT_swap_control_tear,
+ WGL_I3D_digital_video_control,
+ WGL_I3D_gamma,
+ WGL_I3D_genlock,
+ WGL_I3D_image_buffer,
+ WGL_I3D_swap_frame_lock,
+ WGL_I3D_swap_frame_usage,
+ WGL_NV_DX_interop,
+ WGL_NV_DX_interop2,
+ WGL_NV_copy_image,
+ WGL_NV_delay_before_swap,
+ WGL_NV_float_buffer,
+ WGL_NV_gpu_affinity,
+ WGL_NV_multigpu_context,
+ WGL_NV_multisample_coverage,
+ WGL_NV_present_video,
+ WGL_NV_render_depth_texture,
+ WGL_NV_render_texture_rectangle,
+ WGL_NV_swap_group,
+ WGL_NV_vertex_array_range,
+ WGL_NV_video_capture,
+ WGL_NV_video_output,
+ WGL_OML_sync_control
+ Loader: True
+ Local files: False
+ Omit khrplatform: False
+ Reproducible: False
+
+ Commandline:
+ --api="wgl=1.0" --generator="c" --spec="wgl" --extensions="WGL_3DFX_multisample,WGL_3DL_stereo_control,WGL_AMD_gpu_association,WGL_ARB_buffer_region,WGL_ARB_context_flush_control,WGL_ARB_create_context,WGL_ARB_create_context_no_error,WGL_ARB_create_context_profile,WGL_ARB_create_context_robustness,WGL_ARB_extensions_string,WGL_ARB_framebuffer_sRGB,WGL_ARB_make_current_read,WGL_ARB_multisample,WGL_ARB_pbuffer,WGL_ARB_pixel_format,WGL_ARB_pixel_format_float,WGL_ARB_render_texture,WGL_ARB_robustness_application_isolation,WGL_ARB_robustness_share_group_isolation,WGL_ATI_pixel_format_float,WGL_ATI_render_texture_rectangle,WGL_EXT_colorspace,WGL_EXT_create_context_es2_profile,WGL_EXT_create_context_es_profile,WGL_EXT_depth_float,WGL_EXT_display_color_table,WGL_EXT_extensions_string,WGL_EXT_framebuffer_sRGB,WGL_EXT_make_current_read,WGL_EXT_multisample,WGL_EXT_pbuffer,WGL_EXT_pixel_format,WGL_EXT_pixel_format_packed_float,WGL_EXT_swap_control,WGL_EXT_swap_control_tear,WGL_I3D_digital_video_control,WGL_I3D_gamma,WGL_I3D_genlock,WGL_I3D_image_buffer,WGL_I3D_swap_frame_lock,WGL_I3D_swap_frame_usage,WGL_NV_DX_interop,WGL_NV_DX_interop2,WGL_NV_copy_image,WGL_NV_delay_before_swap,WGL_NV_float_buffer,WGL_NV_gpu_affinity,WGL_NV_multigpu_context,WGL_NV_multisample_coverage,WGL_NV_present_video,WGL_NV_render_depth_texture,WGL_NV_render_texture_rectangle,WGL_NV_swap_group,WGL_NV_vertex_array_range,WGL_NV_video_capture,WGL_NV_video_output,WGL_OML_sync_control"
+ Online:
+ Too many extensions
+*/
+
+#include
+#include
+#include
+#include "glad_wgl.h"
+
+static void* get_proc(const char *namez);
+
+#if defined(_WIN32) || defined(__CYGWIN__)
+#ifndef _WINDOWS_
+#undef APIENTRY
+#endif
+#include
+static HMODULE libGL;
+
+typedef void* (APIENTRYP PFNWGLGETPROCADDRESSPROC_PRIVATE)(const char*);
+static PFNWGLGETPROCADDRESSPROC_PRIVATE gladGetProcAddressPtr;
+
+#ifdef _MSC_VER
+#ifdef __has_include
+ #if __has_include()
+ #define HAVE_WINAPIFAMILY 1
+ #endif
+#elif _MSC_VER >= 1700 && !_USING_V110_SDK71_
+ #define HAVE_WINAPIFAMILY 1
+#endif
+#endif
+
+#ifdef HAVE_WINAPIFAMILY
+ #include
+ #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+ #define IS_UWP 1
+ #endif
+#endif
+
+static
+int open_gl(void) {
+#ifndef IS_UWP
+ libGL = LoadLibraryW(L"opengl32.dll");
+ if(libGL != NULL) {
+ void (* tmp)(void);
+ tmp = (void(*)(void)) GetProcAddress(libGL, "wglGetProcAddress");
+ gladGetProcAddressPtr = (PFNWGLGETPROCADDRESSPROC_PRIVATE) tmp;
+ return gladGetProcAddressPtr != NULL;
+ }
+#endif
+
+ return 0;
+}
+
+static
+void close_gl(void) {
+ if(libGL != NULL) {
+ FreeLibrary((HMODULE) libGL);
+ libGL = NULL;
+ }
+}
+#else
+#include
+static void* libGL;
+
+#if !defined(__APPLE__) && !defined(__HAIKU__)
+typedef void* (APIENTRYP PFNGLXGETPROCADDRESSPROC_PRIVATE)(const char*);
+static PFNGLXGETPROCADDRESSPROC_PRIVATE gladGetProcAddressPtr;
+#endif
+
+static
+int open_gl(void) {
+#ifdef __APPLE__
+ static const char *NAMES[] = {
+ "../Frameworks/OpenGL.framework/OpenGL",
+ "/Library/Frameworks/OpenGL.framework/OpenGL",
+ "/System/Library/Frameworks/OpenGL.framework/OpenGL",
+ "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL"
+ };
+#else
+ static const char *NAMES[] = {"libGL.so.1", "libGL.so"};
+#endif
+
+ unsigned int index = 0;
+ for(index = 0; index < (sizeof(NAMES) / sizeof(NAMES[0])); index++) {
+ libGL = dlopen(NAMES[index], RTLD_NOW | RTLD_GLOBAL);
+
+ if(libGL != NULL) {
+#if defined(__APPLE__) || defined(__HAIKU__)
+ return 1;
+#else
+ gladGetProcAddressPtr = (PFNGLXGETPROCADDRESSPROC_PRIVATE)dlsym(libGL,
+ "glXGetProcAddressARB");
+ return gladGetProcAddressPtr != NULL;
+#endif
+ }
+ }
+
+ return 0;
+}
+
+static
+void close_gl(void) {
+ if(libGL != NULL) {
+ dlclose(libGL);
+ libGL = NULL;
+ }
+}
+#endif
+
+static
+void* get_proc(const char *namez) {
+ void* result = NULL;
+ if(libGL == NULL) return NULL;
+
+#if !defined(__APPLE__) && !defined(__HAIKU__)
+ if(gladGetProcAddressPtr != NULL) {
+ result = gladGetProcAddressPtr(namez);
+ }
+#endif
+ if(result == NULL) {
+#if defined(_WIN32) || defined(__CYGWIN__)
+ result = (void*)GetProcAddress((HMODULE) libGL, namez);
+#else
+ result = dlsym(libGL, namez);
+#endif
+ }
+
+ return result;
+}
+
+int gladLoadWGL(HDC hdc) {
+ int status = 0;
+
+ if(open_gl()) {
+ status = gladLoadWGLLoader((GLADloadproc)get_proc, hdc);
+ close_gl();
+ }
+
+ return status;
+}
+
+static HDC GLADWGLhdc = (HDC)INVALID_HANDLE_VALUE;
+
+static int get_exts(void) {
+ return 1;
+}
+
+static void free_exts(void) {
+ return;
+}
+
+static int has_ext(const char *ext) {
+ const char *terminator;
+ const char *loc;
+ const char *extensions;
+
+ if(wglGetExtensionsStringEXT == NULL && wglGetExtensionsStringARB == NULL)
+ return 0;
+
+ if(wglGetExtensionsStringARB == NULL || GLADWGLhdc == INVALID_HANDLE_VALUE)
+ extensions = wglGetExtensionsStringEXT();
+ else
+ extensions = wglGetExtensionsStringARB(GLADWGLhdc);
+
+ if(extensions == NULL || ext == NULL)
+ return 0;
+
+ while(1) {
+ loc = strstr(extensions, ext);
+ if(loc == NULL)
+ break;
+
+ terminator = loc + strlen(ext);
+ if((loc == extensions || *(loc - 1) == ' ') &&
+ (*terminator == ' ' || *terminator == '\0'))
+ {
+ return 1;
+ }
+ extensions = terminator;
+ }
+
+ return 0;
+}
+int GLAD_WGL_VERSION_1_0 = 0;
+int GLAD_WGL_3DFX_multisample = 0;
+int GLAD_WGL_3DL_stereo_control = 0;
+int GLAD_WGL_AMD_gpu_association = 0;
+int GLAD_WGL_ARB_buffer_region = 0;
+int GLAD_WGL_ARB_context_flush_control = 0;
+int GLAD_WGL_ARB_create_context = 0;
+int GLAD_WGL_ARB_create_context_no_error = 0;
+int GLAD_WGL_ARB_create_context_profile = 0;
+int GLAD_WGL_ARB_create_context_robustness = 0;
+int GLAD_WGL_ARB_extensions_string = 0;
+int GLAD_WGL_ARB_framebuffer_sRGB = 0;
+int GLAD_WGL_ARB_make_current_read = 0;
+int GLAD_WGL_ARB_multisample = 0;
+int GLAD_WGL_ARB_pbuffer = 0;
+int GLAD_WGL_ARB_pixel_format = 0;
+int GLAD_WGL_ARB_pixel_format_float = 0;
+int GLAD_WGL_ARB_render_texture = 0;
+int GLAD_WGL_ARB_robustness_application_isolation = 0;
+int GLAD_WGL_ARB_robustness_share_group_isolation = 0;
+int GLAD_WGL_ATI_pixel_format_float = 0;
+int GLAD_WGL_ATI_render_texture_rectangle = 0;
+int GLAD_WGL_EXT_colorspace = 0;
+int GLAD_WGL_EXT_create_context_es2_profile = 0;
+int GLAD_WGL_EXT_create_context_es_profile = 0;
+int GLAD_WGL_EXT_depth_float = 0;
+int GLAD_WGL_EXT_display_color_table = 0;
+int GLAD_WGL_EXT_extensions_string = 0;
+int GLAD_WGL_EXT_framebuffer_sRGB = 0;
+int GLAD_WGL_EXT_make_current_read = 0;
+int GLAD_WGL_EXT_multisample = 0;
+int GLAD_WGL_EXT_pbuffer = 0;
+int GLAD_WGL_EXT_pixel_format = 0;
+int GLAD_WGL_EXT_pixel_format_packed_float = 0;
+int GLAD_WGL_EXT_swap_control = 0;
+int GLAD_WGL_EXT_swap_control_tear = 0;
+int GLAD_WGL_I3D_digital_video_control = 0;
+int GLAD_WGL_I3D_gamma = 0;
+int GLAD_WGL_I3D_genlock = 0;
+int GLAD_WGL_I3D_image_buffer = 0;
+int GLAD_WGL_I3D_swap_frame_lock = 0;
+int GLAD_WGL_I3D_swap_frame_usage = 0;
+int GLAD_WGL_NV_DX_interop = 0;
+int GLAD_WGL_NV_DX_interop2 = 0;
+int GLAD_WGL_NV_copy_image = 0;
+int GLAD_WGL_NV_delay_before_swap = 0;
+int GLAD_WGL_NV_float_buffer = 0;
+int GLAD_WGL_NV_gpu_affinity = 0;
+int GLAD_WGL_NV_multigpu_context = 0;
+int GLAD_WGL_NV_multisample_coverage = 0;
+int GLAD_WGL_NV_present_video = 0;
+int GLAD_WGL_NV_render_depth_texture = 0;
+int GLAD_WGL_NV_render_texture_rectangle = 0;
+int GLAD_WGL_NV_swap_group = 0;
+int GLAD_WGL_NV_vertex_array_range = 0;
+int GLAD_WGL_NV_video_capture = 0;
+int GLAD_WGL_NV_video_output = 0;
+int GLAD_WGL_OML_sync_control = 0;
+PFNWGLSETSTEREOEMITTERSTATE3DLPROC glad_wglSetStereoEmitterState3DL = NULL;
+PFNWGLGETGPUIDSAMDPROC glad_wglGetGPUIDsAMD = NULL;
+PFNWGLGETGPUINFOAMDPROC glad_wglGetGPUInfoAMD = NULL;
+PFNWGLGETCONTEXTGPUIDAMDPROC glad_wglGetContextGPUIDAMD = NULL;
+PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC glad_wglCreateAssociatedContextAMD = NULL;
+PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC glad_wglCreateAssociatedContextAttribsAMD = NULL;
+PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC glad_wglDeleteAssociatedContextAMD = NULL;
+PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC glad_wglMakeAssociatedContextCurrentAMD = NULL;
+PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC glad_wglGetCurrentAssociatedContextAMD = NULL;
+PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC glad_wglBlitContextFramebufferAMD = NULL;
+PFNWGLCREATEBUFFERREGIONARBPROC glad_wglCreateBufferRegionARB = NULL;
+PFNWGLDELETEBUFFERREGIONARBPROC glad_wglDeleteBufferRegionARB = NULL;
+PFNWGLSAVEBUFFERREGIONARBPROC glad_wglSaveBufferRegionARB = NULL;
+PFNWGLRESTOREBUFFERREGIONARBPROC glad_wglRestoreBufferRegionARB = NULL;
+PFNWGLCREATECONTEXTATTRIBSARBPROC glad_wglCreateContextAttribsARB = NULL;
+PFNWGLGETEXTENSIONSSTRINGARBPROC glad_wglGetExtensionsStringARB = NULL;
+PFNWGLMAKECONTEXTCURRENTARBPROC glad_wglMakeContextCurrentARB = NULL;
+PFNWGLGETCURRENTREADDCARBPROC glad_wglGetCurrentReadDCARB = NULL;
+PFNWGLCREATEPBUFFERARBPROC glad_wglCreatePbufferARB = NULL;
+PFNWGLGETPBUFFERDCARBPROC glad_wglGetPbufferDCARB = NULL;
+PFNWGLRELEASEPBUFFERDCARBPROC glad_wglReleasePbufferDCARB = NULL;
+PFNWGLDESTROYPBUFFERARBPROC glad_wglDestroyPbufferARB = NULL;
+PFNWGLQUERYPBUFFERARBPROC glad_wglQueryPbufferARB = NULL;
+PFNWGLGETPIXELFORMATATTRIBIVARBPROC glad_wglGetPixelFormatAttribivARB = NULL;
+PFNWGLGETPIXELFORMATATTRIBFVARBPROC glad_wglGetPixelFormatAttribfvARB = NULL;
+PFNWGLCHOOSEPIXELFORMATARBPROC glad_wglChoosePixelFormatARB = NULL;
+PFNWGLBINDTEXIMAGEARBPROC glad_wglBindTexImageARB = NULL;
+PFNWGLRELEASETEXIMAGEARBPROC glad_wglReleaseTexImageARB = NULL;
+PFNWGLSETPBUFFERATTRIBARBPROC glad_wglSetPbufferAttribARB = NULL;
+PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC glad_wglCreateDisplayColorTableEXT = NULL;
+PFNWGLLOADDISPLAYCOLORTABLEEXTPROC glad_wglLoadDisplayColorTableEXT = NULL;
+PFNWGLBINDDISPLAYCOLORTABLEEXTPROC glad_wglBindDisplayColorTableEXT = NULL;
+PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC glad_wglDestroyDisplayColorTableEXT = NULL;
+PFNWGLGETEXTENSIONSSTRINGEXTPROC glad_wglGetExtensionsStringEXT = NULL;
+PFNWGLMAKECONTEXTCURRENTEXTPROC glad_wglMakeContextCurrentEXT = NULL;
+PFNWGLGETCURRENTREADDCEXTPROC glad_wglGetCurrentReadDCEXT = NULL;
+PFNWGLCREATEPBUFFEREXTPROC glad_wglCreatePbufferEXT = NULL;
+PFNWGLGETPBUFFERDCEXTPROC glad_wglGetPbufferDCEXT = NULL;
+PFNWGLRELEASEPBUFFERDCEXTPROC glad_wglReleasePbufferDCEXT = NULL;
+PFNWGLDESTROYPBUFFEREXTPROC glad_wglDestroyPbufferEXT = NULL;
+PFNWGLQUERYPBUFFEREXTPROC glad_wglQueryPbufferEXT = NULL;
+PFNWGLGETPIXELFORMATATTRIBIVEXTPROC glad_wglGetPixelFormatAttribivEXT = NULL;
+PFNWGLGETPIXELFORMATATTRIBFVEXTPROC glad_wglGetPixelFormatAttribfvEXT = NULL;
+PFNWGLCHOOSEPIXELFORMATEXTPROC glad_wglChoosePixelFormatEXT = NULL;
+PFNWGLSWAPINTERVALEXTPROC glad_wglSwapIntervalEXT = NULL;
+PFNWGLGETSWAPINTERVALEXTPROC glad_wglGetSwapIntervalEXT = NULL;
+PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC glad_wglGetDigitalVideoParametersI3D = NULL;
+PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC glad_wglSetDigitalVideoParametersI3D = NULL;
+PFNWGLGETGAMMATABLEPARAMETERSI3DPROC glad_wglGetGammaTableParametersI3D = NULL;
+PFNWGLSETGAMMATABLEPARAMETERSI3DPROC glad_wglSetGammaTableParametersI3D = NULL;
+PFNWGLGETGAMMATABLEI3DPROC glad_wglGetGammaTableI3D = NULL;
+PFNWGLSETGAMMATABLEI3DPROC glad_wglSetGammaTableI3D = NULL;
+PFNWGLENABLEGENLOCKI3DPROC glad_wglEnableGenlockI3D = NULL;
+PFNWGLDISABLEGENLOCKI3DPROC glad_wglDisableGenlockI3D = NULL;
+PFNWGLISENABLEDGENLOCKI3DPROC glad_wglIsEnabledGenlockI3D = NULL;
+PFNWGLGENLOCKSOURCEI3DPROC glad_wglGenlockSourceI3D = NULL;
+PFNWGLGETGENLOCKSOURCEI3DPROC glad_wglGetGenlockSourceI3D = NULL;
+PFNWGLGENLOCKSOURCEEDGEI3DPROC glad_wglGenlockSourceEdgeI3D = NULL;
+PFNWGLGETGENLOCKSOURCEEDGEI3DPROC glad_wglGetGenlockSourceEdgeI3D = NULL;
+PFNWGLGENLOCKSAMPLERATEI3DPROC glad_wglGenlockSampleRateI3D = NULL;
+PFNWGLGETGENLOCKSAMPLERATEI3DPROC glad_wglGetGenlockSampleRateI3D = NULL;
+PFNWGLGENLOCKSOURCEDELAYI3DPROC glad_wglGenlockSourceDelayI3D = NULL;
+PFNWGLGETGENLOCKSOURCEDELAYI3DPROC glad_wglGetGenlockSourceDelayI3D = NULL;
+PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC glad_wglQueryGenlockMaxSourceDelayI3D = NULL;
+PFNWGLCREATEIMAGEBUFFERI3DPROC glad_wglCreateImageBufferI3D = NULL;
+PFNWGLDESTROYIMAGEBUFFERI3DPROC glad_wglDestroyImageBufferI3D = NULL;
+PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC glad_wglAssociateImageBufferEventsI3D = NULL;
+PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC glad_wglReleaseImageBufferEventsI3D = NULL;
+PFNWGLENABLEFRAMELOCKI3DPROC glad_wglEnableFrameLockI3D = NULL;
+PFNWGLDISABLEFRAMELOCKI3DPROC glad_wglDisableFrameLockI3D = NULL;
+PFNWGLISENABLEDFRAMELOCKI3DPROC glad_wglIsEnabledFrameLockI3D = NULL;
+PFNWGLQUERYFRAMELOCKMASTERI3DPROC glad_wglQueryFrameLockMasterI3D = NULL;
+PFNWGLGETFRAMEUSAGEI3DPROC glad_wglGetFrameUsageI3D = NULL;
+PFNWGLBEGINFRAMETRACKINGI3DPROC glad_wglBeginFrameTrackingI3D = NULL;
+PFNWGLENDFRAMETRACKINGI3DPROC glad_wglEndFrameTrackingI3D = NULL;
+PFNWGLQUERYFRAMETRACKINGI3DPROC glad_wglQueryFrameTrackingI3D = NULL;
+PFNWGLDXSETRESOURCESHAREHANDLENVPROC glad_wglDXSetResourceShareHandleNV = NULL;
+PFNWGLDXOPENDEVICENVPROC glad_wglDXOpenDeviceNV = NULL;
+PFNWGLDXCLOSEDEVICENVPROC glad_wglDXCloseDeviceNV = NULL;
+PFNWGLDXREGISTEROBJECTNVPROC glad_wglDXRegisterObjectNV = NULL;
+PFNWGLDXUNREGISTEROBJECTNVPROC glad_wglDXUnregisterObjectNV = NULL;
+PFNWGLDXOBJECTACCESSNVPROC glad_wglDXObjectAccessNV = NULL;
+PFNWGLDXLOCKOBJECTSNVPROC glad_wglDXLockObjectsNV = NULL;
+PFNWGLDXUNLOCKOBJECTSNVPROC glad_wglDXUnlockObjectsNV = NULL;
+PFNWGLCOPYIMAGESUBDATANVPROC glad_wglCopyImageSubDataNV = NULL;
+PFNWGLDELAYBEFORESWAPNVPROC glad_wglDelayBeforeSwapNV = NULL;
+PFNWGLENUMGPUSNVPROC glad_wglEnumGpusNV = NULL;
+PFNWGLENUMGPUDEVICESNVPROC glad_wglEnumGpuDevicesNV = NULL;
+PFNWGLCREATEAFFINITYDCNVPROC glad_wglCreateAffinityDCNV = NULL;
+PFNWGLENUMGPUSFROMAFFINITYDCNVPROC glad_wglEnumGpusFromAffinityDCNV = NULL;
+PFNWGLDELETEDCNVPROC glad_wglDeleteDCNV = NULL;
+PFNWGLENUMERATEVIDEODEVICESNVPROC glad_wglEnumerateVideoDevicesNV = NULL;
+PFNWGLBINDVIDEODEVICENVPROC glad_wglBindVideoDeviceNV = NULL;
+PFNWGLQUERYCURRENTCONTEXTNVPROC glad_wglQueryCurrentContextNV = NULL;
+PFNWGLJOINSWAPGROUPNVPROC glad_wglJoinSwapGroupNV = NULL;
+PFNWGLBINDSWAPBARRIERNVPROC glad_wglBindSwapBarrierNV = NULL;
+PFNWGLQUERYSWAPGROUPNVPROC glad_wglQuerySwapGroupNV = NULL;
+PFNWGLQUERYMAXSWAPGROUPSNVPROC glad_wglQueryMaxSwapGroupsNV = NULL;
+PFNWGLQUERYFRAMECOUNTNVPROC glad_wglQueryFrameCountNV = NULL;
+PFNWGLRESETFRAMECOUNTNVPROC glad_wglResetFrameCountNV = NULL;
+PFNWGLALLOCATEMEMORYNVPROC glad_wglAllocateMemoryNV = NULL;
+PFNWGLFREEMEMORYNVPROC glad_wglFreeMemoryNV = NULL;
+PFNWGLBINDVIDEOCAPTUREDEVICENVPROC glad_wglBindVideoCaptureDeviceNV = NULL;
+PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC glad_wglEnumerateVideoCaptureDevicesNV = NULL;
+PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC glad_wglLockVideoCaptureDeviceNV = NULL;
+PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC glad_wglQueryVideoCaptureDeviceNV = NULL;
+PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC glad_wglReleaseVideoCaptureDeviceNV = NULL;
+PFNWGLGETVIDEODEVICENVPROC glad_wglGetVideoDeviceNV = NULL;
+PFNWGLRELEASEVIDEODEVICENVPROC glad_wglReleaseVideoDeviceNV = NULL;
+PFNWGLBINDVIDEOIMAGENVPROC glad_wglBindVideoImageNV = NULL;
+PFNWGLRELEASEVIDEOIMAGENVPROC glad_wglReleaseVideoImageNV = NULL;
+PFNWGLSENDPBUFFERTOVIDEONVPROC glad_wglSendPbufferToVideoNV = NULL;
+PFNWGLGETVIDEOINFONVPROC glad_wglGetVideoInfoNV = NULL;
+PFNWGLGETSYNCVALUESOMLPROC glad_wglGetSyncValuesOML = NULL;
+PFNWGLGETMSCRATEOMLPROC glad_wglGetMscRateOML = NULL;
+PFNWGLSWAPBUFFERSMSCOMLPROC glad_wglSwapBuffersMscOML = NULL;
+PFNWGLSWAPLAYERBUFFERSMSCOMLPROC glad_wglSwapLayerBuffersMscOML = NULL;
+PFNWGLWAITFORMSCOMLPROC glad_wglWaitForMscOML = NULL;
+PFNWGLWAITFORSBCOMLPROC glad_wglWaitForSbcOML = NULL;
+static void load_WGL_3DL_stereo_control(GLADloadproc load) {
+ if(!GLAD_WGL_3DL_stereo_control) return;
+ glad_wglSetStereoEmitterState3DL = (PFNWGLSETSTEREOEMITTERSTATE3DLPROC)load("wglSetStereoEmitterState3DL");
+}
+static void load_WGL_AMD_gpu_association(GLADloadproc load) {
+ if(!GLAD_WGL_AMD_gpu_association) return;
+ glad_wglGetGPUIDsAMD = (PFNWGLGETGPUIDSAMDPROC)load("wglGetGPUIDsAMD");
+ glad_wglGetGPUInfoAMD = (PFNWGLGETGPUINFOAMDPROC)load("wglGetGPUInfoAMD");
+ glad_wglGetContextGPUIDAMD = (PFNWGLGETCONTEXTGPUIDAMDPROC)load("wglGetContextGPUIDAMD");
+ glad_wglCreateAssociatedContextAMD = (PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC)load("wglCreateAssociatedContextAMD");
+ glad_wglCreateAssociatedContextAttribsAMD = (PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC)load("wglCreateAssociatedContextAttribsAMD");
+ glad_wglDeleteAssociatedContextAMD = (PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC)load("wglDeleteAssociatedContextAMD");
+ glad_wglMakeAssociatedContextCurrentAMD = (PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC)load("wglMakeAssociatedContextCurrentAMD");
+ glad_wglGetCurrentAssociatedContextAMD = (PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC)load("wglGetCurrentAssociatedContextAMD");
+ glad_wglBlitContextFramebufferAMD = (PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC)load("wglBlitContextFramebufferAMD");
+}
+static void load_WGL_ARB_buffer_region(GLADloadproc load) {
+ if(!GLAD_WGL_ARB_buffer_region) return;
+ glad_wglCreateBufferRegionARB = (PFNWGLCREATEBUFFERREGIONARBPROC)load("wglCreateBufferRegionARB");
+ glad_wglDeleteBufferRegionARB = (PFNWGLDELETEBUFFERREGIONARBPROC)load("wglDeleteBufferRegionARB");
+ glad_wglSaveBufferRegionARB = (PFNWGLSAVEBUFFERREGIONARBPROC)load("wglSaveBufferRegionARB");
+ glad_wglRestoreBufferRegionARB = (PFNWGLRESTOREBUFFERREGIONARBPROC)load("wglRestoreBufferRegionARB");
+}
+static void load_WGL_ARB_create_context(GLADloadproc load) {
+ if(!GLAD_WGL_ARB_create_context) return;
+ glad_wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)load("wglCreateContextAttribsARB");
+}
+static void load_WGL_ARB_extensions_string(GLADloadproc load) {
+ if(!GLAD_WGL_ARB_extensions_string) return;
+ glad_wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)load("wglGetExtensionsStringARB");
+}
+static void load_WGL_ARB_make_current_read(GLADloadproc load) {
+ if(!GLAD_WGL_ARB_make_current_read) return;
+ glad_wglMakeContextCurrentARB = (PFNWGLMAKECONTEXTCURRENTARBPROC)load("wglMakeContextCurrentARB");
+ glad_wglGetCurrentReadDCARB = (PFNWGLGETCURRENTREADDCARBPROC)load("wglGetCurrentReadDCARB");
+}
+static void load_WGL_ARB_pbuffer(GLADloadproc load) {
+ if(!GLAD_WGL_ARB_pbuffer) return;
+ glad_wglCreatePbufferARB = (PFNWGLCREATEPBUFFERARBPROC)load("wglCreatePbufferARB");
+ glad_wglGetPbufferDCARB = (PFNWGLGETPBUFFERDCARBPROC)load("wglGetPbufferDCARB");
+ glad_wglReleasePbufferDCARB = (PFNWGLRELEASEPBUFFERDCARBPROC)load("wglReleasePbufferDCARB");
+ glad_wglDestroyPbufferARB = (PFNWGLDESTROYPBUFFERARBPROC)load("wglDestroyPbufferARB");
+ glad_wglQueryPbufferARB = (PFNWGLQUERYPBUFFERARBPROC)load("wglQueryPbufferARB");
+}
+static void load_WGL_ARB_pixel_format(GLADloadproc load) {
+ if(!GLAD_WGL_ARB_pixel_format) return;
+ glad_wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)load("wglGetPixelFormatAttribivARB");
+ glad_wglGetPixelFormatAttribfvARB = (PFNWGLGETPIXELFORMATATTRIBFVARBPROC)load("wglGetPixelFormatAttribfvARB");
+ glad_wglChoosePixelFormatARB = (PFNWGLCHOOSEPIXELFORMATARBPROC)load("wglChoosePixelFormatARB");
+}
+static void load_WGL_ARB_render_texture(GLADloadproc load) {
+ if(!GLAD_WGL_ARB_render_texture) return;
+ glad_wglBindTexImageARB = (PFNWGLBINDTEXIMAGEARBPROC)load("wglBindTexImageARB");
+ glad_wglReleaseTexImageARB = (PFNWGLRELEASETEXIMAGEARBPROC)load("wglReleaseTexImageARB");
+ glad_wglSetPbufferAttribARB = (PFNWGLSETPBUFFERATTRIBARBPROC)load("wglSetPbufferAttribARB");
+}
+static void load_WGL_EXT_display_color_table(GLADloadproc load) {
+ if(!GLAD_WGL_EXT_display_color_table) return;
+ glad_wglCreateDisplayColorTableEXT = (PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC)load("wglCreateDisplayColorTableEXT");
+ glad_wglLoadDisplayColorTableEXT = (PFNWGLLOADDISPLAYCOLORTABLEEXTPROC)load("wglLoadDisplayColorTableEXT");
+ glad_wglBindDisplayColorTableEXT = (PFNWGLBINDDISPLAYCOLORTABLEEXTPROC)load("wglBindDisplayColorTableEXT");
+ glad_wglDestroyDisplayColorTableEXT = (PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC)load("wglDestroyDisplayColorTableEXT");
+}
+static void load_WGL_EXT_extensions_string(GLADloadproc load) {
+ if(!GLAD_WGL_EXT_extensions_string) return;
+ glad_wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)load("wglGetExtensionsStringEXT");
+}
+static void load_WGL_EXT_make_current_read(GLADloadproc load) {
+ if(!GLAD_WGL_EXT_make_current_read) return;
+ glad_wglMakeContextCurrentEXT = (PFNWGLMAKECONTEXTCURRENTEXTPROC)load("wglMakeContextCurrentEXT");
+ glad_wglGetCurrentReadDCEXT = (PFNWGLGETCURRENTREADDCEXTPROC)load("wglGetCurrentReadDCEXT");
+}
+static void load_WGL_EXT_pbuffer(GLADloadproc load) {
+ if(!GLAD_WGL_EXT_pbuffer) return;
+ glad_wglCreatePbufferEXT = (PFNWGLCREATEPBUFFEREXTPROC)load("wglCreatePbufferEXT");
+ glad_wglGetPbufferDCEXT = (PFNWGLGETPBUFFERDCEXTPROC)load("wglGetPbufferDCEXT");
+ glad_wglReleasePbufferDCEXT = (PFNWGLRELEASEPBUFFERDCEXTPROC)load("wglReleasePbufferDCEXT");
+ glad_wglDestroyPbufferEXT = (PFNWGLDESTROYPBUFFEREXTPROC)load("wglDestroyPbufferEXT");
+ glad_wglQueryPbufferEXT = (PFNWGLQUERYPBUFFEREXTPROC)load("wglQueryPbufferEXT");
+}
+static void load_WGL_EXT_pixel_format(GLADloadproc load) {
+ if(!GLAD_WGL_EXT_pixel_format) return;
+ glad_wglGetPixelFormatAttribivEXT = (PFNWGLGETPIXELFORMATATTRIBIVEXTPROC)load("wglGetPixelFormatAttribivEXT");
+ glad_wglGetPixelFormatAttribfvEXT = (PFNWGLGETPIXELFORMATATTRIBFVEXTPROC)load("wglGetPixelFormatAttribfvEXT");
+ glad_wglChoosePixelFormatEXT = (PFNWGLCHOOSEPIXELFORMATEXTPROC)load("wglChoosePixelFormatEXT");
+}
+static void load_WGL_EXT_swap_control(GLADloadproc load) {
+ if(!GLAD_WGL_EXT_swap_control) return;
+ glad_wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)load("wglSwapIntervalEXT");
+ glad_wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)load("wglGetSwapIntervalEXT");
+}
+static void load_WGL_I3D_digital_video_control(GLADloadproc load) {
+ if(!GLAD_WGL_I3D_digital_video_control) return;
+ glad_wglGetDigitalVideoParametersI3D = (PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC)load("wglGetDigitalVideoParametersI3D");
+ glad_wglSetDigitalVideoParametersI3D = (PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC)load("wglSetDigitalVideoParametersI3D");
+}
+static void load_WGL_I3D_gamma(GLADloadproc load) {
+ if(!GLAD_WGL_I3D_gamma) return;
+ glad_wglGetGammaTableParametersI3D = (PFNWGLGETGAMMATABLEPARAMETERSI3DPROC)load("wglGetGammaTableParametersI3D");
+ glad_wglSetGammaTableParametersI3D = (PFNWGLSETGAMMATABLEPARAMETERSI3DPROC)load("wglSetGammaTableParametersI3D");
+ glad_wglGetGammaTableI3D = (PFNWGLGETGAMMATABLEI3DPROC)load("wglGetGammaTableI3D");
+ glad_wglSetGammaTableI3D = (PFNWGLSETGAMMATABLEI3DPROC)load("wglSetGammaTableI3D");
+}
+static void load_WGL_I3D_genlock(GLADloadproc load) {
+ if(!GLAD_WGL_I3D_genlock) return;
+ glad_wglEnableGenlockI3D = (PFNWGLENABLEGENLOCKI3DPROC)load("wglEnableGenlockI3D");
+ glad_wglDisableGenlockI3D = (PFNWGLDISABLEGENLOCKI3DPROC)load("wglDisableGenlockI3D");
+ glad_wglIsEnabledGenlockI3D = (PFNWGLISENABLEDGENLOCKI3DPROC)load("wglIsEnabledGenlockI3D");
+ glad_wglGenlockSourceI3D = (PFNWGLGENLOCKSOURCEI3DPROC)load("wglGenlockSourceI3D");
+ glad_wglGetGenlockSourceI3D = (PFNWGLGETGENLOCKSOURCEI3DPROC)load("wglGetGenlockSourceI3D");
+ glad_wglGenlockSourceEdgeI3D = (PFNWGLGENLOCKSOURCEEDGEI3DPROC)load("wglGenlockSourceEdgeI3D");
+ glad_wglGetGenlockSourceEdgeI3D = (PFNWGLGETGENLOCKSOURCEEDGEI3DPROC)load("wglGetGenlockSourceEdgeI3D");
+ glad_wglGenlockSampleRateI3D = (PFNWGLGENLOCKSAMPLERATEI3DPROC)load("wglGenlockSampleRateI3D");
+ glad_wglGetGenlockSampleRateI3D = (PFNWGLGETGENLOCKSAMPLERATEI3DPROC)load("wglGetGenlockSampleRateI3D");
+ glad_wglGenlockSourceDelayI3D = (PFNWGLGENLOCKSOURCEDELAYI3DPROC)load("wglGenlockSourceDelayI3D");
+ glad_wglGetGenlockSourceDelayI3D = (PFNWGLGETGENLOCKSOURCEDELAYI3DPROC)load("wglGetGenlockSourceDelayI3D");
+ glad_wglQueryGenlockMaxSourceDelayI3D = (PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC)load("wglQueryGenlockMaxSourceDelayI3D");
+}
+static void load_WGL_I3D_image_buffer(GLADloadproc load) {
+ if(!GLAD_WGL_I3D_image_buffer) return;
+ glad_wglCreateImageBufferI3D = (PFNWGLCREATEIMAGEBUFFERI3DPROC)load("wglCreateImageBufferI3D");
+ glad_wglDestroyImageBufferI3D = (PFNWGLDESTROYIMAGEBUFFERI3DPROC)load("wglDestroyImageBufferI3D");
+ glad_wglAssociateImageBufferEventsI3D = (PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC)load("wglAssociateImageBufferEventsI3D");
+ glad_wglReleaseImageBufferEventsI3D = (PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC)load("wglReleaseImageBufferEventsI3D");
+}
+static void load_WGL_I3D_swap_frame_lock(GLADloadproc load) {
+ if(!GLAD_WGL_I3D_swap_frame_lock) return;
+ glad_wglEnableFrameLockI3D = (PFNWGLENABLEFRAMELOCKI3DPROC)load("wglEnableFrameLockI3D");
+ glad_wglDisableFrameLockI3D = (PFNWGLDISABLEFRAMELOCKI3DPROC)load("wglDisableFrameLockI3D");
+ glad_wglIsEnabledFrameLockI3D = (PFNWGLISENABLEDFRAMELOCKI3DPROC)load("wglIsEnabledFrameLockI3D");
+ glad_wglQueryFrameLockMasterI3D = (PFNWGLQUERYFRAMELOCKMASTERI3DPROC)load("wglQueryFrameLockMasterI3D");
+}
+static void load_WGL_I3D_swap_frame_usage(GLADloadproc load) {
+ if(!GLAD_WGL_I3D_swap_frame_usage) return;
+ glad_wglGetFrameUsageI3D = (PFNWGLGETFRAMEUSAGEI3DPROC)load("wglGetFrameUsageI3D");
+ glad_wglBeginFrameTrackingI3D = (PFNWGLBEGINFRAMETRACKINGI3DPROC)load("wglBeginFrameTrackingI3D");
+ glad_wglEndFrameTrackingI3D = (PFNWGLENDFRAMETRACKINGI3DPROC)load("wglEndFrameTrackingI3D");
+ glad_wglQueryFrameTrackingI3D = (PFNWGLQUERYFRAMETRACKINGI3DPROC)load("wglQueryFrameTrackingI3D");
+}
+static void load_WGL_NV_DX_interop(GLADloadproc load) {
+ if(!GLAD_WGL_NV_DX_interop) return;
+ glad_wglDXSetResourceShareHandleNV = (PFNWGLDXSETRESOURCESHAREHANDLENVPROC)load("wglDXSetResourceShareHandleNV");
+ glad_wglDXOpenDeviceNV = (PFNWGLDXOPENDEVICENVPROC)load("wglDXOpenDeviceNV");
+ glad_wglDXCloseDeviceNV = (PFNWGLDXCLOSEDEVICENVPROC)load("wglDXCloseDeviceNV");
+ glad_wglDXRegisterObjectNV = (PFNWGLDXREGISTEROBJECTNVPROC)load("wglDXRegisterObjectNV");
+ glad_wglDXUnregisterObjectNV = (PFNWGLDXUNREGISTEROBJECTNVPROC)load("wglDXUnregisterObjectNV");
+ glad_wglDXObjectAccessNV = (PFNWGLDXOBJECTACCESSNVPROC)load("wglDXObjectAccessNV");
+ glad_wglDXLockObjectsNV = (PFNWGLDXLOCKOBJECTSNVPROC)load("wglDXLockObjectsNV");
+ glad_wglDXUnlockObjectsNV = (PFNWGLDXUNLOCKOBJECTSNVPROC)load("wglDXUnlockObjectsNV");
+}
+static void load_WGL_NV_copy_image(GLADloadproc load) {
+ if(!GLAD_WGL_NV_copy_image) return;
+ glad_wglCopyImageSubDataNV = (PFNWGLCOPYIMAGESUBDATANVPROC)load("wglCopyImageSubDataNV");
+}
+static void load_WGL_NV_delay_before_swap(GLADloadproc load) {
+ if(!GLAD_WGL_NV_delay_before_swap) return;
+ glad_wglDelayBeforeSwapNV = (PFNWGLDELAYBEFORESWAPNVPROC)load("wglDelayBeforeSwapNV");
+}
+static void load_WGL_NV_gpu_affinity(GLADloadproc load) {
+ if(!GLAD_WGL_NV_gpu_affinity) return;
+ glad_wglEnumGpusNV = (PFNWGLENUMGPUSNVPROC)load("wglEnumGpusNV");
+ glad_wglEnumGpuDevicesNV = (PFNWGLENUMGPUDEVICESNVPROC)load("wglEnumGpuDevicesNV");
+ glad_wglCreateAffinityDCNV = (PFNWGLCREATEAFFINITYDCNVPROC)load("wglCreateAffinityDCNV");
+ glad_wglEnumGpusFromAffinityDCNV = (PFNWGLENUMGPUSFROMAFFINITYDCNVPROC)load("wglEnumGpusFromAffinityDCNV");
+ glad_wglDeleteDCNV = (PFNWGLDELETEDCNVPROC)load("wglDeleteDCNV");
+}
+static void load_WGL_NV_present_video(GLADloadproc load) {
+ if(!GLAD_WGL_NV_present_video) return;
+ glad_wglEnumerateVideoDevicesNV = (PFNWGLENUMERATEVIDEODEVICESNVPROC)load("wglEnumerateVideoDevicesNV");
+ glad_wglBindVideoDeviceNV = (PFNWGLBINDVIDEODEVICENVPROC)load("wglBindVideoDeviceNV");
+ glad_wglQueryCurrentContextNV = (PFNWGLQUERYCURRENTCONTEXTNVPROC)load("wglQueryCurrentContextNV");
+}
+static void load_WGL_NV_swap_group(GLADloadproc load) {
+ if(!GLAD_WGL_NV_swap_group) return;
+ glad_wglJoinSwapGroupNV = (PFNWGLJOINSWAPGROUPNVPROC)load("wglJoinSwapGroupNV");
+ glad_wglBindSwapBarrierNV = (PFNWGLBINDSWAPBARRIERNVPROC)load("wglBindSwapBarrierNV");
+ glad_wglQuerySwapGroupNV = (PFNWGLQUERYSWAPGROUPNVPROC)load("wglQuerySwapGroupNV");
+ glad_wglQueryMaxSwapGroupsNV = (PFNWGLQUERYMAXSWAPGROUPSNVPROC)load("wglQueryMaxSwapGroupsNV");
+ glad_wglQueryFrameCountNV = (PFNWGLQUERYFRAMECOUNTNVPROC)load("wglQueryFrameCountNV");
+ glad_wglResetFrameCountNV = (PFNWGLRESETFRAMECOUNTNVPROC)load("wglResetFrameCountNV");
+}
+static void load_WGL_NV_vertex_array_range(GLADloadproc load) {
+ if(!GLAD_WGL_NV_vertex_array_range) return;
+ glad_wglAllocateMemoryNV = (PFNWGLALLOCATEMEMORYNVPROC)load("wglAllocateMemoryNV");
+ glad_wglFreeMemoryNV = (PFNWGLFREEMEMORYNVPROC)load("wglFreeMemoryNV");
+}
+static void load_WGL_NV_video_capture(GLADloadproc load) {
+ if(!GLAD_WGL_NV_video_capture) return;
+ glad_wglBindVideoCaptureDeviceNV = (PFNWGLBINDVIDEOCAPTUREDEVICENVPROC)load("wglBindVideoCaptureDeviceNV");
+ glad_wglEnumerateVideoCaptureDevicesNV = (PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC)load("wglEnumerateVideoCaptureDevicesNV");
+ glad_wglLockVideoCaptureDeviceNV = (PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC)load("wglLockVideoCaptureDeviceNV");
+ glad_wglQueryVideoCaptureDeviceNV = (PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC)load("wglQueryVideoCaptureDeviceNV");
+ glad_wglReleaseVideoCaptureDeviceNV = (PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC)load("wglReleaseVideoCaptureDeviceNV");
+}
+static void load_WGL_NV_video_output(GLADloadproc load) {
+ if(!GLAD_WGL_NV_video_output) return;
+ glad_wglGetVideoDeviceNV = (PFNWGLGETVIDEODEVICENVPROC)load("wglGetVideoDeviceNV");
+ glad_wglReleaseVideoDeviceNV = (PFNWGLRELEASEVIDEODEVICENVPROC)load("wglReleaseVideoDeviceNV");
+ glad_wglBindVideoImageNV = (PFNWGLBINDVIDEOIMAGENVPROC)load("wglBindVideoImageNV");
+ glad_wglReleaseVideoImageNV = (PFNWGLRELEASEVIDEOIMAGENVPROC)load("wglReleaseVideoImageNV");
+ glad_wglSendPbufferToVideoNV = (PFNWGLSENDPBUFFERTOVIDEONVPROC)load("wglSendPbufferToVideoNV");
+ glad_wglGetVideoInfoNV = (PFNWGLGETVIDEOINFONVPROC)load("wglGetVideoInfoNV");
+}
+static void load_WGL_OML_sync_control(GLADloadproc load) {
+ if(!GLAD_WGL_OML_sync_control) return;
+ glad_wglGetSyncValuesOML = (PFNWGLGETSYNCVALUESOMLPROC)load("wglGetSyncValuesOML");
+ glad_wglGetMscRateOML = (PFNWGLGETMSCRATEOMLPROC)load("wglGetMscRateOML");
+ glad_wglSwapBuffersMscOML = (PFNWGLSWAPBUFFERSMSCOMLPROC)load("wglSwapBuffersMscOML");
+ glad_wglSwapLayerBuffersMscOML = (PFNWGLSWAPLAYERBUFFERSMSCOMLPROC)load("wglSwapLayerBuffersMscOML");
+ glad_wglWaitForMscOML = (PFNWGLWAITFORMSCOMLPROC)load("wglWaitForMscOML");
+ glad_wglWaitForSbcOML = (PFNWGLWAITFORSBCOMLPROC)load("wglWaitForSbcOML");
+}
+static int find_extensionsWGL(void) {
+ if (!get_exts()) return 0;
+ GLAD_WGL_3DFX_multisample = has_ext("WGL_3DFX_multisample");
+ GLAD_WGL_3DL_stereo_control = has_ext("WGL_3DL_stereo_control");
+ GLAD_WGL_AMD_gpu_association = has_ext("WGL_AMD_gpu_association");
+ GLAD_WGL_ARB_buffer_region = has_ext("WGL_ARB_buffer_region");
+ GLAD_WGL_ARB_context_flush_control = has_ext("WGL_ARB_context_flush_control");
+ GLAD_WGL_ARB_create_context = has_ext("WGL_ARB_create_context");
+ GLAD_WGL_ARB_create_context_no_error = has_ext("WGL_ARB_create_context_no_error");
+ GLAD_WGL_ARB_create_context_profile = has_ext("WGL_ARB_create_context_profile");
+ GLAD_WGL_ARB_create_context_robustness = has_ext("WGL_ARB_create_context_robustness");
+ GLAD_WGL_ARB_extensions_string = has_ext("WGL_ARB_extensions_string");
+ GLAD_WGL_ARB_framebuffer_sRGB = has_ext("WGL_ARB_framebuffer_sRGB");
+ GLAD_WGL_ARB_make_current_read = has_ext("WGL_ARB_make_current_read");
+ GLAD_WGL_ARB_multisample = has_ext("WGL_ARB_multisample");
+ GLAD_WGL_ARB_pbuffer = has_ext("WGL_ARB_pbuffer");
+ GLAD_WGL_ARB_pixel_format = has_ext("WGL_ARB_pixel_format");
+ GLAD_WGL_ARB_pixel_format_float = has_ext("WGL_ARB_pixel_format_float");
+ GLAD_WGL_ARB_render_texture = has_ext("WGL_ARB_render_texture");
+ GLAD_WGL_ARB_robustness_application_isolation = has_ext("WGL_ARB_robustness_application_isolation");
+ GLAD_WGL_ARB_robustness_share_group_isolation = has_ext("WGL_ARB_robustness_share_group_isolation");
+ GLAD_WGL_ATI_pixel_format_float = has_ext("WGL_ATI_pixel_format_float");
+ GLAD_WGL_ATI_render_texture_rectangle = has_ext("WGL_ATI_render_texture_rectangle");
+ GLAD_WGL_EXT_colorspace = has_ext("WGL_EXT_colorspace");
+ GLAD_WGL_EXT_create_context_es2_profile = has_ext("WGL_EXT_create_context_es2_profile");
+ GLAD_WGL_EXT_create_context_es_profile = has_ext("WGL_EXT_create_context_es_profile");
+ GLAD_WGL_EXT_depth_float = has_ext("WGL_EXT_depth_float");
+ GLAD_WGL_EXT_display_color_table = has_ext("WGL_EXT_display_color_table");
+ GLAD_WGL_EXT_extensions_string = has_ext("WGL_EXT_extensions_string");
+ GLAD_WGL_EXT_framebuffer_sRGB = has_ext("WGL_EXT_framebuffer_sRGB");
+ GLAD_WGL_EXT_make_current_read = has_ext("WGL_EXT_make_current_read");
+ GLAD_WGL_EXT_multisample = has_ext("WGL_EXT_multisample");
+ GLAD_WGL_EXT_pbuffer = has_ext("WGL_EXT_pbuffer");
+ GLAD_WGL_EXT_pixel_format = has_ext("WGL_EXT_pixel_format");
+ GLAD_WGL_EXT_pixel_format_packed_float = has_ext("WGL_EXT_pixel_format_packed_float");
+ GLAD_WGL_EXT_swap_control = has_ext("WGL_EXT_swap_control");
+ GLAD_WGL_EXT_swap_control_tear = has_ext("WGL_EXT_swap_control_tear");
+ GLAD_WGL_I3D_digital_video_control = has_ext("WGL_I3D_digital_video_control");
+ GLAD_WGL_I3D_gamma = has_ext("WGL_I3D_gamma");
+ GLAD_WGL_I3D_genlock = has_ext("WGL_I3D_genlock");
+ GLAD_WGL_I3D_image_buffer = has_ext("WGL_I3D_image_buffer");
+ GLAD_WGL_I3D_swap_frame_lock = has_ext("WGL_I3D_swap_frame_lock");
+ GLAD_WGL_I3D_swap_frame_usage = has_ext("WGL_I3D_swap_frame_usage");
+ GLAD_WGL_NV_DX_interop = has_ext("WGL_NV_DX_interop");
+ GLAD_WGL_NV_DX_interop2 = has_ext("WGL_NV_DX_interop2");
+ GLAD_WGL_NV_copy_image = has_ext("WGL_NV_copy_image");
+ GLAD_WGL_NV_delay_before_swap = has_ext("WGL_NV_delay_before_swap");
+ GLAD_WGL_NV_float_buffer = has_ext("WGL_NV_float_buffer");
+ GLAD_WGL_NV_gpu_affinity = has_ext("WGL_NV_gpu_affinity");
+ GLAD_WGL_NV_multigpu_context = has_ext("WGL_NV_multigpu_context");
+ GLAD_WGL_NV_multisample_coverage = has_ext("WGL_NV_multisample_coverage");
+ GLAD_WGL_NV_present_video = has_ext("WGL_NV_present_video");
+ GLAD_WGL_NV_render_depth_texture = has_ext("WGL_NV_render_depth_texture");
+ GLAD_WGL_NV_render_texture_rectangle = has_ext("WGL_NV_render_texture_rectangle");
+ GLAD_WGL_NV_swap_group = has_ext("WGL_NV_swap_group");
+ GLAD_WGL_NV_vertex_array_range = has_ext("WGL_NV_vertex_array_range");
+ GLAD_WGL_NV_video_capture = has_ext("WGL_NV_video_capture");
+ GLAD_WGL_NV_video_output = has_ext("WGL_NV_video_output");
+ GLAD_WGL_OML_sync_control = has_ext("WGL_OML_sync_control");
+ free_exts();
+ return 1;
+}
+
+static void find_coreWGL(HDC hdc) {
+ GLADWGLhdc = hdc;
+}
+
+int gladLoadWGLLoader(GLADloadproc load, HDC hdc) {
+ wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)load("wglGetExtensionsStringARB");
+ wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)load("wglGetExtensionsStringEXT");
+ if(wglGetExtensionsStringARB == NULL && wglGetExtensionsStringEXT == NULL) return 0;
+ find_coreWGL(hdc);
+
+ if (!find_extensionsWGL()) return 0;
+ load_WGL_3DL_stereo_control(load);
+ load_WGL_AMD_gpu_association(load);
+ load_WGL_ARB_buffer_region(load);
+ load_WGL_ARB_create_context(load);
+ load_WGL_ARB_extensions_string(load);
+ load_WGL_ARB_make_current_read(load);
+ load_WGL_ARB_pbuffer(load);
+ load_WGL_ARB_pixel_format(load);
+ load_WGL_ARB_render_texture(load);
+ load_WGL_EXT_display_color_table(load);
+ load_WGL_EXT_extensions_string(load);
+ load_WGL_EXT_make_current_read(load);
+ load_WGL_EXT_pbuffer(load);
+ load_WGL_EXT_pixel_format(load);
+ load_WGL_EXT_swap_control(load);
+ load_WGL_I3D_digital_video_control(load);
+ load_WGL_I3D_gamma(load);
+ load_WGL_I3D_genlock(load);
+ load_WGL_I3D_image_buffer(load);
+ load_WGL_I3D_swap_frame_lock(load);
+ load_WGL_I3D_swap_frame_usage(load);
+ load_WGL_NV_DX_interop(load);
+ load_WGL_NV_copy_image(load);
+ load_WGL_NV_delay_before_swap(load);
+ load_WGL_NV_gpu_affinity(load);
+ load_WGL_NV_present_video(load);
+ load_WGL_NV_swap_group(load);
+ load_WGL_NV_vertex_array_range(load);
+ load_WGL_NV_video_capture(load);
+ load_WGL_NV_video_output(load);
+ load_WGL_OML_sync_control(load);
+ return 1;
+}
+
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index c52df7f64..791a47e86 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -25,6 +25,8 @@ add_library(common
fifo_queue.h
file_system.cpp
file_system.h
+ gl/context.cpp
+ gl/context.h
gl/program.cpp
gl/program.h
gl/shader_cache.cpp
@@ -69,6 +71,8 @@ target_link_libraries(common PRIVATE glad libcue Threads::Threads cubeb libchdr)
if(WIN32)
target_sources(common PRIVATE
+ gl/context_wgl.cpp
+ gl/context_wgl.h
d3d11/shader_cache.cpp
d3d11/shader_cache.h
d3d11/shader_compiler.cpp
@@ -87,3 +91,49 @@ endif()
if(ANDROID)
target_link_libraries(common PRIVATE log)
endif()
+
+if(USE_X11)
+ target_sources(common PRIVATE
+ gl/x11_window.cpp
+ gl/x11_window.h
+ )
+ target_compile_definitions(common PRIVATE "-DUSE_X11=1")
+ target_include_directories(common PRIVATE "${X11_INCLUDE_DIR}")
+ target_link_libraries(common PRIVATE "${X11_LIBRARIES}")
+endif()
+
+if(USE_EGL)
+ target_sources(common PRIVATE
+ gl/context_egl.cpp
+ gl/context_egl.h
+ )
+ target_compile_definitions(common PRIVATE "-DUSE_EGL=1")
+
+ if(SUPPORTS_X11)
+ target_sources(common PRIVATE
+ gl/context_egl_x11.cpp
+ gl/context_egl_x11.h
+ )
+ endif()
+ if(ANDROID)
+ target_sources(common PRIVATE
+ gl/context_egl_android.cpp
+ gl/context_egl_android.h
+ )
+ endif()
+endif()
+
+if(SUPPORTS_X11)
+ target_sources(common PRIVATE
+ gl/context_glx.cpp
+ gl/context_glx.h
+ )
+ target_compile_definitions(common PRIVATE "-DUSE_GLX=1")
+endif()
+
+if(APPLE)
+ target_sources(common PRIVATE
+ gl/context_agl.mm
+ gl/context_agl.h
+ )
+endif()
diff --git a/src/common/common.vcxproj b/src/common/common.vcxproj
index b098824f2..4174eb0f9 100644
--- a/src/common/common.vcxproj
+++ b/src/common/common.vcxproj
@@ -52,6 +52,8 @@
+
+
@@ -74,6 +76,7 @@
+
@@ -91,6 +94,8 @@
+
+
diff --git a/src/common/common.vcxproj.filters b/src/common/common.vcxproj.filters
index f709f26c8..b9f894ac8 100644
--- a/src/common/common.vcxproj.filters
+++ b/src/common/common.vcxproj.filters
@@ -58,6 +58,13 @@
+
+ gl
+
+
+ gl
+
+
@@ -111,6 +118,12 @@
gl
+
+ gl
+
+
+ gl
+
diff --git a/src/common/gl/context.cpp b/src/common/gl/context.cpp
new file mode 100644
index 000000000..1e36f96a7
--- /dev/null
+++ b/src/common/gl/context.cpp
@@ -0,0 +1,190 @@
+#include "context.h"
+#include "../log.h"
+#include "glad.h"
+#include
+#ifdef __APPLE__
+#include
+#else
+#include
+#endif
+Log_SetChannel(GL::Context);
+
+#if defined(WIN32)
+#include "context_wgl.h"
+#elif defined(__APPLE__)
+#include "context_agl.h"
+#endif
+
+#ifdef USE_EGL
+#if defined(USE_X11)
+#include "context_egl_x11.h"
+#elif defined(ANDROID)
+#include "context_egl_android.h"
+#else
+#error Unknown EGL platform
+#endif
+#endif
+
+#ifdef USE_GLX
+#include "context_glx.h"
+#endif
+
+namespace GL {
+
+static bool ShouldPreferESContext()
+{
+#ifndef _MSC_VER
+ const char* value = std::getenv("PREFER_GLES_CONTEXT");
+ return (value && std::strcmp(value, "1") == 0);
+#else
+ char buffer[2] = {};
+ size_t buffer_size = sizeof(buffer);
+ getenv_s(&buffer_size, buffer, "PREFER_GLES_CONTEXT");
+ return (std::strcmp(buffer, "1") == 0);
+#endif
+}
+
+Context::Context(const WindowInfo& wi) : m_wi(wi) {}
+
+Context::~Context() = default;
+
+std::unique_ptr Context::Create(const WindowInfo& wi, const Version* versions_to_try,
+ size_t num_versions_to_try)
+{
+ if (ShouldPreferESContext())
+ {
+ // move ES versions to the front
+ Version* new_versions_to_try = static_cast(alloca(sizeof(Version) * num_versions_to_try));
+ size_t count = 0;
+ for (size_t i = 0; i < num_versions_to_try; i++)
+ {
+ if (versions_to_try[i].profile == Profile::ES)
+ new_versions_to_try[count++] = versions_to_try[i];
+ }
+ for (size_t i = 0; i < num_versions_to_try; i++)
+ {
+ if (versions_to_try[i].profile != Profile::ES)
+ new_versions_to_try[count++] = versions_to_try[i];
+ }
+ versions_to_try = new_versions_to_try;
+ }
+
+ std::unique_ptr context;
+#if defined(WIN32)
+ context = ContextWGL::Create(wi, versions_to_try, num_versions_to_try);
+#elif defined(__APPLE__)
+ context = ContextAGL::Create(wi, versions_to_try, num_versions_to_try);
+#else
+ if (wi.type == WindowInfo::Type::X11)
+ {
+#ifdef USE_EGL
+ const char* use_egl_x11 = std::getenv("USE_EGL_X11");
+ if (use_egl_x11 && std::strcmp(use_egl_x11, "1") == 0)
+ context = ContextEGLX11::Create(wi, versions_to_try, num_versions_to_try);
+ else
+ context = ContextGLX::Create(wi, versions_to_try, num_versions_to_try);
+#else
+ context = ContextGLX::Create(wi, versions_to_try, num_versions_to_try);
+#endif
+ }
+#endif
+
+ if (!context)
+ return nullptr;
+
+ Log_InfoPrintf("Created a %s context", context->IsGLES() ? "OpenGL ES" : "OpenGL");
+
+ // TODO: Not thread-safe.
+ static Context* context_being_created;
+ context_being_created = context.get();
+
+ // load up glad
+ if (!context->IsGLES())
+ {
+ if (!gladLoadGLLoader([](const char* name) { return context_being_created->GetProcAddress(name); }))
+ {
+ Log_ErrorPrintf("Failed to load GL functions for GLAD");
+ return nullptr;
+ }
+ }
+ else
+ {
+ if (!gladLoadGLES2Loader([](const char* name) { return context_being_created->GetProcAddress(name); }))
+ {
+ Log_ErrorPrintf("Failed to load GLES functions for GLAD");
+ return nullptr;
+ }
+ }
+
+ const char* gl_vendor = reinterpret_cast(glGetString(GL_VENDOR));
+ const char* gl_renderer = reinterpret_cast(glGetString(GL_RENDERER));
+ const char* gl_version = reinterpret_cast(glGetString(GL_VERSION));
+ Log_InfoPrintf("GL_VENDOR: %s", gl_vendor);
+ Log_InfoPrintf("GL_RENDERER: %s", gl_renderer);
+ Log_InfoPrintf("GL_VERSION: %s", gl_version);
+
+ return context;
+}
+
+const std::array& Context::GetAllDesktopVersionsList()
+{
+ static constexpr std::array vlist = {{{Profile::Core, 4, 6},
+ {Profile::Core, 4, 5},
+ {Profile::Core, 4, 4},
+ {Profile::Core, 4, 3},
+ {Profile::Core, 4, 2},
+ {Profile::Core, 4, 1},
+ {Profile::Core, 4, 0},
+ {Profile::Core, 3, 3},
+ {Profile::Core, 3, 2},
+ {Profile::Core, 3, 1},
+ {Profile::Core, 3, 0}}};
+ return vlist;
+}
+
+const std::array& Context::GetAllDesktopVersionsListWithFallback()
+{
+ static constexpr std::array vlist = {{{Profile::Core, 4, 6},
+ {Profile::Core, 4, 5},
+ {Profile::Core, 4, 4},
+ {Profile::Core, 4, 3},
+ {Profile::Core, 4, 2},
+ {Profile::Core, 4, 1},
+ {Profile::Core, 4, 0},
+ {Profile::Core, 3, 3},
+ {Profile::Core, 3, 2},
+ {Profile::Core, 3, 1},
+ {Profile::Core, 3, 0},
+ {Profile::NoProfile, 0, 0}}};
+ return vlist;
+}
+
+const std::array& Context::GetAllESVersionsList()
+{
+ static constexpr std::array vlist = {
+ {{Profile::ES, 3, 2}, {Profile::ES, 3, 1}, {Profile::ES, 3, 0}, {Profile::ES, 2, 0}}};
+ return vlist;
+}
+
+const std::array& Context::GetAllVersionsList()
+{
+ static constexpr std::array vlist = {{{Profile::Core, 4, 6},
+ {Profile::Core, 4, 5},
+ {Profile::Core, 4, 4},
+ {Profile::Core, 4, 3},
+ {Profile::Core, 4, 2},
+ {Profile::Core, 4, 1},
+ {Profile::Core, 4, 0},
+ {Profile::Core, 3, 3},
+ {Profile::Core, 3, 2},
+ {Profile::Core, 3, 1},
+ {Profile::Core, 3, 0},
+ {Profile::ES, 3, 2},
+ {Profile::ES, 3, 1},
+ {Profile::ES, 3, 0},
+ {Profile::ES, 2, 0},
+ {Profile::NoProfile, 0, 0}}};
+ return vlist;
+}
+
+} // namespace GL
diff --git a/src/common/gl/context.h b/src/common/gl/context.h
new file mode 100644
index 000000000..695ca5df6
--- /dev/null
+++ b/src/common/gl/context.h
@@ -0,0 +1,66 @@
+#pragma once
+#include "../types.h"
+#include "../window_info.h"
+#include
+#include
+
+namespace GL {
+class Context
+{
+public:
+ Context(const WindowInfo& wi);
+ virtual ~Context();
+
+ enum class Profile
+ {
+ NoProfile,
+ Core,
+ ES
+ };
+
+ struct Version
+ {
+ Profile profile;
+ int major_version;
+ int minor_version;
+ };
+
+ ALWAYS_INLINE const WindowInfo& GetWindowInfo() const { return m_wi; }
+ ALWAYS_INLINE bool IsGLES() const { return (m_version.profile == Profile::ES); }
+ ALWAYS_INLINE u32 GetSurfaceWidth() const { return m_wi.surface_width; }
+ ALWAYS_INLINE u32 GetSurfaceHeight() const { return m_wi.surface_height; }
+ ALWAYS_INLINE WindowInfo::SurfaceFormat GetSurfaceFormat() const { return m_wi.surface_format; }
+
+ virtual void* GetProcAddress(const char* name) = 0;
+ virtual bool ChangeSurface(const WindowInfo& new_wi) = 0;
+ virtual void ResizeSurface(u32 new_surface_width = 0, u32 new_surface_height = 0) = 0;
+ virtual bool SwapBuffers() = 0;
+ virtual bool MakeCurrent() = 0;
+ virtual bool DoneCurrent() = 0;
+ virtual bool SetSwapInterval(s32 interval) = 0;
+ virtual std::unique_ptr CreateSharedContext(const WindowInfo& wi) = 0;
+
+ static std::unique_ptr Create(const WindowInfo& wi, const Version* versions_to_try,
+ size_t num_versions_to_try);
+
+ template
+ static std::unique_ptr Create(const WindowInfo& wi, const std::array& versions_to_try)
+ {
+ return Create(wi, versions_to_try.data(), versions_to_try.size());
+ }
+
+ static std::unique_ptr Create(const WindowInfo& wi) { return Create(wi, GetAllVersionsList()); }
+
+ static const std::array& GetAllDesktopVersionsList();
+ static const std::array& GetAllDesktopVersionsListWithFallback();
+ static const std::array& GetAllESVersionsList();
+ static const std::array& GetAllVersionsList();
+
+protected:
+#ifdef WIN32
+#endif
+
+ WindowInfo m_wi;
+ Version m_version = {};
+};
+} // namespace GL
diff --git a/src/common/gl/context_agl.h b/src/common/gl/context_agl.h
new file mode 100644
index 000000000..f5a9df280
--- /dev/null
+++ b/src/common/gl/context_agl.h
@@ -0,0 +1,48 @@
+#pragma once
+#include "context.h"
+#include
+
+#if defined(__APPLE__) && defined(__OBJC__)
+#import
+#else
+struct NSOpenGLContext;
+struct NSOpenGLPixelFormat;
+struct NSView;
+#endif
+
+namespace GL {
+
+class ContextAGL final : public Context
+{
+public:
+ ContextAGL(const WindowInfo& wi);
+ ~ContextAGL() override;
+
+ static std::unique_ptr Create(const WindowInfo& wi, const Version* versions_to_try,
+ size_t num_versions_to_try);
+
+ void* GetProcAddress(const char* name) override;
+ bool ChangeSurface(const WindowInfo& new_wi) override;
+ void ResizeSurface(u32 new_surface_width = 0, u32 new_surface_height = 0) override;
+ bool SwapBuffers() override;
+ bool MakeCurrent() override;
+ bool DoneCurrent() override;
+ bool SetSwapInterval(s32 interval) override;
+ std::unique_ptr CreateSharedContext(const WindowInfo& wi) override;
+
+private:
+ ALWAYS_INLINE NSView* GetView() const { return static_cast(m_wi.window_handle); }
+
+ bool Initialize(const Version* versions_to_try, size_t num_versions_to_try);
+ bool CreateContext(NSOpenGLContext* share_context, int profile, bool make_current);
+ void BindContextToView();
+
+ // returns true if dimensions have changed
+ bool UpdateDimensions();
+
+ NSOpenGLContext* m_context = nullptr;
+ NSOpenGLPixelFormat* m_pixel_format = nullptr;
+ void* m_opengl_module_handle = nullptr;
+};
+
+} // namespace GL
\ No newline at end of file
diff --git a/src/common/gl/context_agl.mm b/src/common/gl/context_agl.mm
new file mode 100644
index 000000000..1af1a0854
--- /dev/null
+++ b/src/common/gl/context_agl.mm
@@ -0,0 +1,214 @@
+#include "context_agl.h"
+#include "../assert.h"
+#include "../log.h"
+#include "glad.h"
+#include
+Log_SetChannel(GL::ContextAGL);
+
+namespace GL {
+ContextAGL::ContextAGL(const WindowInfo& wi) : Context(wi)
+{
+ m_opengl_module_handle = dlopen("/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL", RTLD_NOW);
+ if (!m_opengl_module_handle)
+ Log_ErrorPrint("Could not open OpenGL.framework, function lookups will probably fail");
+}
+
+ContextAGL::~ContextAGL()
+{
+ if ([NSOpenGLContext currentContext] == m_context)
+ [NSOpenGLContext clearCurrentContext];
+
+ if (m_context)
+ [m_context release];
+
+ if (m_pixel_format)
+ [m_pixel_format release];
+
+ if (m_opengl_module_handle)
+ dlclose(m_opengl_module_handle);
+}
+
+std::unique_ptr ContextAGL::Create(const WindowInfo& wi, const Version* versions_to_try,
+ size_t num_versions_to_try)
+{
+ std::unique_ptr context = std::make_unique(wi);
+ if (!context->Initialize(versions_to_try, num_versions_to_try))
+ return nullptr;
+
+ return context;
+}
+
+bool ContextAGL::Initialize(const Version* versions_to_try, size_t num_versions_to_try)
+{
+ for (size_t i = 0; i < num_versions_to_try; i++)
+ {
+ const Version& cv = versions_to_try[i];
+ if (cv.profile == Profile::NoProfile && CreateContext(nullptr, NSOpenGLProfileVersionLegacy, true))
+ {
+ // we already have the dummy context, so just use that
+ m_version = cv;
+ return true;
+ }
+ else if (cv.profile == Profile::Core)
+ {
+ if (cv.major_version > 4 || cv.minor_version > 1)
+ continue;
+
+ const NSOpenGLPixelFormatAttribute profile = (cv.major_version > 3 || cv.minor_version > 2) ? NSOpenGLProfileVersion4_1Core : NSOpenGLProfileVersion3_2Core;
+ if (CreateContext(nullptr, static_cast(profile), true))
+ {
+ m_version = cv;
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
+void* ContextAGL::GetProcAddress(const char* name)
+{
+ void* addr = m_opengl_module_handle ? dlsym(m_opengl_module_handle, name) : nullptr;
+ if (addr)
+ return addr;
+
+ return dlsym(RTLD_NEXT, name);
+}
+
+bool ContextAGL::ChangeSurface(const WindowInfo& new_wi)
+{
+ m_wi = new_wi;
+ BindContextToView();
+ return true;
+}
+
+void ContextAGL::ResizeSurface(u32 new_surface_width /*= 0*/, u32 new_surface_height /*= 0*/)
+{
+ UpdateDimensions();
+}
+
+bool ContextAGL::UpdateDimensions()
+{
+ const NSSize window_size = [GetView() frame].size;
+ const CGFloat window_scale = [[GetView() window] backingScaleFactor];
+ const u32 new_width = static_cast(static_cast(window_size.width) * window_scale);
+ const u32 new_height = static_cast(static_cast(window_size.height) * window_scale);
+
+ if (m_wi.surface_width == new_width && m_wi.surface_height == new_height)
+ return false;
+
+ m_wi.surface_width = new_width;
+ m_wi.surface_height = new_height;
+
+ dispatch_block_t block = ^{
+ [m_context update];
+ };
+
+ if ([NSThread isMainThread])
+ block();
+ else
+ dispatch_sync(dispatch_get_main_queue(), block);
+
+ return true;
+}
+
+bool ContextAGL::SwapBuffers()
+{
+ [m_context flushBuffer];
+ return true;
+}
+
+bool ContextAGL::MakeCurrent()
+{
+ [m_context makeCurrentContext];
+ return true;
+}
+
+bool ContextAGL::DoneCurrent()
+{
+ [NSOpenGLContext clearCurrentContext];
+ return true;
+}
+
+bool ContextAGL::SetSwapInterval(s32 interval)
+{
+ GLint gl_interval = static_cast(interval);
+ [m_context setValues:&gl_interval forParameter:NSOpenGLCPSwapInterval];
+ return true;
+}
+
+std::unique_ptr ContextAGL::CreateSharedContext(const WindowInfo& wi)
+{
+ std::unique_ptr context = std::make_unique(wi);
+
+ context->m_context = [[NSOpenGLContext alloc] initWithFormat:m_pixel_format shareContext:m_context];
+ if (context->m_context == nil)
+ return nullptr;
+
+ context->m_version = m_version;
+ context->m_pixel_format = m_pixel_format;
+ [context->m_pixel_format retain];
+
+ if (wi.type == WindowInfo::Type::MacOS)
+ context->BindContextToView();
+
+ return context;
+}
+
+bool ContextAGL::CreateContext(NSOpenGLContext* share_context, int profile, bool make_current)
+{
+ if (m_context)
+ {
+ [m_context release];
+ m_context = nullptr;
+ }
+
+ if (m_pixel_format)
+ [m_pixel_format release];
+
+ const std::array attribs = {{
+ NSOpenGLPFADoubleBuffer,
+ NSOpenGLPFAOpenGLProfile,
+ static_cast(profile),
+ NSOpenGLPFAAccelerated,
+ 0}};
+ m_pixel_format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attribs.data()];
+ if (m_pixel_format == nil)
+ {
+ Log_ErrorPrintf("Failed to initialize pixel format");
+ return false;
+ }
+
+ m_context = [[NSOpenGLContext alloc] initWithFormat:m_pixel_format shareContext:nil];
+ if (m_context == nil)
+ return false;
+
+ if (m_wi.type == WindowInfo::Type::MacOS)
+ BindContextToView();
+
+ if (make_current)
+ [m_context makeCurrentContext];
+
+ return true;
+}
+
+void ContextAGL::BindContextToView()
+{
+ NSView* const view = GetView();
+ NSWindow* const window = [view window];
+ [view setWantsBestResolutionOpenGLSurface:YES];
+
+ UpdateDimensions();
+
+ dispatch_block_t block = ^{
+ [window makeFirstResponder:view];
+ [m_context setView:view];
+ [window makeKeyAndOrderFront:nil];
+ };
+
+ if ([NSThread isMainThread])
+ block();
+ else
+ dispatch_sync(dispatch_get_main_queue(), block);
+}
+} // namespace GL
diff --git a/src/common/gl/context_egl.cpp b/src/common/gl/context_egl.cpp
new file mode 100644
index 000000000..2f90c068d
--- /dev/null
+++ b/src/common/gl/context_egl.cpp
@@ -0,0 +1,285 @@
+#include "context_egl.h"
+#include "../assert.h"
+#include "../log.h"
+Log_SetChannel(GL::ContextEGL);
+
+namespace GL {
+ContextEGL::ContextEGL(const WindowInfo& wi) : Context(wi) {}
+
+ContextEGL::~ContextEGL()
+{
+ if (eglGetCurrentContext() == m_context)
+ eglMakeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+
+ if (m_context)
+ eglDestroyContext(m_display, m_context);
+}
+
+std::unique_ptr ContextEGL::Create(const WindowInfo& wi, const Version* versions_to_try,
+ size_t num_versions_to_try)
+{
+ std::unique_ptr context = std::make_unique(wi);
+ if (!context->Initialize(versions_to_try, num_versions_to_try))
+ return nullptr;
+
+ return context;
+}
+
+bool ContextEGL::Initialize(const Version* versions_to_try, size_t num_versions_to_try)
+{
+ if (!gladLoadEGL())
+ {
+ Log_ErrorPrintf("Loading GLAD EGL functions failed");
+ return false;
+ }
+
+ m_display = eglGetDisplay(static_cast(m_wi.display_connection));
+ if (!m_display)
+ {
+ Log_ErrorPrintf("eglGetDisplay() failed: %d", eglGetError());
+ return false;
+ }
+
+ int egl_major, egl_minor;
+ if (!eglInitialize(m_display, &egl_major, &egl_minor))
+ {
+ Log_ErrorPrintf("eglInitialize() failed: %d", eglGetError());
+ return false;
+ }
+ Log_InfoPrintf("EGL Version: %d.%d", egl_major, egl_minor);
+
+ for (size_t i = 0; i < num_versions_to_try; i++)
+ {
+ if (CreateContextAndSurface(versions_to_try[i], nullptr, true))
+ return true;
+ }
+
+ return false;
+}
+
+void* ContextEGL::GetProcAddress(const char* name)
+{
+ return reinterpret_cast(eglGetProcAddress(name));
+}
+
+bool ContextEGL::ChangeSurface(const WindowInfo& new_wi)
+{
+ const bool was_current = (eglGetCurrentContext() == m_context);
+ if (was_current)
+ eglMakeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+
+ if (m_surface != EGL_NO_SURFACE)
+ {
+ eglDestroySurface(m_display, m_surface);
+ m_surface = EGL_NO_SURFACE;
+ }
+
+ m_wi = new_wi;
+ if (m_wi.type != WindowInfo::Type::Surfaceless && !CreateSurface())
+ return false;
+
+ if (was_current && !eglMakeCurrent(m_display, m_surface, m_surface, m_context))
+ {
+ Log_ErrorPrintf("Failed to make context current again after surface change");
+ return false;
+ }
+
+ return true;
+}
+
+void ContextEGL::ResizeSurface(u32 new_surface_width /*= 0*/, u32 new_surface_height /*= 0*/)
+{
+ EGLint surface_width, surface_height;
+ if (eglQuerySurface(m_display, m_surface, EGL_WIDTH, &surface_width) &&
+ eglQuerySurface(m_display, m_surface, EGL_HEIGHT, &surface_height))
+ {
+ m_wi.surface_width = static_cast(surface_width);
+ m_wi.surface_height = static_cast(surface_height);
+ }
+ else
+ {
+ Log_ErrorPrintf("eglQuerySurface() failed: %d", eglGetError());
+ m_wi.surface_width = new_surface_width;
+ m_wi.surface_height = new_surface_height;
+ }
+}
+
+bool ContextEGL::SwapBuffers()
+{
+ return eglSwapBuffers(m_display, m_surface);
+}
+
+bool ContextEGL::MakeCurrent()
+{
+ if (!eglMakeCurrent(m_display, m_surface, m_surface, m_context))
+ {
+ Log_ErrorPrintf("eglMakeCurrent() failed: %d", eglGetError());
+ return false;
+ }
+
+ return true;
+}
+
+bool ContextEGL::DoneCurrent()
+{
+ return eglMakeCurrent(m_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+}
+
+bool ContextEGL::SetSwapInterval(s32 interval)
+{
+ return eglSwapInterval(m_display, interval);
+}
+
+std::unique_ptr ContextEGL::CreateSharedContext(const WindowInfo& wi)
+{
+ std::unique_ptr context = std::make_unique(wi);
+ context->m_display = m_display;
+
+ if (!context->CreateContextAndSurface(m_version, m_context, false))
+ return nullptr;
+
+ return context;
+}
+
+EGLNativeWindowType ContextEGL::GetNativeWindow(EGLConfig config)
+{
+ return {};
+}
+
+bool ContextEGL::CreateSurface()
+{
+ EGLNativeWindowType native_window = GetNativeWindow(m_config);
+ m_surface = eglCreateWindowSurface(m_display, m_config, native_window, nullptr);
+ if (!m_surface)
+ {
+ Log_ErrorPrintf("eglCreateWindowSurface() failed: %d", eglGetError());
+ return false;
+ }
+
+ // Some implementations may require the size to be queried at runtime.
+ EGLint surface_width, surface_height;
+ if (eglQuerySurface(m_display, m_surface, EGL_WIDTH, &surface_width) &&
+ eglQuerySurface(m_display, m_surface, EGL_HEIGHT, &surface_height))
+ {
+ m_wi.surface_width = static_cast(surface_width);
+ m_wi.surface_height = static_cast(surface_height);
+ }
+ else
+ {
+ Log_ErrorPrintf("eglQuerySurface() failed: %d", eglGetError());
+ }
+
+ return true;
+}
+
+bool ContextEGL::CreateContext(const Version& version, EGLContext share_context)
+{
+ int surface_attribs[16] = {
+ EGL_RENDERABLE_TYPE,
+ (version.profile == Profile::ES) ?
+ ((version.major_version >= 3) ? EGL_OPENGL_ES3_BIT :
+ ((version.major_version == 2) ? EGL_OPENGL_ES2_BIT : EGL_OPENGL_ES_BIT)) :
+ EGL_OPENGL_BIT,
+ EGL_SURFACE_TYPE,
+ (m_wi.type != WindowInfo::Type::Surfaceless) ? EGL_WINDOW_BIT : 0,
+ };
+ int nsurface_attribs = 4;
+
+ switch (m_wi.surface_format)
+ {
+ case WindowInfo::SurfaceFormat::RGB8:
+ surface_attribs[nsurface_attribs++] = EGL_RED_SIZE;
+ surface_attribs[nsurface_attribs++] = 8;
+ surface_attribs[nsurface_attribs++] = EGL_GREEN_SIZE;
+ surface_attribs[nsurface_attribs++] = 8;
+ surface_attribs[nsurface_attribs++] = EGL_BLUE_SIZE;
+ surface_attribs[nsurface_attribs++] = 8;
+ break;
+
+ case WindowInfo::SurfaceFormat::RGBA8:
+ surface_attribs[nsurface_attribs++] = EGL_RED_SIZE;
+ surface_attribs[nsurface_attribs++] = 8;
+ surface_attribs[nsurface_attribs++] = EGL_GREEN_SIZE;
+ surface_attribs[nsurface_attribs++] = 8;
+ surface_attribs[nsurface_attribs++] = EGL_BLUE_SIZE;
+ surface_attribs[nsurface_attribs++] = 8;
+ surface_attribs[nsurface_attribs++] = EGL_ALPHA_SIZE;
+ surface_attribs[nsurface_attribs++] = 8;
+ break;
+
+ case WindowInfo::SurfaceFormat::RGB565:
+ surface_attribs[nsurface_attribs++] = EGL_RED_SIZE;
+ surface_attribs[nsurface_attribs++] = 5;
+ surface_attribs[nsurface_attribs++] = EGL_GREEN_SIZE;
+ surface_attribs[nsurface_attribs++] = 6;
+ surface_attribs[nsurface_attribs++] = EGL_BLUE_SIZE;
+ surface_attribs[nsurface_attribs++] = 5;
+ break;
+
+ default:
+ UnreachableCode();
+ break;
+ }
+
+ surface_attribs[nsurface_attribs++] = EGL_NONE;
+ surface_attribs[nsurface_attribs++] = 0;
+
+ EGLint num_configs;
+ EGLConfig config;
+ if (!eglChooseConfig(m_display, surface_attribs, &config, 1, &num_configs) || num_configs == 0)
+ {
+ Log_ErrorPrintf("eglChooseConfig() failed: %d", eglGetError());
+ return false;
+ }
+
+ int attribs[8];
+ int nattribs = 0;
+ if (version.profile != Profile::NoProfile)
+ {
+ attribs[nattribs++] = EGL_CONTEXT_MAJOR_VERSION;
+ attribs[nattribs++] = version.major_version;
+ attribs[nattribs++] = EGL_CONTEXT_MINOR_VERSION;
+ attribs[nattribs++] = version.minor_version;
+ }
+ attribs[nattribs++] = EGL_NONE;
+ attribs[nattribs++] = 0;
+
+ eglBindAPI((version.profile == Profile::ES) ? EGL_OPENGL_ES_API : EGL_OPENGL_API);
+ m_context = eglCreateContext(m_display, config, share_context, attribs);
+ if (!m_context)
+ return false;
+
+ m_config = config;
+ m_version = version;
+ return true;
+}
+
+bool ContextEGL::CreateContextAndSurface(const Version& version, EGLContext share_context, bool make_current)
+{
+ if (!CreateContext(version, share_context))
+ return false;
+
+ if (m_wi.type != WindowInfo::Type::Surfaceless && !CreateSurface())
+ {
+ Log_ErrorPrintf("Failed to create surface for context");
+ eglDestroyContext(m_display, m_context);
+ m_context = EGL_NO_CONTEXT;
+ return false;
+ }
+
+ if (make_current && !eglMakeCurrent(m_display, m_surface, m_surface, m_context))
+ {
+ Log_ErrorPrintf("eglMakeCurrent() failed: %d", eglGetError());
+ if (m_surface != EGL_NO_SURFACE)
+ {
+ eglDestroySurface(m_display, m_surface);
+ m_surface = EGL_NO_SURFACE;
+ }
+ eglDestroyContext(m_display, m_context);
+ m_context = EGL_NO_CONTEXT;
+ return false;
+ }
+
+ return true;
+}
+} // namespace GL
diff --git a/src/common/gl/context_egl.h b/src/common/gl/context_egl.h
new file mode 100644
index 000000000..d70752328
--- /dev/null
+++ b/src/common/gl/context_egl.h
@@ -0,0 +1,42 @@
+#pragma once
+#include "context.h"
+#include "glad_egl.h"
+#include "x11_window.h"
+
+namespace GL {
+
+class ContextEGL : public Context
+{
+public:
+ ContextEGL(const WindowInfo& wi);
+ ~ContextEGL() override;
+
+ static std::unique_ptr Create(const WindowInfo& wi, const Version* versions_to_try,
+ size_t num_versions_to_try);
+
+ void* GetProcAddress(const char* name) override;
+ virtual bool ChangeSurface(const WindowInfo& new_wi) override;
+ virtual void ResizeSurface(u32 new_surface_width = 0, u32 new_surface_height = 0) override;
+ bool SwapBuffers() override;
+ bool MakeCurrent() override;
+ bool DoneCurrent() override;
+ bool SetSwapInterval(s32 interval) override;
+ virtual std::unique_ptr CreateSharedContext(const WindowInfo& wi) override;
+
+protected:
+ virtual EGLNativeWindowType GetNativeWindow(EGLConfig config);
+
+ bool Initialize(const Version* versions_to_try, size_t num_versions_to_try);
+ bool CreateDisplay();
+ bool CreateContext(const Version& version, EGLContext share_context);
+ bool CreateContextAndSurface(const Version& version, EGLContext share_context, bool make_current);
+ bool CreateSurface();
+
+ EGLDisplay m_display = EGL_NO_DISPLAY;
+ EGLSurface m_surface = EGL_NO_SURFACE;
+ EGLContext m_context = EGL_NO_CONTEXT;
+
+ EGLConfig m_config = {};
+};
+
+} // namespace GL
diff --git a/src/common/gl/context_egl_android.cpp b/src/common/gl/context_egl_android.cpp
new file mode 100644
index 000000000..fdd146641
--- /dev/null
+++ b/src/common/gl/context_egl_android.cpp
@@ -0,0 +1,44 @@
+#include "context_egl_android.h"
+#include "../log.h"
+Log_SetChannel(GL::ContextEGLAndroid);
+
+namespace GL {
+ContextEGLX11::ContextEGLAndroid(const WindowInfo& wi) : ContextEGL(wi) {}
+ContextEGLX11::~ContextEGLAndroid() = default;
+
+std::unique_ptr ContextEGLAndroid::Create(const WindowInfo& wi, const Version* versions_to_try,
+ size_t num_versions_to_try)
+{
+ std::unique_ptr context = std::make_unique(wi);
+ if (!context->Initialize(versions_to_try, num_versions_to_try))
+ return nullptr;
+
+ return context;
+}
+
+std::unique_ptr ContextEGLAndroid::CreateSharedContext(const WindowInfo& wi)
+{
+ std::unique_ptr context = std::make_unique(wi);
+ context->m_display = m_display;
+
+ if (!context->CreateContextAndSurface(m_version, m_context, false))
+ return nullptr;
+
+ return context;
+}
+
+EGLNativeWindowType ContextEGLAndroid::GetNativeWindow(EGLConfig config)
+{
+ X11InhibitErrors ei;
+
+ EGLint native_visual_id = 0;
+ if (!eglGetConfigAttrib(m_display, m_config, EGL_NATIVE_VISUAL_ID, &native_visual_id))
+ {
+ Log_ErrorPrintf("Failed to get X11 visual ID");
+ return false;
+ }
+
+ ANativeWindow_setBuffersGeometry(static_cast(m_wi.window_handle), 0, 0, static_cast(native_visual_id));
+ return static_cast(m_wi.window_handle);
+}
+} // namespace GL
diff --git a/src/common/gl/context_egl_android.h b/src/common/gl/context_egl_android.h
new file mode 100644
index 000000000..cb452c9b0
--- /dev/null
+++ b/src/common/gl/context_egl_android.h
@@ -0,0 +1,27 @@
+#pragma once
+#include "context_egl.h"
+#include "x11_window.h"
+
+namespace GL {
+
+class ContextEGLAndroid final : public ContextEGL
+{
+public:
+ ContextEGLAndroid(const WindowInfo& wi);
+ ~ContextEGLAndroid() override;
+
+ static std::unique_ptr Create(const WindowInfo& wi, const Version* versions_to_try,
+ size_t num_versions_to_try);
+
+ std::unique_ptr CreateSharedContext(const WindowInfo& wi) override;
+
+protected:
+ EGLNativeWindowType GetNativeWindow(EGLConfig config) override;
+
+private:
+ ALWAYS_INLINE Display* GetDisplay() const { return static_cast(m_wi.display_connection); }
+
+ X11Window m_window;
+};
+
+} // namespace GL
diff --git a/src/common/gl/context_egl_x11.cpp b/src/common/gl/context_egl_x11.cpp
new file mode 100644
index 000000000..c7310e312
--- /dev/null
+++ b/src/common/gl/context_egl_x11.cpp
@@ -0,0 +1,69 @@
+#include "context_egl_x11.h"
+#include "../log.h"
+Log_SetChannel(GL::ContextEGLX11);
+
+namespace GL {
+ContextEGLX11::ContextEGLX11(const WindowInfo& wi) : ContextEGL(wi) {}
+ContextEGLX11::~ContextEGLX11() = default;
+
+std::unique_ptr ContextEGLX11::Create(const WindowInfo& wi, const Version* versions_to_try,
+ size_t num_versions_to_try)
+{
+ std::unique_ptr context = std::make_unique(wi);
+ if (!context->Initialize(versions_to_try, num_versions_to_try))
+ return nullptr;
+
+ return context;
+}
+
+std::unique_ptr ContextEGLX11::CreateSharedContext(const WindowInfo& wi)
+{
+ std::unique_ptr context = std::make_unique(wi);
+ context->m_display = m_display;
+
+ if (!context->CreateContextAndSurface(m_version, m_context, false))
+ return nullptr;
+
+ return context;
+}
+
+void ContextEGLX11::ResizeSurface(u32 new_surface_width, u32 new_surface_height)
+{
+ m_window.Resize();
+ ContextEGL::ResizeSurface(new_surface_width, new_surface_height);
+}
+
+EGLNativeWindowType ContextEGLX11::GetNativeWindow(EGLConfig config)
+{
+ X11InhibitErrors ei;
+
+ EGLint native_visual_id = 0;
+ if (!eglGetConfigAttrib(m_display, m_config, EGL_NATIVE_VISUAL_ID, &native_visual_id))
+ {
+ Log_ErrorPrintf("Failed to get X11 visual ID");
+ return false;
+ }
+
+ XVisualInfo vi_query = {};
+ vi_query.visualid = native_visual_id;
+
+ int num_vis;
+ XVisualInfo* vi = XGetVisualInfo(static_cast(m_wi.display_connection), VisualIDMask, &vi_query, &num_vis);
+ if (num_vis <= 0 || !vi)
+ {
+ Log_ErrorPrintf("Failed to query visual from X11");
+ return false;
+ }
+
+ m_window.Destroy();
+ if (!m_window.Create(GetDisplay(), static_cast(reinterpret_cast(m_wi.window_handle)), vi))
+ {
+ Log_ErrorPrintf("Faild to create X11 child window");
+ XFree(vi);
+ return false;
+ }
+
+ XFree(vi);
+ return static_cast(m_window.GetWindow());
+}
+} // namespace GL
diff --git a/src/common/gl/context_egl_x11.h b/src/common/gl/context_egl_x11.h
new file mode 100644
index 000000000..7def8bfbc
--- /dev/null
+++ b/src/common/gl/context_egl_x11.h
@@ -0,0 +1,28 @@
+#pragma once
+#include "context_egl.h"
+#include "x11_window.h"
+
+namespace GL {
+
+class ContextEGLX11 final : public ContextEGL
+{
+public:
+ ContextEGLX11(const WindowInfo& wi);
+ ~ContextEGLX11() override;
+
+ static std::unique_ptr Create(const WindowInfo& wi, const Version* versions_to_try,
+ size_t num_versions_to_try);
+
+ std::unique_ptr CreateSharedContext(const WindowInfo& wi) override;
+ void ResizeSurface(u32 new_surface_width = 0, u32 new_surface_height = 0) override;
+
+protected:
+ EGLNativeWindowType GetNativeWindow(EGLConfig config) override;
+
+private:
+ ALWAYS_INLINE Display* GetDisplay() const { return static_cast(m_wi.display_connection); }
+
+ X11Window m_window;
+};
+
+} // namespace GL
diff --git a/src/common/gl/context_glx.cpp b/src/common/gl/context_glx.cpp
new file mode 100644
index 000000000..a00875bbc
--- /dev/null
+++ b/src/common/gl/context_glx.cpp
@@ -0,0 +1,306 @@
+#include "context_glx.h"
+#include "../assert.h"
+#include "../log.h"
+Log_SetChannel(GL::ContextGLX);
+
+namespace GL {
+ContextGLX::ContextGLX(const WindowInfo& wi) : Context(wi) {}
+
+ContextGLX::~ContextGLX()
+{
+ if (glXGetCurrentContext() == m_context)
+ glXMakeCurrent(GetDisplay(), None, nullptr);
+
+ if (m_context)
+ glXDestroyContext(GetDisplay(), m_context);
+}
+
+std::unique_ptr ContextGLX::Create(const WindowInfo& wi, const Version* versions_to_try,
+ size_t num_versions_to_try)
+{
+ std::unique_ptr context = std::make_unique(wi);
+ if (!context->Initialize(versions_to_try, num_versions_to_try))
+ return nullptr;
+
+ return context;
+}
+
+bool ContextGLX::Initialize(const Version* versions_to_try, size_t num_versions_to_try)
+{
+ const int screen = DefaultScreen(GetDisplay());
+ if (!gladLoadGLX(GetDisplay(), screen))
+ {
+ Log_ErrorPrintf("Loading GLAD GLX functions failed");
+ return false;
+ }
+
+ if (m_wi.type == WindowInfo::Type::X11)
+ {
+ if (!CreateWindow(screen))
+ return false;
+ }
+ else
+ {
+ Panic("Create pbuffer");
+ }
+
+ for (size_t i = 0; i < num_versions_to_try; i++)
+ {
+ const Version& cv = versions_to_try[i];
+ if (cv.profile == Profile::NoProfile && CreateAnyContext(nullptr, true))
+ {
+ m_version = cv;
+ return true;
+ }
+ else if (cv.profile != Profile::NoProfile && CreateVersionContext(cv, nullptr, true))
+ {
+ m_version = cv;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void* ContextGLX::GetProcAddress(const char* name)
+{
+ return reinterpret_cast(glXGetProcAddress(reinterpret_cast(name)));
+}
+
+bool ContextGLX::ChangeSurface(const WindowInfo& new_wi)
+{
+ const bool was_current = (glXGetCurrentContext() == m_context);
+ if (was_current)
+ glXMakeCurrent(GetDisplay(), None, nullptr);
+
+ m_window.Destroy();
+ m_wi = new_wi;
+
+ if (new_wi.type == WindowInfo::Type::X11)
+ {
+ const int screen = DefaultScreen(GetDisplay());
+ if (!CreateWindow(screen))
+ return false;
+ }
+
+ if (was_current && !glXMakeCurrent(GetDisplay(), GetDrawable(), m_context))
+ {
+ Log_ErrorPrintf("Failed to make context current again after surface change");
+ return false;
+ }
+
+ return true;
+}
+
+void ContextGLX::ResizeSurface(u32 new_surface_width /*= 0*/, u32 new_surface_height /*= 0*/)
+{
+ m_window.Resize();
+ m_wi.surface_width = m_window.GetWidth();
+ m_wi.surface_height = m_window.GetHeight();
+}
+
+bool ContextGLX::SwapBuffers()
+{
+ glXSwapBuffers(GetDisplay(), GetDrawable());
+ return true;
+}
+
+bool ContextGLX::MakeCurrent()
+{
+ return (glXMakeCurrent(GetDisplay(), GetDrawable(), m_context) == True);
+}
+
+bool ContextGLX::DoneCurrent()
+{
+ return (glXMakeCurrent(GetDisplay(), None, nullptr) == True);
+}
+
+bool ContextGLX::SetSwapInterval(s32 interval)
+{
+ if (GLAD_GLX_EXT_swap_control)
+ {
+ glXSwapIntervalEXT(GetDisplay(), GetDrawable(), interval);
+ return true;
+ }
+ else if (GLAD_GLX_MESA_swap_control)
+ {
+ return (glXSwapIntervalMESA(static_cast(std::max(interval, 0))) != 0);
+ }
+ else if (GLAD_GLX_SGI_swap_control)
+ {
+ return (glXSwapIntervalSGI(interval) != 0);
+ }
+ else
+ {
+ return false;
+ }
+}
+
+std::unique_ptr ContextGLX::CreateSharedContext(const WindowInfo& wi)
+{
+ std::unique_ptr context = std::make_unique(wi);
+ if (wi.type == WindowInfo::Type::X11)
+ {
+ const int screen = DefaultScreen(context->GetDisplay());
+ if (!context->CreateWindow(screen))
+ return nullptr;
+ }
+ else
+ {
+ Panic("Create pbuffer");
+ }
+
+ if (m_version.profile == Profile::NoProfile)
+ {
+ if (!context->CreateAnyContext(m_context, false))
+ return nullptr;
+ }
+ else
+ {
+ if (!context->CreateVersionContext(m_version, m_context, false))
+ return nullptr;
+ }
+
+ context->m_version = m_version;
+ return context;
+}
+
+bool ContextGLX::CreateWindow(int screen)
+{
+ int attribs[32] = {GLX_X_RENDERABLE, True, GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT,
+ GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR, GLX_DOUBLEBUFFER, True};
+ int nattribs = 8;
+
+ switch (m_wi.surface_format)
+ {
+ case WindowInfo::SurfaceFormat::RGB8:
+ attribs[nattribs++] = GLX_RED_SIZE;
+ attribs[nattribs++] = 8;
+ attribs[nattribs++] = GLX_GREEN_SIZE;
+ attribs[nattribs++] = 8;
+ attribs[nattribs++] = GLX_BLUE_SIZE;
+ attribs[nattribs++] = 8;
+ break;
+
+ case WindowInfo::SurfaceFormat::RGBA8:
+ attribs[nattribs++] = GLX_RED_SIZE;
+ attribs[nattribs++] = 8;
+ attribs[nattribs++] = GLX_GREEN_SIZE;
+ attribs[nattribs++] = 8;
+ attribs[nattribs++] = GLX_BLUE_SIZE;
+ attribs[nattribs++] = 8;
+ attribs[nattribs++] = GLX_ALPHA_SIZE;
+ attribs[nattribs++] = 8;
+ break;
+
+ case WindowInfo::SurfaceFormat::RGB565:
+ attribs[nattribs++] = GLX_RED_SIZE;
+ attribs[nattribs++] = 5;
+ attribs[nattribs++] = GLX_GREEN_SIZE;
+ attribs[nattribs++] = 6;
+ attribs[nattribs++] = GLX_BLUE_SIZE;
+ attribs[nattribs++] = 5;
+ break;
+
+ default:
+ UnreachableCode();
+ break;
+ }
+
+ attribs[nattribs++] = None;
+ attribs[nattribs++] = 0;
+
+ int fbcount = 0;
+ GLXFBConfig* fbc = glXChooseFBConfig(GetDisplay(), screen, attribs, &fbcount);
+ if (!fbc || !fbcount)
+ {
+ Log_ErrorPrintf("glXChooseFBConfig() failed");
+ return false;
+ }
+ m_fb_config = *fbc;
+ XFree(fbc);
+
+ if (!GLAD_GLX_VERSION_1_3)
+ {
+ Log_ErrorPrintf("GLX Version 1.3 is required");
+ return false;
+ }
+
+ const XVisualInfo* vi = glXGetVisualFromFBConfig(GetDisplay(), m_fb_config);
+ if (!vi)
+ {
+ Log_ErrorPrintf("glXGetVisualFromFBConfig() failed");
+ return false;
+ }
+
+ return m_window.Create(GetDisplay(), static_cast(reinterpret_cast(m_wi.window_handle)), vi);
+}
+
+bool ContextGLX::CreateAnyContext(GLXContext share_context, bool make_current)
+{
+ X11InhibitErrors ie;
+
+ m_context = glXCreateContext(GetDisplay(), m_vi, share_context, True);
+ if (!m_context || ie.HadError())
+ {
+ Log_ErrorPrintf("glxCreateContext() failed");
+ return false;
+ }
+
+ if (make_current)
+ {
+ if (!glXMakeCurrent(GetDisplay(), GetDrawable(), m_context))
+ {
+ Log_ErrorPrintf("glXMakeCurrent() failed");
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool ContextGLX::CreateVersionContext(const Version& version, GLXContext share_context, bool make_current)
+{
+ // we need create context attribs
+ if (!GLAD_GLX_VERSION_1_3)
+ {
+ Log_ErrorPrint("Missing GLX version 1.3.");
+ return false;
+ }
+
+ int attribs[32];
+ int nattribs = 0;
+ attribs[nattribs++] = GLX_CONTEXT_PROFILE_MASK_ARB;
+ attribs[nattribs++] =
+ ((version.profile == Profile::ES) ?
+ ((version.major_version >= 2) ? GLX_CONTEXT_ES2_PROFILE_BIT_EXT : GLX_CONTEXT_ES_PROFILE_BIT_EXT) :
+ GLX_CONTEXT_CORE_PROFILE_BIT_ARB);
+ attribs[nattribs++] = GLX_CONTEXT_MAJOR_VERSION_ARB;
+ attribs[nattribs++] = version.major_version;
+ attribs[nattribs++] = GLX_CONTEXT_MINOR_VERSION_ARB;
+ attribs[nattribs++] = version.minor_version;
+ attribs[nattribs++] = None;
+ attribs[nattribs++] = 0;
+
+ X11InhibitErrors ie;
+ m_context = glXCreateContextAttribsARB(GetDisplay(), m_fb_config, share_context, True, attribs);
+ XSync(GetDisplay(), False);
+ if (ie.HadError())
+ m_context = nullptr;
+ if (!m_context)
+ return false;
+
+ if (make_current)
+ {
+ if (!glXMakeCurrent(GetDisplay(), GetDrawable(), m_context))
+ {
+ Log_ErrorPrint("glXMakeCurrent() failed");
+ glXDestroyContext(GetDisplay(), m_context);
+ m_context = nullptr;
+ return false;
+ }
+ }
+
+ return true;
+}
+} // namespace GL
diff --git a/src/common/gl/context_glx.h b/src/common/gl/context_glx.h
new file mode 100644
index 000000000..89a1fbc86
--- /dev/null
+++ b/src/common/gl/context_glx.h
@@ -0,0 +1,41 @@
+#pragma once
+#include "context.h"
+#include "glad_glx.h"
+#include "x11_window.h"
+
+namespace GL {
+
+class ContextGLX final : public Context
+{
+public:
+ ContextGLX(const WindowInfo& wi);
+ ~ContextGLX() override;
+
+ static std::unique_ptr Create(const WindowInfo& wi, const Version* versions_to_try,
+ size_t num_versions_to_try);
+
+ void* GetProcAddress(const char* name) override;
+ bool ChangeSurface(const WindowInfo& new_wi) override;
+ void ResizeSurface(u32 new_surface_width = 0, u32 new_surface_height = 0) override;
+ bool SwapBuffers() override;
+ bool MakeCurrent() override;
+ bool DoneCurrent() override;
+ bool SetSwapInterval(s32 interval) override;
+ std::unique_ptr CreateSharedContext(const WindowInfo& wi) override;
+
+private:
+ ALWAYS_INLINE Display* GetDisplay() const { return static_cast(m_wi.display_connection); }
+ ALWAYS_INLINE GLXDrawable GetDrawable() const { return static_cast(m_window.GetWindow()); }
+
+ bool Initialize(const Version* versions_to_try, size_t num_versions_to_try);
+ bool CreateWindow(int screen);
+ bool CreateAnyContext(GLXContext share_context, bool make_current);
+ bool CreateVersionContext(const Version& version, GLXContext share_context, bool make_current);
+
+ GLXContext m_context = nullptr;
+ GLXFBConfig m_fb_config = {};
+ XVisualInfo* m_vi = nullptr;
+ X11Window m_window;
+};
+
+} // namespace GL
diff --git a/src/common/gl/context_wgl.cpp b/src/common/gl/context_wgl.cpp
new file mode 100644
index 000000000..7dcde8f5e
--- /dev/null
+++ b/src/common/gl/context_wgl.cpp
@@ -0,0 +1,345 @@
+#include "context_wgl.h"
+#include "../assert.h"
+#include "../log.h"
+#include "glad.h"
+#include "glad_wgl.h"
+Log_SetChannel(GL::ContextWGL);
+
+// TODO: get rid of this
+#pragma comment(lib, "opengl32.lib")
+
+static void* GetProcAddressCallback(const char* name)
+{
+ void* addr = wglGetProcAddress(name);
+ if (addr)
+ return addr;
+
+ // try opengl32.dll
+ return ::GetProcAddress(GetModuleHandleA("opengl32.dll"), name);
+}
+
+namespace GL {
+ContextWGL::ContextWGL(const WindowInfo& wi) : Context(wi) {}
+
+ContextWGL::~ContextWGL()
+{
+ if (wglGetCurrentContext() == m_rc)
+ wglMakeCurrent(m_dc, nullptr);
+
+ if (m_rc)
+ wglDeleteContext(m_rc);
+
+ if (m_dc)
+ ReleaseDC(GetHWND(), m_dc);
+}
+
+std::unique_ptr ContextWGL::Create(const WindowInfo& wi, const Version* versions_to_try,
+ size_t num_versions_to_try)
+{
+ std::unique_ptr context = std::make_unique(wi);
+ if (!context->Initialize(versions_to_try, num_versions_to_try))
+ return nullptr;
+
+ return context;
+}
+
+bool ContextWGL::Initialize(const Version* versions_to_try, size_t num_versions_to_try)
+{
+ if (m_wi.type == WindowInfo::Type::Win32)
+ {
+ if (!InitializeDC())
+ return false;
+ }
+ else
+ {
+ Panic("Create pbuffer");
+ }
+
+ // Everything including core/ES requires a dummy profile to load the WGL extensions.
+ if (!CreateAnyContext(nullptr, true))
+ return false;
+
+ for (size_t i = 0; i < num_versions_to_try; i++)
+ {
+ const Version& cv = versions_to_try[i];
+ if (cv.profile == Profile::NoProfile)
+ {
+ // we already have the dummy context, so just use that
+ m_version = cv;
+ return true;
+ }
+ else if (CreateVersionContext(cv, nullptr, true))
+ {
+ m_version = cv;
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void* ContextWGL::GetProcAddress(const char* name)
+{
+ return GetProcAddressCallback(name);
+}
+
+bool ContextWGL::ChangeSurface(const WindowInfo& new_wi)
+{
+ const bool was_current = (wglGetCurrentContext() == m_rc);
+
+ if (m_dc)
+ {
+ ReleaseDC(GetHWND(), m_dc);
+ m_dc = {};
+ }
+
+ m_wi = new_wi;
+ if (!InitializeDC())
+ return false;
+
+ if (was_current && !wglMakeCurrent(m_dc, m_rc))
+ {
+ Log_ErrorPrintf("Failed to make context current again after surface change: 0x%08X", GetLastError());
+ return false;
+ }
+
+ return true;
+}
+
+void ContextWGL::ResizeSurface(u32 new_surface_width /*= 0*/, u32 new_surface_height /*= 0*/)
+{
+ RECT client_rc = {};
+ GetClientRect(GetHWND(), &client_rc);
+ m_wi.surface_width = static_cast(client_rc.right - client_rc.left);
+ m_wi.surface_height = static_cast(client_rc.bottom - client_rc.top);
+}
+
+bool ContextWGL::SwapBuffers()
+{
+ return ::SwapBuffers(m_dc);
+}
+
+bool ContextWGL::MakeCurrent()
+{
+ if (!wglMakeCurrent(m_dc, m_rc))
+ {
+ Log_ErrorPrintf("wglMakeCurrent() failed: 0x%08X", GetLastError());
+ return false;
+ }
+
+ return true;
+}
+
+bool ContextWGL::DoneCurrent()
+{
+ return wglMakeCurrent(m_dc, nullptr);
+}
+
+bool ContextWGL::SetSwapInterval(s32 interval)
+{
+ if (!GLAD_WGL_EXT_swap_control)
+ return false;
+
+ return wglSwapIntervalEXT(interval);
+}
+
+std::unique_ptr ContextWGL::CreateSharedContext(const WindowInfo& wi)
+{
+ std::unique_ptr context = std::make_unique(wi);
+ if (wi.type == WindowInfo::Type::Win32)
+ {
+ if (!context->InitializeDC())
+ return nullptr;
+ }
+ else
+ {
+ Panic("Create pbuffer");
+ }
+
+ if (m_version.profile == Profile::NoProfile)
+ {
+ if (!context->CreateAnyContext(m_rc, false))
+ return nullptr;
+ }
+ else
+ {
+ if (!context->CreateVersionContext(m_version, m_rc, false))
+ return nullptr;
+ }
+
+ context->m_version = m_version;
+ return context;
+}
+
+bool ContextWGL::InitializeDC()
+{
+ PIXELFORMATDESCRIPTOR pfd = {};
+ pfd.nSize = sizeof(pfd);
+ pfd.nVersion = 1;
+ pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
+ pfd.iPixelType = PFD_TYPE_RGBA;
+ pfd.dwLayerMask = PFD_MAIN_PLANE;
+
+ switch (m_wi.surface_format)
+ {
+ case WindowInfo::SurfaceFormat::RGB8:
+ pfd.cColorBits = 32;
+ pfd.cRedBits = 8;
+ pfd.cGreenBits = 8;
+ pfd.cBlueBits = 8;
+ break;
+
+ case WindowInfo::SurfaceFormat::RGBA8:
+ pfd.cColorBits = 32;
+ pfd.cRedBits = 8;
+ pfd.cGreenBits = 8;
+ pfd.cBlueBits = 8;
+ pfd.cAlphaBits = 8;
+ break;
+
+ case WindowInfo::SurfaceFormat::RGB565:
+ pfd.cColorBits = 16;
+ pfd.cRedBits = 5;
+ pfd.cGreenBits = 6;
+ pfd.cBlueBits = 5;
+ break;
+
+ default:
+ UnreachableCode();
+ break;
+ }
+
+ m_dc = GetDC(GetHWND());
+ if (!m_dc)
+ {
+ Log_ErrorPrintf("GetDC() failed: 0x%08X", GetLastError());
+ return false;
+ }
+
+ const int pf = ChoosePixelFormat(m_dc, &pfd);
+ if (pf == 0)
+ {
+ Log_ErrorPrintf("ChoosePixelFormat() failed: 0x%08X", GetLastError());
+ return false;
+ }
+
+ if (!SetPixelFormat(m_dc, pf, &pfd))
+ {
+ Log_ErrorPrintf("SetPixelFormat() failed: 0x%08X", GetLastError());
+ return false;
+ }
+
+ return true;
+}
+
+bool ContextWGL::CreateAnyContext(HGLRC share_context, bool make_current)
+{
+ m_rc = wglCreateContext(m_dc);
+ if (!m_rc)
+ {
+ Log_ErrorPrintf("wglCreateContext() failed: 0x%08X", GetLastError());
+ return false;
+ }
+
+ if (make_current)
+ {
+ if (!wglMakeCurrent(m_dc, m_rc))
+ {
+ Log_ErrorPrintf("wglMakeCurrent() failed: 0x%08X", GetLastError());
+ return false;
+ }
+
+ // re-init glad-wgl
+ if (!gladLoadWGLLoader([](const char* name) -> void* { return wglGetProcAddress(name); }, m_dc))
+ {
+ Log_ErrorPrintf("Loading GLAD WGL functions failed");
+ return false;
+ }
+ }
+
+ if (share_context && !wglShareLists(share_context, m_rc))
+ {
+ Log_ErrorPrintf("wglShareLists() failed: 0x%08X", GetLastError());
+ return false;
+ }
+
+ return true;
+}
+
+bool ContextWGL::CreateVersionContext(const Version& version, HGLRC share_context, bool make_current)
+{
+ // we need create context attribs
+ if (!GLAD_WGL_ARB_create_context)
+ {
+ Log_ErrorPrint("Missing GLAD_WGL_ARB_create_context.");
+ return false;
+ }
+
+ HGLRC new_rc;
+ if (version.profile == Profile::Core)
+ {
+ const int attribs[] = {WGL_CONTEXT_PROFILE_MASK_ARB,
+ WGL_CONTEXT_CORE_PROFILE_BIT_ARB,
+ WGL_CONTEXT_MAJOR_VERSION_ARB,
+ version.major_version,
+ WGL_CONTEXT_MINOR_VERSION_ARB,
+ version.minor_version,
+#ifdef _DEBUG
+ WGL_CONTEXT_FLAGS_ARB,
+ WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB | WGL_CONTEXT_DEBUG_BIT_ARB,
+#else
+ WGL_CONTEXT_FLAGS_ARB,
+ WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
+#endif
+ 0,
+ 0};
+
+ new_rc = wglCreateContextAttribsARB(m_dc, share_context, attribs);
+ }
+ else if (version.profile == Profile::ES)
+ {
+ const int attribs[] = {
+ WGL_CONTEXT_PROFILE_MASK_ARB,
+ ((version.major_version >= 2) ? WGL_CONTEXT_ES2_PROFILE_BIT_EXT : WGL_CONTEXT_ES_PROFILE_BIT_EXT),
+ WGL_CONTEXT_MAJOR_VERSION_ARB,
+ version.major_version,
+ WGL_CONTEXT_MINOR_VERSION_ARB,
+ version.minor_version,
+ 0,
+ 0};
+
+ new_rc = wglCreateContextAttribsARB(m_dc, share_context, attribs);
+ }
+ else
+ {
+ Log_ErrorPrintf("Unknown profile");
+ return false;
+ }
+
+ if (!new_rc)
+ return false;
+
+ // destroy and swap contexts
+ if (m_rc)
+ {
+ if (!wglMakeCurrent(m_dc, make_current ? new_rc : nullptr))
+ {
+ Log_ErrorPrintf("wglMakeCurrent() failed: 0x%08X", GetLastError());
+ wglDeleteContext(new_rc);
+ return false;
+ }
+
+ // re-init glad-wgl
+ if (make_current && !gladLoadWGLLoader([](const char* name) -> void* { return wglGetProcAddress(name); }, m_dc))
+ {
+ Log_ErrorPrintf("Loading GLAD WGL functions failed");
+ return false;
+ }
+
+ wglDeleteContext(m_rc);
+ }
+
+ m_rc = new_rc;
+ return true;
+}
+} // namespace GL
diff --git a/src/common/gl/context_wgl.h b/src/common/gl/context_wgl.h
new file mode 100644
index 000000000..6303235e2
--- /dev/null
+++ b/src/common/gl/context_wgl.h
@@ -0,0 +1,38 @@
+#pragma once
+#include "../windows_headers.h"
+#include "context.h"
+#include
+
+namespace GL {
+
+class ContextWGL final : public Context
+{
+public:
+ ContextWGL(const WindowInfo& wi);
+ ~ContextWGL() override;
+
+ static std::unique_ptr Create(const WindowInfo& wi, const Version* versions_to_try,
+ size_t num_versions_to_try);
+
+ void* GetProcAddress(const char* name) override;
+ bool ChangeSurface(const WindowInfo& new_wi) override;
+ void ResizeSurface(u32 new_surface_width = 0, u32 new_surface_height = 0) override;
+ bool SwapBuffers() override;
+ bool MakeCurrent() override;
+ bool DoneCurrent() override;
+ bool SetSwapInterval(s32 interval) override;
+ std::unique_ptr CreateSharedContext(const WindowInfo& wi) override;
+
+private:
+ ALWAYS_INLINE HWND GetHWND() const { return static_cast(m_wi.window_handle); }
+
+ bool Initialize(const Version* versions_to_try, size_t num_versions_to_try);
+ bool InitializeDC();
+ bool CreateAnyContext(HGLRC share_context, bool make_current);
+ bool CreateVersionContext(const Version& version, HGLRC share_context, bool make_current);
+
+ HDC m_dc = {};
+ HGLRC m_rc = {};
+};
+
+} // namespace GL
\ No newline at end of file
diff --git a/src/common/gl/x11_window.cpp b/src/common/gl/x11_window.cpp
new file mode 100644
index 000000000..1913dd54f
--- /dev/null
+++ b/src/common/gl/x11_window.cpp
@@ -0,0 +1,93 @@
+#include "x11_window.h"
+#include "../assert.h"
+#include
+namespace GL {
+X11Window::X11Window() = default;
+
+X11Window::~X11Window()
+{
+ Destroy();
+}
+
+bool X11Window::Create(Display* display, Window parent_window, const XVisualInfo* vi)
+{
+ m_display = display;
+ m_parent_window = parent_window;
+ XSync(m_display, True);
+
+ XWindowAttributes parent_wa = {};
+ XGetWindowAttributes(m_display, m_parent_window, &parent_wa);
+ m_width = static_cast(parent_wa.width);
+ m_height = static_cast(parent_wa.height);
+
+ // Failed X calls terminate the process so no need to check for errors.
+ // We could swap the error handler out here as well.
+ m_colormap = XCreateColormap(m_display, m_parent_window, vi->visual, AllocNone);
+
+ XSetWindowAttributes wa = {};
+ wa.colormap = m_colormap;
+
+ m_window = XCreateWindow(m_display, m_parent_window, 0, 0, m_width, m_height, 0, vi->depth, InputOutput, vi->visual,
+ CWColormap, &wa);
+ XMapWindow(m_display, m_window);
+ XSync(m_display, True);
+
+ return true;
+}
+
+void X11Window::Destroy()
+{
+ if (m_window)
+ {
+ XUnmapWindow(m_display, m_window);
+ XDestroyWindow(m_display, m_window);
+ m_window = {};
+ }
+
+ if (m_colormap)
+ {
+ XFreeColormap(m_display, m_colormap);
+ m_colormap = {};
+ }
+}
+
+void X11Window::Resize(u32 width, u32 height)
+{
+ if (width != 0 && height != 0)
+ {
+ m_width = width;
+ m_height = height;
+ }
+ else
+ {
+ XWindowAttributes parent_wa = {};
+ XGetWindowAttributes(m_display, m_parent_window, &parent_wa);
+ m_width = static_cast(parent_wa.width);
+ m_height = static_cast(parent_wa.height);
+ }
+
+ XResizeWindow(m_display, m_window, m_width, m_height);
+}
+
+static X11InhibitErrors* s_current_error_inhibiter;
+
+X11InhibitErrors::X11InhibitErrors()
+{
+ Assert(!s_current_error_inhibiter);
+ m_old_handler = XSetErrorHandler(ErrorHandler);
+ s_current_error_inhibiter = this;
+}
+
+X11InhibitErrors::~X11InhibitErrors()
+{
+ Assert(s_current_error_inhibiter == this);
+ s_current_error_inhibiter = nullptr;
+ XSetErrorHandler(m_old_handler);
+}
+
+int X11InhibitErrors::ErrorHandler(Display* display, XErrorEvent* ee)
+{
+ s_current_error_inhibiter->m_had_error = true;
+ return 0;
+}
+} // namespace GL
diff --git a/src/common/gl/x11_window.h b/src/common/gl/x11_window.h
new file mode 100644
index 000000000..4752980d3
--- /dev/null
+++ b/src/common/gl/x11_window.h
@@ -0,0 +1,48 @@
+#pragma once
+#include "../types.h"
+#include
+#include
+
+namespace GL {
+class X11Window
+{
+public:
+ X11Window();
+ ~X11Window();
+
+ ALWAYS_INLINE Window GetWindow() const { return m_window; }
+ ALWAYS_INLINE u32 GetWidth() const { return m_width; }
+ ALWAYS_INLINE u32 GetHeight() const { return m_height; }
+
+ bool Create(Display* display, Window parent_window, const XVisualInfo* vi);
+ void Destroy();
+
+ // Setting a width/height of 0 will use parent dimensions.
+ void Resize(u32 width = 0, u32 height = 0);
+
+private:
+ Display* m_display = nullptr;
+ Window m_parent_window = {};
+ Window m_window = {};
+ Colormap m_colormap = {};
+ u32 m_width = 0;
+ u32 m_height = 0;
+};
+
+// Helper class for managing X errors
+class X11InhibitErrors
+{
+public:
+ X11InhibitErrors();
+ ~X11InhibitErrors();
+
+ ALWAYS_INLINE bool HadError() const { return m_had_error; }
+
+private:
+ static int ErrorHandler(Display* display, XErrorEvent* ee);
+
+ XErrorHandler m_old_handler = {};
+ bool m_had_error = false;
+};
+
+} // namespace GL
diff --git a/src/common/window_info.h b/src/common/window_info.h
new file mode 100644
index 000000000..413f637dc
--- /dev/null
+++ b/src/common/window_info.h
@@ -0,0 +1,31 @@
+#pragma once
+
+// Contains the information required to create a graphics context in a window.
+struct WindowInfo
+{
+ enum class Type
+ {
+ Surfaceless,
+ Win32,
+ X11,
+ Wayland,
+ MacOS,
+ Android
+ };
+
+ enum class SurfaceFormat
+ {
+ None,
+ RGB8,
+ RGBA8,
+ RGB565,
+ Count
+ };
+
+ Type type = Type::Surfaceless;
+ void* display_connection = nullptr;
+ void* window_handle = nullptr;
+ u32 surface_width = 0;
+ u32 surface_height = 0;
+ SurfaceFormat surface_format = SurfaceFormat::RGB8;
+};
diff --git a/src/core/gpu_hw_opengl.cpp b/src/core/gpu_hw_opengl.cpp
index 4ade9d2dd..ee955a201 100644
--- a/src/core/gpu_hw_opengl.cpp
+++ b/src/core/gpu_hw_opengl.cpp
@@ -155,15 +155,6 @@ std::tuple GPU_HW_OpenGL::ConvertToFramebufferCoordinates(s32 x, s32 y
void GPU_HW_OpenGL::SetCapabilities(HostDisplay* host_display)
{
- Log_InfoPrintf("Context Type: %s", IsGLES() ? "OpenGL ES" : "OpenGL");
-
- const char* gl_vendor = reinterpret_cast(glGetString(GL_VENDOR));
- const char* gl_renderer = reinterpret_cast(glGetString(GL_RENDERER));
- const char* gl_version = reinterpret_cast(glGetString(GL_VERSION));
- Log_InfoPrintf("GL_VENDOR: %s", gl_vendor);
- Log_InfoPrintf("GL_RENDERER: %s", gl_renderer);
- Log_InfoPrintf("GL_VERSION: %s", gl_version);
-
GLint max_texture_size = VRAM_WIDTH;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size);
Log_InfoPrintf("Max texture size: %dx%d", max_texture_size, max_texture_size);
diff --git a/src/duckstation-qt/CMakeLists.txt b/src/duckstation-qt/CMakeLists.txt
index a0187b38f..02105ba4a 100644
--- a/src/duckstation-qt/CMakeLists.txt
+++ b/src/duckstation-qt/CMakeLists.txt
@@ -58,6 +58,7 @@ add_executable(duckstation-qt
settingsdialog.ui
)
+target_include_directories(duckstation-qt PRIVATE "${Qt5Gui_PRIVATE_INCLUDE_DIRS}")
target_link_libraries(duckstation-qt PRIVATE frontend-common core common imgui glad minizip scmversion Qt5::Core Qt5::Gui Qt5::Widgets Qt5::Network)
if(WIN32)
@@ -89,9 +90,4 @@ if(WIN32)
add_custom_command(TARGET duckstation-qt POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/qt.conf.win" "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/qt.conf"
)
-else()
- if(OpenGL_GLX_FOUND)
- target_compile_definitions(duckstation-qt PRIVATE "HAS_GLX")
- target_link_libraries(duckstation-qt PRIVATE OpenGL::GLX)
- endif()
endif()
diff --git a/src/duckstation-qt/mainwindow.cpp b/src/duckstation-qt/mainwindow.cpp
index 661120071..9e0c95c4b 100644
--- a/src/duckstation-qt/mainwindow.cpp
+++ b/src/duckstation-qt/mainwindow.cpp
@@ -102,14 +102,14 @@ void MainWindow::createDisplay(QThread* worker_thread, bool use_debug_device, bo
return;
}
- if (!m_host_display->createSurface() || !m_host_display->makeDeviceContextCurrent())
+ if (!m_host_display->createSurface())
{
reportError(tr("Failed to create host display surface."));
m_host_display->destroyDeviceContext();
return;
}
- m_host_display->moveContextToThread(worker_thread);
+ m_host_display->deactivateDeviceContext();
}
void MainWindow::updateDisplay(QThread* worker_thread, bool fullscreen, bool render_to_main)
@@ -117,10 +117,7 @@ void MainWindow::updateDisplay(QThread* worker_thread, bool fullscreen, bool ren
const bool is_fullscreen = m_display_widget->isFullScreen();
const bool is_rendering_to_main = (!is_fullscreen && m_display_widget->parent());
if (fullscreen == is_fullscreen && is_rendering_to_main == render_to_main)
- {
- m_host_display->moveContextToThread(worker_thread);
return;
- }
m_host_display->destroySurface();
@@ -160,8 +157,6 @@ void MainWindow::updateDisplay(QThread* worker_thread, bool fullscreen, bool ren
QSignalBlocker blocker(m_ui.actionFullscreen);
m_ui.actionFullscreen->setChecked(fullscreen);
-
- m_host_display->moveContextToThread(worker_thread);
}
void MainWindow::destroyDisplay()
diff --git a/src/duckstation-qt/openglhostdisplay.cpp b/src/duckstation-qt/openglhostdisplay.cpp
index 1ceb1e21e..78a12b0c3 100644
--- a/src/duckstation-qt/openglhostdisplay.cpp
+++ b/src/duckstation-qt/openglhostdisplay.cpp
@@ -10,87 +10,12 @@
#include
#include
#include
+#if !defined(WIN32) && !defined(APPLE)
+#include
+#endif
#include
Log_SetChannel(OpenGLHostDisplay);
-static thread_local QOpenGLContext* s_thread_gl_context;
-
-static void* GetProcAddressCallback(const char* name)
-{
- QOpenGLContext* ctx = s_thread_gl_context;
- if (!ctx)
- return nullptr;
-
- return (void*)ctx->getProcAddress(name);
-}
-
-#if defined(WIN32)
-#include "common/windows_headers.h"
-#elif defined(HAS_GLX)
-#include
-#endif
-
-/// Changes the swap interval on a window. Since Qt doesn't expose this functionality, we need to change it manually
-/// ourselves it by calling system-specific functions. Assumes the context is current.
-static void SetSwapInterval(QOpenGLContext* context, int interval)
-{
- static QOpenGLContext* last_context = nullptr;
-
-#ifdef WIN32
- static void(WINAPI * wgl_swap_interval_ext)(int) = nullptr;
-
- if (last_context != context)
- {
- wgl_swap_interval_ext = nullptr;
- last_context = context;
-
- HMODULE gl_module = GetModuleHandleA("opengl32.dll");
- if (!gl_module)
- return;
-
- const auto wgl_get_proc_address =
- reinterpret_cast(GetProcAddress(gl_module, "wglGetProcAddress"));
- if (!wgl_get_proc_address)
- return;
-
- wgl_swap_interval_ext =
- reinterpret_cast(wgl_get_proc_address("wglSwapIntervalEXT"));
- }
-
- if (wgl_swap_interval_ext)
- wgl_swap_interval_ext(interval);
-#elif __linux__
- const QString platform_name(QGuiApplication::platformName());
- if (platform_name == QStringLiteral("xcb"))
- {
- static void (*glx_swap_interval_ext)(Display*, GLXDrawable, int) = nullptr;
-
- if (last_context != context)
- {
- glx_swap_interval_ext = nullptr;
- last_context = context;
-
- glx_swap_interval_ext = reinterpret_cast(
- glXGetProcAddress(reinterpret_cast("glXSwapIntervalEXT")));
- if (!glx_swap_interval_ext)
- return;
- }
-
- if (!glx_swap_interval_ext)
- return;
-
- Display* dpy = glXGetCurrentDisplay();
- GLXDrawable drawable = glXGetCurrentDrawable();
- if (dpy && drawable != GLX_NONE)
- glx_swap_interval_ext(dpy, drawable, interval);
- }
- else
- {
- qCritical() << "Unknown platform: " << platform_name;
- }
-#endif
-}
-
class OpenGLDisplayWidgetTexture : public HostDisplayTexture
{
public:
@@ -148,7 +73,7 @@ QtDisplayWidget* OpenGLHostDisplay::createWidget(QWidget* parent)
HostDisplay::RenderAPI OpenGLHostDisplay::GetRenderAPI() const
{
- return m_gl_context->isOpenGLES() ? HostDisplay::RenderAPI::OpenGLES : HostDisplay::RenderAPI::OpenGL;
+ return m_gl_context->IsGLES() ? HostDisplay::RenderAPI::OpenGLES : HostDisplay::RenderAPI::OpenGL;
}
void* OpenGLHostDisplay::GetRenderDevice() const
@@ -161,6 +86,12 @@ void* OpenGLHostDisplay::GetRenderContext() const
return m_gl_context.get();
}
+void OpenGLHostDisplay::WindowResized(s32 new_window_width, s32 new_window_height)
+{
+ QtHostDisplay::WindowResized(new_window_width, new_window_height);
+ m_gl_context->ResizeSurface(static_cast(new_window_width), static_cast(new_window_height));
+}
+
std::unique_ptr OpenGLHostDisplay::CreateTexture(u32 width, u32 height, const void* initial_data,
u32 initial_data_stride, bool dynamic)
{
@@ -213,13 +144,13 @@ void OpenGLHostDisplay::SetVSync(bool enabled)
GLint current_fbo = 0;
glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, ¤t_fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
- SetSwapInterval(m_gl_context.get(), enabled ? 1 : 0);
+ m_gl_context->SetSwapInterval(enabled ? 1 : 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo);
}
const char* OpenGLHostDisplay::GetGLSLVersionString() const
{
- if (m_gl_context->isOpenGLES())
+ if (m_gl_context->IsGLES())
{
if (GLAD_GL_ES_VERSION_3_0)
return "#version 300 es";
@@ -239,7 +170,7 @@ std::string OpenGLHostDisplay::GetGLSLVersionHeader() const
{
std::string header = GetGLSLVersionString();
header += "\n\n";
- if (m_gl_context->isOpenGLES())
+ if (m_gl_context->IsGLES())
{
header += "precision highp float;\n";
header += "precision highp int;\n\n";
@@ -273,80 +204,60 @@ bool OpenGLHostDisplay::hasDeviceContext() const
return static_cast(m_gl_context);
}
+WindowInfo OpenGLHostDisplay::getWindowInfo() const
+{
+ WindowInfo wi;
+
+ // Windows and Apple are easy here since there's no display connection.
+#if defined(WIN32)
+ wi.type = WindowInfo::Type::Win32;
+ wi.window_handle = reinterpret_cast(m_widget->winId());
+#elif defined(__APPLE__)
+ wi.type = WindowInfo::Type::MacOS;
+ wi.window_handle = reinterpret_cast(m_widget->winId());
+#else
+ QPlatformNativeInterface* pni = QGuiApplication::platformNativeInterface();
+ const QString platform_name = QGuiApplication::platformName();
+ if (platform_name == QStringLiteral("xcb"))
+ {
+ wi.type = WindowInfo::Type::X11;
+ wi.display_connection = pni->nativeResourceForWindow("display", m_widget->windowHandle());
+ wi.window_handle = reinterpret_cast(m_widget->winId());
+ }
+ else if (platform_name == QStringLiteral("wayland"))
+ {
+ wi.type = WindowInfo::Type::Wayland;
+ wi.display_connection = pni->nativeResourceForWindow("display", m_widget->windowHandle());
+ wi.window_handle = pni->nativeResourceForWindow("surface", m_widget->windowHandle());
+ }
+ else
+ {
+ qCritical() << "Unknown PNI platform " << platform_name;
+ return wi;
+ }
+#endif
+
+ wi.surface_width = m_widget->width();
+ wi.surface_height = m_widget->height();
+ wi.surface_format = WindowInfo::SurfaceFormat::RGB8;
+
+ return wi;
+}
+
bool OpenGLHostDisplay::createDeviceContext(bool debug_device)
{
- m_gl_context = std::make_unique();
-
- // Prefer a desktop OpenGL context where possible. If we can't get this, try OpenGL ES.
- static constexpr std::array, 11> desktop_versions_to_try = {
- {{4, 6}, {4, 5}, {4, 4}, {4, 3}, {4, 2}, {4, 1}, {4, 0}, {3, 3}, {3, 2}, {3, 1}, {3, 0}}};
- static constexpr std::array, 4> es_versions_to_try = {{{3, 2}, {3, 1}, {3, 0}}};
-
- QSurfaceFormat surface_format; // = requestedFormat();
- surface_format.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
- surface_format.setSwapInterval(0);
- surface_format.setRenderableType(QSurfaceFormat::OpenGL);
- surface_format.setProfile(QSurfaceFormat::CoreProfile);
- if (debug_device)
- surface_format.setOption(QSurfaceFormat::DebugContext);
-
- for (const auto [major, minor] : desktop_versions_to_try)
- {
- surface_format.setVersion(major, minor);
- m_gl_context->setFormat(surface_format);
- if (m_gl_context->create())
- break;
- }
-
- if (!m_gl_context->isValid())
- {
- // try forcing ES
- surface_format.setRenderableType(QSurfaceFormat::OpenGLES);
- surface_format.setProfile(QSurfaceFormat::NoProfile);
- if (debug_device)
- surface_format.setOption(QSurfaceFormat::DebugContext, false);
-
- for (const auto [major, minor] : es_versions_to_try)
- {
- surface_format.setVersion(major, minor);
- m_gl_context->setFormat(surface_format);
- if (m_gl_context->create())
- break;
- }
- }
-
- if (!m_gl_context->isValid())
+ m_gl_context = GL::Context::Create(getWindowInfo());
+ if (!m_gl_context)
{
Log_ErrorPrintf("Failed to create any GL context");
- m_gl_context.reset();
return false;
}
- surface_format = m_gl_context->format();
- Log_InfoPrintf("Got a %s %d.%d context", (m_gl_context->isOpenGLES() ? "OpenGL ES" : "desktop OpenGL"),
- surface_format.majorVersion(), surface_format.minorVersion());
-
return true;
}
bool OpenGLHostDisplay::initializeDeviceContext(bool debug_device)
{
- if (!m_gl_context->makeCurrent(m_widget->windowHandle()))
- return false;
-
- s_thread_gl_context = m_gl_context.get();
-
- // Load GLAD.
- const auto load_result =
- m_gl_context->isOpenGLES() ? gladLoadGLES2Loader(GetProcAddressCallback) : gladLoadGLLoader(GetProcAddressCallback);
- if (!load_result)
- {
- Log_ErrorPrintf("Failed to load GL functions");
- s_thread_gl_context = nullptr;
- m_gl_context->doneCurrent();
- return false;
- }
-
if (debug_device && GLAD_GL_KHR_debug)
{
glad_glDebugMessageCallbackKHR(GLDebugCallback, nullptr);
@@ -356,17 +267,16 @@ bool OpenGLHostDisplay::initializeDeviceContext(bool debug_device)
if (!QtHostDisplay::initializeDeviceContext(debug_device))
{
- s_thread_gl_context = nullptr;
- m_gl_context->doneCurrent();
+ m_gl_context->DoneCurrent();
return false;
}
return true;
}
-bool OpenGLHostDisplay::makeDeviceContextCurrent()
+bool OpenGLHostDisplay::activateDeviceContext()
{
- if (!m_gl_context->makeCurrent(m_widget->windowHandle()))
+ if (!m_gl_context->MakeCurrent())
{
Log_ErrorPrintf("Failed to make GL context current");
return false;
@@ -375,20 +285,15 @@ bool OpenGLHostDisplay::makeDeviceContextCurrent()
return true;
}
-void OpenGLHostDisplay::moveContextToThread(QThread* new_thread)
+void OpenGLHostDisplay::deactivateDeviceContext()
{
- m_gl_context->doneCurrent();
- m_gl_context->moveToThread(new_thread);
+ m_gl_context->DoneCurrent();
}
void OpenGLHostDisplay::destroyDeviceContext()
{
- Assert(m_gl_context && s_thread_gl_context == m_gl_context.get());
-
QtHostDisplay::destroyDeviceContext();
-
- s_thread_gl_context = nullptr;
- m_gl_context->doneCurrent();
+ m_gl_context->DoneCurrent();
m_gl_context.reset();
}
@@ -397,6 +302,10 @@ bool OpenGLHostDisplay::createSurface()
m_window_width = m_widget->scaledWindowWidth();
m_window_height = m_widget->scaledWindowHeight();
emit m_widget->windowResizedEvent(m_window_width, m_window_height);
+
+ if (m_gl_context)
+ m_gl_context->ChangeSurface(getWindowInfo());
+
return true;
}
@@ -455,7 +364,7 @@ void main()
return false;
}
- if (!m_gl_context->isOpenGLES())
+ if (!m_gl_context->IsGLES())
m_display_program.BindFragData(0, "o_col0");
if (!m_display_program.Link())
@@ -508,9 +417,7 @@ void OpenGLHostDisplay::Render()
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
- QWindow* window_handle = m_widget->windowHandle();
- m_gl_context->makeCurrent(window_handle);
- m_gl_context->swapBuffers(window_handle);
+ m_gl_context->SwapBuffers();
ImGui::NewFrame();
ImGui_ImplOpenGL3_NewFrame();
diff --git a/src/duckstation-qt/openglhostdisplay.h b/src/duckstation-qt/openglhostdisplay.h
index f8728d2ef..7a3eaac41 100644
--- a/src/duckstation-qt/openglhostdisplay.h
+++ b/src/duckstation-qt/openglhostdisplay.h
@@ -8,12 +8,13 @@
#define __glext_h_
#endif
+#include "common/gl/context.h"
#include "common/gl/program.h"
#include "common/gl/texture.h"
+#include "common/window_info.h"
#include "core/host_display.h"
#include "qtdisplaywidget.h"
#include "qthostdisplay.h"
-#include
#include
class QtHostInterface;
@@ -29,8 +30,8 @@ public:
bool hasDeviceContext() const override;
bool createDeviceContext(bool debug_device) override;
bool initializeDeviceContext(bool debug_device) override;
- bool makeDeviceContextCurrent() override;
- void moveContextToThread(QThread* new_thread) override;
+ bool activateDeviceContext() override;
+ void deactivateDeviceContext() override;
void destroyDeviceContext() override;
bool createSurface() override;
void destroySurface();
@@ -38,6 +39,7 @@ public:
RenderAPI GetRenderAPI() const override;
void* GetRenderDevice() const override;
void* GetRenderContext() const override;
+ void WindowResized(s32 new_window_width, s32 new_window_height) override;
std::unique_ptr CreateTexture(u32 width, u32 height, const void* initial_data,
u32 initial_data_stride, bool dynamic) override;
@@ -54,6 +56,8 @@ private:
const char* GetGLSLVersionString() const;
std::string GetGLSLVersionHeader() const;
+ WindowInfo getWindowInfo() const;
+
bool createImGuiContext() override;
void destroyImGuiContext() override;
bool createDeviceResources() override;
@@ -61,7 +65,7 @@ private:
void renderDisplay();
- std::unique_ptr m_gl_context = nullptr;
+ std::unique_ptr m_gl_context = nullptr;
GL::Program m_display_program;
GLuint m_display_vao = 0;
diff --git a/src/duckstation-qt/qthostdisplay.cpp b/src/duckstation-qt/qthostdisplay.cpp
index 82b455838..c343611df 100644
--- a/src/duckstation-qt/qthostdisplay.cpp
+++ b/src/duckstation-qt/qthostdisplay.cpp
@@ -50,12 +50,12 @@ bool QtHostDisplay::initializeDeviceContext(bool debug_device)
return true;
}
-bool QtHostDisplay::makeDeviceContextCurrent()
+bool QtHostDisplay::activateDeviceContext()
{
return true;
}
-void QtHostDisplay::moveContextToThread(QThread* new_thread) {}
+void QtHostDisplay::deactivateDeviceContext() {}
void QtHostDisplay::destroyDeviceContext()
{
diff --git a/src/duckstation-qt/qthostdisplay.h b/src/duckstation-qt/qthostdisplay.h
index 3a303f463..285291ad9 100644
--- a/src/duckstation-qt/qthostdisplay.h
+++ b/src/duckstation-qt/qthostdisplay.h
@@ -23,8 +23,8 @@ public:
virtual bool hasDeviceContext() const;
virtual bool createDeviceContext(bool debug_device);
virtual bool initializeDeviceContext(bool debug_device);
- virtual bool makeDeviceContextCurrent();
- virtual void moveContextToThread(QThread* new_thread);
+ virtual bool activateDeviceContext();
+ virtual void deactivateDeviceContext();
virtual void destroyDeviceContext();
virtual bool createSurface();
virtual void destroySurface();
diff --git a/src/duckstation-qt/qthostinterface.cpp b/src/duckstation-qt/qthostinterface.cpp
index 22718173c..b8b2da063 100644
--- a/src/duckstation-qt/qthostinterface.cpp
+++ b/src/duckstation-qt/qthostinterface.cpp
@@ -317,7 +317,7 @@ bool QtHostInterface::AcquireHostDisplay()
return false;
}
- if (!getHostDisplay()->makeDeviceContextCurrent() ||
+ if (!getHostDisplay()->activateDeviceContext() ||
!getHostDisplay()->initializeDeviceContext(m_settings.gpu_use_debug_device))
{
getHostDisplay()->destroyDeviceContext();
@@ -366,9 +366,9 @@ void QtHostInterface::disconnectDisplaySignals()
void QtHostInterface::updateDisplayState()
{
// this expects the context to get moved back to us afterwards
- getHostDisplay()->moveContextToThread(m_original_thread);
+ getHostDisplay()->deactivateDeviceContext();
emit updateDisplayRequested(m_worker_thread, m_is_fullscreen, m_is_rendering_to_main);
- if (!getHostDisplay()->makeDeviceContextCurrent())
+ if (!getHostDisplay()->activateDeviceContext())
Panic("Failed to make device context current after updating");
getHostDisplay()->updateImGuiDisplaySize();
diff --git a/src/duckstation-sdl/opengl_host_display.cpp b/src/duckstation-sdl/opengl_host_display.cpp
index 935a44c51..bb5cb4ceb 100644
--- a/src/duckstation-sdl/opengl_host_display.cpp
+++ b/src/duckstation-sdl/opengl_host_display.cpp
@@ -2,12 +2,24 @@
#include "common/assert.h"
#include "common/log.h"
#include "imgui_impl_sdl.h"
+#include
#include
#include
#include
#include
Log_SetChannel(OpenGLHostDisplay);
+#ifdef __APPLE__
+#include
+struct NSView;
+
+static NSView* GetContentViewFromWindow(NSWindow* window)
+{
+ // window.contentView
+ return reinterpret_cast(objc_msgSend)(reinterpret_cast(window), sel_getUid("contentView"));
+}
+#endif
+
class OpenGLDisplayWidgetTexture : public HostDisplayTexture
{
public:
@@ -67,8 +79,7 @@ OpenGLHostDisplay::~OpenGLHostDisplay()
m_display_program.Destroy();
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplSDL2_Shutdown();
- SDL_GL_MakeCurrent(nullptr, nullptr);
- SDL_GL_DeleteContext(m_gl_context);
+ m_gl_context.reset();
}
if (m_window)
@@ -77,7 +88,7 @@ OpenGLHostDisplay::~OpenGLHostDisplay()
HostDisplay::RenderAPI OpenGLHostDisplay::GetRenderAPI() const
{
- return m_is_gles ? HostDisplay::RenderAPI::OpenGLES : HostDisplay::RenderAPI::OpenGL;
+ return m_gl_context->IsGLES() ? HostDisplay::RenderAPI::OpenGLES : HostDisplay::RenderAPI::OpenGL;
}
void* OpenGLHostDisplay::GetRenderDevice() const
@@ -87,13 +98,15 @@ void* OpenGLHostDisplay::GetRenderDevice() const
void* OpenGLHostDisplay::GetRenderContext() const
{
- return m_gl_context;
+ return m_gl_context.get();
}
void OpenGLHostDisplay::WindowResized(s32 new_window_width, s32 new_window_height)
{
HostDisplay::WindowResized(new_window_width, new_window_height);
- SDL_GL_GetDrawableSize(m_window, &m_window_width, &m_window_height);
+ m_gl_context->ResizeSurface(static_cast(new_window_width), static_cast(new_window_height));
+ m_window_width = static_cast(m_gl_context->GetSurfaceWidth());
+ m_window_height = static_cast(m_gl_context->GetSurfaceHeight());
ImGui::GetIO().DisplaySize.x = static_cast(m_window_width);
ImGui::GetIO().DisplaySize.y = static_cast(m_window_height);
}
@@ -150,13 +163,13 @@ void OpenGLHostDisplay::SetVSync(bool enabled)
GLint current_fbo = 0;
glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, ¤t_fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
- SDL_GL_SetSwapInterval(enabled ? 1 : 0);
+ m_gl_context->SetSwapInterval(enabled ? 1 : 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, current_fbo);
}
const char* OpenGLHostDisplay::GetGLSLVersionString() const
{
- if (m_is_gles)
+ if (m_gl_context->IsGLES())
{
if (GLAD_GL_ES_VERSION_3_0)
return "#version 300 es";
@@ -176,7 +189,7 @@ std::string OpenGLHostDisplay::GetGLSLVersionHeader() const
{
std::string header = GetGLSLVersionString();
header += "\n\n";
- if (m_is_gles)
+ if (m_gl_context->IsGLES())
{
header += "precision highp float;\n";
header += "precision highp int;\n\n";
@@ -207,64 +220,55 @@ static void APIENTRY GLDebugCallback(GLenum source, GLenum type, GLuint id, GLen
bool OpenGLHostDisplay::CreateGLContext(bool debug_device)
{
- // Prefer a desktop OpenGL context where possible. If we can't get this, try OpenGL ES.
- static constexpr std::array, 11> desktop_versions_to_try = {
- {{4, 6}, {4, 5}, {4, 4}, {4, 3}, {4, 2}, {4, 1}, {4, 0}, {3, 3}, {3, 2}, {3, 1}, {3, 0}}};
- static constexpr std::array, 4> es_versions_to_try = {{{3, 2}, {3, 1}, {3, 0}}};
-
- SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
- if (debug_device)
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_DEBUG_FLAG);
-
- for (const auto [major, minor] : desktop_versions_to_try)
+ SDL_SysWMinfo syswm = {};
+ SDL_VERSION(&syswm.version);
+ if (!SDL_GetWindowWMInfo(m_window, &syswm))
{
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor);
-
- Log_InfoPrintf("Trying a Desktop OpenGL %d.%d context", major, minor);
- m_gl_context = SDL_GL_CreateContext(m_window);
- if (m_gl_context)
- {
- Log_InfoPrintf("Got a desktop OpenGL %d.%d context", major, minor);
- break;
- }
- }
-
- if (!m_gl_context)
- {
- // try es
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0);
-
- for (const auto [major, minor] : es_versions_to_try)
- {
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor);
-
- Log_InfoPrintf("Trying a OpenGL ES %d.%d context", major, minor);
- m_gl_context = SDL_GL_CreateContext(m_window);
- if (m_gl_context)
- {
- Log_InfoPrintf("Got a OpenGL ES %d.%d context", major, minor);
- m_is_gles = true;
- break;
- }
- }
- }
-
- if (!m_gl_context || SDL_GL_MakeCurrent(m_window, m_gl_context) != 0)
- {
- Log_ErrorPrintf("Failed to create any GL context");
+ Log_ErrorPrintf("SDL_GetWindowWMInfo failed");
return false;
}
- // Load GLAD.
- const auto load_result =
- m_is_gles ? gladLoadGLES2Loader(SDL_GL_GetProcAddress) : gladLoadGLLoader(SDL_GL_GetProcAddress);
- if (!load_result)
+ int window_width, window_height;
+ SDL_GetWindowSize(m_window, &window_width, &window_height);
+
+ WindowInfo wi;
+ wi.surface_width = static_cast(window_width);
+ wi.surface_height = static_cast(window_height);
+ wi.surface_format = WindowInfo::SurfaceFormat::RGB8;
+
+ switch (syswm.subsystem)
{
- Log_ErrorPrintf("Failed to load GL functions");
+#ifdef SDL_VIDEO_DRIVER_WINDOWS
+ case SDL_SYSWM_WINDOWS:
+ wi.type = WindowInfo::Type::Win32;
+ wi.window_handle = syswm.info.win.window;
+ break;
+#endif
+
+#ifdef SDL_VIDEO_DRIVER_COCOA
+ case SDL_SYSWM_COCOA:
+ wi.type = WindowInfo::Type::MacOS;
+ wi.window_handle = GetContentViewFromWindow(syswm.info.cocoa.window);
+ break;
+#endif
+
+#ifdef SDL_VIDEO_DRIVER_X11
+ case SDL_SYSWM_X11:
+ wi.type = WindowInfo::Type::X11;
+ wi.window_handle = reinterpret_cast(static_cast(syswm.info.x11.window));
+ wi.display_connection = syswm.info.x11.display;
+ break;
+#endif
+
+ default:
+ Log_ErrorPrintf("Unhandled syswm subsystem %u", static_cast(syswm.subsystem));
+ return false;
+ }
+
+ m_gl_context = GL::Context::Create(wi);
+ if (!m_gl_context)
+ {
+ Log_ErrorPrintf("Failed to create a GL context of any kind.");
return false;
}
@@ -276,10 +280,11 @@ bool OpenGLHostDisplay::CreateGLContext(bool debug_device)
}
// this can change due to retina scaling on macos?
- SDL_GL_GetDrawableSize(m_window, &m_window_width, &m_window_height);
+ m_window_width = static_cast(m_gl_context->GetSurfaceWidth());
+ m_window_height = static_cast(m_gl_context->GetSurfaceHeight());
// start with vsync on
- SDL_GL_SetSwapInterval(1);
+ m_gl_context->SetSwapInterval(1);
return true;
}
@@ -288,7 +293,7 @@ bool OpenGLHostDisplay::CreateImGuiContext()
ImGui::GetIO().DisplaySize.x = static_cast(m_window_width);
ImGui::GetIO().DisplaySize.y = static_cast(m_window_height);
- if (!ImGui_ImplSDL2_InitForOpenGL(m_window, m_gl_context) || !ImGui_ImplOpenGL3_Init(GetGLSLVersionString()))
+ if (!ImGui_ImplSDL2_InitForOpenGL(m_window, nullptr) || !ImGui_ImplOpenGL3_Init(GetGLSLVersionString()))
return false;
ImGui_ImplOpenGL3_NewFrame();
@@ -329,7 +334,7 @@ void main()
return false;
}
- if (!m_is_gles)
+ if (!m_gl_context->IsGLES())
m_display_program.BindFragData(0, "o_col0");
if (!m_display_program.Link())
@@ -377,7 +382,7 @@ void OpenGLHostDisplay::Render()
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
- SDL_GL_SwapWindow(m_window);
+ m_gl_context->SwapBuffers();
ImGui::NewFrame();
ImGui_ImplSDL2_NewFrame(m_window);
diff --git a/src/duckstation-sdl/opengl_host_display.h b/src/duckstation-sdl/opengl_host_display.h
index 42d97d9fa..954989192 100644
--- a/src/duckstation-sdl/opengl_host_display.h
+++ b/src/duckstation-sdl/opengl_host_display.h
@@ -1,4 +1,5 @@
#pragma once
+#include "common/gl/context.h"
#include "common/gl/program.h"
#include "common/gl/texture.h"
#include "core/host_display.h"
@@ -41,12 +42,10 @@ private:
void RenderDisplay();
SDL_Window* m_window = nullptr;
- SDL_GLContext m_gl_context = nullptr;
+ std::unique_ptr m_gl_context;
GL::Program m_display_program;
GLuint m_display_vao = 0;
GLuint m_display_nearest_sampler = 0;
GLuint m_display_linear_sampler = 0;
-
- bool m_is_gles = false;
};
diff --git a/src/duckstation-sdl/sdl_host_interface.cpp b/src/duckstation-sdl/sdl_host_interface.cpp
index 7a6053b73..9ceb6a3af 100644
--- a/src/duckstation-sdl/sdl_host_interface.cpp
+++ b/src/duckstation-sdl/sdl_host_interface.cpp
@@ -81,8 +81,7 @@ bool SDLHostInterface::CreateSDLWindow()
static constexpr u32 DEFAULT_WINDOW_HEIGHT = 700;
// Create window.
- const u32 window_flags =
- SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI | (UseOpenGLRenderer() ? SDL_WINDOW_OPENGL : 0);
+ const u32 window_flags = SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI;
u32 window_width = DEFAULT_WINDOW_WIDTH;
u32 window_height = DEFAULT_WINDOW_HEIGHT;
@@ -116,6 +115,8 @@ bool SDLHostInterface::CreateSDLWindow()
if (m_fullscreen)
SDL_SetWindowFullscreen(m_window, SDL_WINDOW_FULLSCREEN_DESKTOP);
+ // Process events so that we have everything sorted out before creating a child window for the GL context (X11).
+ SDL_PumpEvents();
return true;
}
@@ -818,7 +819,7 @@ void SDLHostInterface::DrawDebugMenu()
for (u32 i = LOGLEVEL_NONE; i < LOGLEVEL_COUNT; i++)
{
if (ImGui::MenuItem(Settings::GetLogLevelDisplayName(static_cast(i)), nullptr,
- m_settings.log_level == static_cast(i)))
+ m_settings.log_level == static_cast(i)))
{
m_settings_copy.log_level = static_cast(i);
settings_changed = true;