[Mesa-dev] [PATCH] EGL: Implement the libglvnd interface for EGL (v2)

Kyle Brenneman kbrenneman at nvidia.com
Wed Jan 4 18:31:58 UTC 2017


Added separate --enable-libglvnd-glx and --enable-libglvnd-egl configure
options to enable libglvnd for GLX and EGL. The existing --enable-libglvnd
option will now enable both EGL and GLX.

The new interface mostly just sits on top of the existing library. The only
change to the existing EGL code is to split the client extension string into
platform extensions and everything else. On non-glvnd builds, eglQueryString
will just concatenate the two strings.

The EGL dispatch stubs are all generated. The script is based on the one used
to generate entrypoints in libglvnd itself.

v2:

Rebased against master.

Reworked the EGL makefile to use separate libtool targets instead of an
automake substitution "lib at EGL_LIB@_la_*" in the variable names. Using the
substitution broke automake's dependency tracking for "make dist".

Made the EGL code generation scripts work with Python 2 or 3.

Change gen_egl_dispatch.py to use argparse for the command line arguments.

Assorted formatting and style cleanup in the Python scripts.
---
 configure.ac                         |  154 ++-
 src/egl/Makefile.am                  |   97 +-
 src/egl/generate/egl.xml             | 2412 ++++++++++++++++++++++++++++++++++
 src/egl/generate/eglFunctionList.py  |  197 +++
 src/egl/generate/egl_other.xml       |   47 +
 src/egl/generate/genCommon.py        |  223 ++++
 src/egl/generate/gen_egl_dispatch.py |  250 ++++
 src/egl/main/50_mesa.json            |    6 +
 src/egl/main/eglapi.c                |    6 +-
 src/egl/main/egldispatchstubs.c      |  110 ++
 src/egl/main/egldispatchstubs.h      |   26 +
 src/egl/main/eglglobals.c            |   47 +-
 src/egl/main/eglglobals.h            |   13 +-
 src/egl/main/eglglvnd.c              |   82 ++
 14 files changed, 3576 insertions(+), 94 deletions(-)
 create mode 100755 src/egl/generate/egl.xml
 create mode 100644 src/egl/generate/eglFunctionList.py
 create mode 100644 src/egl/generate/egl_other.xml
 create mode 100644 src/egl/generate/genCommon.py
 create mode 100755 src/egl/generate/gen_egl_dispatch.py
 create mode 100644 src/egl/main/50_mesa.json
 create mode 100644 src/egl/main/egldispatchstubs.c
 create mode 100644 src/egl/main/egldispatchstubs.h
 create mode 100644 src/egl/main/eglglvnd.c

diff --git a/configure.ac b/configure.ac
index 799f5eb..e883259 100644
--- a/configure.ac
+++ b/configure.ac
@@ -529,8 +529,6 @@ else
    DEFINES="$DEFINES -DNDEBUG"
 fi
 
-DEFAULT_GL_LIB_NAME=GL
-
 dnl
 dnl Check if linker supports -Bsymbolic
 dnl
@@ -628,23 +626,6 @@ esac
 
 AM_CONDITIONAL(HAVE_COMPAT_SYMLINKS, test "x$HAVE_COMPAT_SYMLINKS" = xyes)
 
-DEFAULT_GL_LIB_NAME=GL
-
-dnl
-dnl Libglvnd configuration
-dnl
-AC_ARG_ENABLE([libglvnd],
-    [AS_HELP_STRING([--enable-libglvnd],
-        [Build for libglvnd @<:@default=disabled@:>@])],
-    [enable_libglvnd="$enableval"],
-    [enable_libglvnd=no])
-AM_CONDITIONAL(USE_LIBGLVND_GLX, test "x$enable_libglvnd" = xyes)
-#AM_COND_IF([USE_LIBGLVND_GLX], [DEFINES="${DEFINES} -DUSE_LIBGLVND_GLX=1"])
-if test "x$enable_libglvnd" = xyes ; then
-    DEFINES="${DEFINES} -DUSE_LIBGLVND_GLX=1"
-    DEFAULT_GL_LIB_NAME=GLX_mesa
-fi
-
 dnl
 dnl library names
 dnl
@@ -678,36 +659,6 @@ esac
 
 AC_SUBST([LIB_EXT])
 
-AC_ARG_WITH([gl-lib-name],
-  [AS_HELP_STRING([--with-gl-lib-name@<:@=NAME@:>@],
-    [specify GL library name @<:@default=GL@:>@])],
-  [GL_LIB=$withval],
-  [GL_LIB="$DEFAULT_GL_LIB_NAME"])
-AC_ARG_WITH([osmesa-lib-name],
-  [AS_HELP_STRING([--with-osmesa-lib-name@<:@=NAME@:>@],
-    [specify OSMesa library name @<:@default=OSMesa@:>@])],
-  [OSMESA_LIB=$withval],
-  [OSMESA_LIB=OSMesa])
-AS_IF([test "x$GL_LIB" = xyes], [GL_LIB="$DEFAULT_GL_LIB_NAME"])
-AS_IF([test "x$OSMESA_LIB" = xyes], [OSMESA_LIB=OSMesa])
-
-dnl
-dnl Mangled Mesa support
-dnl
-AC_ARG_ENABLE([mangling],
-  [AS_HELP_STRING([--enable-mangling],
-    [enable mangled symbols and library name @<:@default=disabled@:>@])],
-  [enable_mangling="${enableval}"],
-  [enable_mangling=no]
-)
-if test "x${enable_mangling}" = "xyes" ; then
-  DEFINES="${DEFINES} -DUSE_MGL_NAMESPACE"
-  GL_LIB="Mangled${GL_LIB}"
-  OSMESA_LIB="Mangled${OSMESA_LIB}"
-fi
-AC_SUBST([GL_LIB])
-AC_SUBST([OSMESA_LIB])
-
 dnl
 dnl potentially-infringing-but-nobody-knows-for-sure stuff
 dnl
@@ -1330,31 +1281,94 @@ AM_CONDITIONAL(HAVE_GALLIUM_XLIB_GLX, test "x$enable_glx" = xgallium-xlib)
 dnl
 dnl Libglvnd configuration
 dnl
+
+DEFAULT_GL_LIB_NAME=GL
+
 AC_ARG_ENABLE([libglvnd],
     [AS_HELP_STRING([--enable-libglvnd],
-        [Build for libglvnd @<:@default=disabled@:>@])],
+        [Build GLX and EGL for libglvnd @<:@default=disabled@:>@])],
     [enable_libglvnd="$enableval"],
     [enable_libglvnd=no])
-AM_CONDITIONAL(USE_LIBGLVND_GLX, test "x$enable_libglvnd" = xyes)
-if test "x$enable_libglvnd" = xyes ; then
-    dnl XXX: update once we can handle more than libGL/glx.
-    dnl Namely: we should error out if neither of the glvnd enabled libraries
-    dnl are built
-    case "x$enable_glx" in
-    xno)
-        AC_MSG_ERROR([cannot build libglvnd without GLX])
-        ;;
-    xxlib | xgallium-xlib )
-        AC_MSG_ERROR([cannot build libgvnd when Xlib-GLX or Gallium-Xlib-GLX is enabled])
-        ;;
-    xdri)
-        ;;
-    esac
+AM_CONDITIONAL(USE_LIBGLVND_GLX, test "x$enable_libglvnd_glx" = xyes)
+
+AC_ARG_ENABLE([libglvnd-glx],
+    [AS_HELP_STRING([--enable-libglvnd-glx],
+        [Build GLX for libglvnd @<:@default=disabled@:>@])],
+    [enable_libglvnd_glx="$enableval"],
+    [enable_libglvnd_glx="$enable_libglvnd"])
+AM_CONDITIONAL(USE_LIBGLVND_GLX, test "x$enable_libglvnd_glx" = xyes)
+
+AC_ARG_ENABLE([libglvnd-egl],
+    [AS_HELP_STRING([--enable-libglvnd-egl],
+        [Build EGL for libglvnd @<:@default=disabled@:>@])],
+    [enable_libglvnd_egl="$enableval"],
+    [enable_libglvnd_egl="$enable_libglvnd"])
+AM_CONDITIONAL(USE_LIBGLVND_EGL, test "x$enable_libglvnd_egl" = xyes)
+
+if test "x$enable_libglvnd_glx" = xyes -o "x$enable_libglvnd_egl" = xyes ; then
+    PKG_CHECK_VAR(LIBGLVND_DATADIR, libglvnd, datadir)
+    AC_SUBST([LIBGLVND_DATADIR])
+
+    if test "x$enable_libglvnd_egl" = xyes ; then
+        PKG_CHECK_MODULES([GLVND], libglvnd >= 0.2.0)
+
+        if test "x$enable_egl" != xyes ; then
+            AC_MSG_ERROR([cannot build libglvnd without EGL])
+        fi
+        DEFINES="${DEFINES} -DUSE_LIBGLVND_EGL=1"
+    else
+        PKG_CHECK_MODULES([GLVND], libglvnd >= 0.1.0)
+    fi
+
+    if test "x$enable_libglvnd_glx" = xyes ; then
+        dnl XXX: update once we can handle more than libGL/glx.
+        dnl Namely: we should error out if neither of the glvnd enabled libraries
+        dnl are built
+        case "x$enable_glx" in
+        xno)
+            AC_MSG_ERROR([cannot build libglvnd without GLX])
+            ;;
+        xxlib | xgallium-xlib )
+            AC_MSG_ERROR([cannot build libgvnd when Xlib-GLX or Gallium-Xlib-GLX is enabled])
+            ;;
+        xdri)
+            ;;
+        esac
+
+        DEFINES="${DEFINES} -DUSE_LIBGLVND_GLX=1"
+        DEFAULT_GL_LIB_NAME=GLX_mesa
+    fi
+fi
+
+AC_ARG_WITH([gl-lib-name],
+  [AS_HELP_STRING([--with-gl-lib-name@<:@=NAME@:>@],
+    [specify GL library name @<:@default=GL@:>@])],
+  [GL_LIB=$withval],
+  [GL_LIB="$DEFAULT_GL_LIB_NAME"])
+AC_ARG_WITH([osmesa-lib-name],
+  [AS_HELP_STRING([--with-osmesa-lib-name@<:@=NAME@:>@],
+    [specify OSMesa library name @<:@default=OSMesa@:>@])],
+  [OSMESA_LIB=$withval],
+  [OSMESA_LIB=OSMesa])
+AS_IF([test "x$GL_LIB" = xyes], [GL_LIB="$DEFAULT_GL_LIB_NAME"])
+AS_IF([test "x$OSMESA_LIB" = xyes], [OSMESA_LIB=OSMesa])
 
-    PKG_CHECK_MODULES([GLVND], libglvnd >= 0.1.0)
-    DEFINES="${DEFINES} -DUSE_LIBGLVND_GLX=1"
-    DEFAULT_GL_LIB_NAME=GLX_mesa
+dnl
+dnl Mangled Mesa support
+dnl
+AC_ARG_ENABLE([mangling],
+  [AS_HELP_STRING([--enable-mangling],
+    [enable mangled symbols and library name @<:@default=disabled@:>@])],
+  [enable_mangling="${enableval}"],
+  [enable_mangling=no]
+)
+if test "x${enable_mangling}" = "xyes" ; then
+  DEFINES="${DEFINES} -DUSE_MGL_NAMESPACE"
+  GL_LIB="Mangled${GL_LIB}"
+  OSMESA_LIB="Mangled${OSMESA_LIB}"
 fi
+AC_SUBST([GL_LIB])
+AC_SUBST([OSMESA_LIB])
 
 # Check for libdrm
 PKG_CHECK_MODULES([LIBDRM], [libdrm >= $LIBDRM_REQUIRED],
@@ -2916,11 +2930,15 @@ xgallium-xlib)
     echo "        GLX:             $enable_glx"
     ;;
 esac
+if test "x$enable_glx" != xno; then
+    echo "        GLX libglvnd:    $enable_libglvnd_glx"
+fi
 
 dnl EGL
 echo ""
 echo "        EGL:             $enable_egl"
 if test "$enable_egl" = yes; then
+    echo "        EGL libglvnd:    $enable_libglvnd_egl"
     echo "        EGL platforms:   $egl_platforms"
 
     egl_drivers=""
diff --git a/src/egl/Makefile.am b/src/egl/Makefile.am
index 7c5abd2..f90ff83 100644
--- a/src/egl/Makefile.am
+++ b/src/egl/Makefile.am
@@ -32,19 +32,16 @@ AM_CFLAGS = \
 	$(EGL_CFLAGS) \
 	-D_EGL_NATIVE_PLATFORM=$(EGL_NATIVE_PLATFORM)
 
-lib_LTLIBRARIES = libEGL.la
-
-libEGL_la_SOURCES = \
+# Depending on whether libglvnd is enabled, we'll build the EGL library as
+# either libEGL.so.1 or libEGL_mesa.so.0. Using an automake substitution
+# in the variable names breaks "make dist" target, so use a conenience library
+# instead.
+noinst_LTLIBRARIES = libEGL_common.la
+libEGL_common_la_SOURCES = \
 	$(LIBEGL_C_FILES)
 
-libEGL_la_LIBADD = \
+libEGL_common_la_LIBADD = \
 	$(EGL_LIB_DEPS)
-libEGL_la_LDFLAGS = \
-	-no-undefined \
-	-version-number 1:0 \
-	$(BSYMBOLIC) \
-	$(GC_SECTIONS) \
-	$(LD_NO_UNDEFINED)
 
 dri2_backend_FILES =
 dri3_backend_FILES =
@@ -52,7 +49,7 @@ dri3_backend_FILES =
 if HAVE_PLATFORM_X11
 AM_CFLAGS += -DHAVE_X11_PLATFORM
 AM_CFLAGS += $(XCB_DRI2_CFLAGS)
-libEGL_la_LIBADD += $(XCB_DRI2_LIBS)
+libEGL_common_la_LIBADD += $(XCB_DRI2_LIBS)
 dri2_backend_FILES += drivers/dri2/platform_x11.c
 
 if HAVE_DRI3
@@ -60,22 +57,22 @@ dri3_backend_FILES += \
 	drivers/dri2/platform_x11_dri3.c \
 	drivers/dri2/platform_x11_dri3.h
 
-libEGL_la_LIBADD += $(top_builddir)/src/loader/libloader_dri3_helper.la
+libEGL_common_la_LIBADD += $(top_builddir)/src/loader/libloader_dri3_helper.la
 endif
 endif
 
 if HAVE_PLATFORM_WAYLAND
 AM_CFLAGS += -DHAVE_WAYLAND_PLATFORM
 AM_CFLAGS += $(WAYLAND_CFLAGS)
-libEGL_la_LIBADD += $(WAYLAND_LIBS)
-libEGL_la_LIBADD += $(LIBDRM_LIBS)
-libEGL_la_LIBADD += $(top_builddir)/src/egl/wayland/wayland-drm/libwayland-drm.la
+libEGL_common_la_LIBADD += $(WAYLAND_LIBS)
+libEGL_common_la_LIBADD += $(LIBDRM_LIBS)
+libEGL_common_la_LIBADD += $(top_builddir)/src/egl/wayland/wayland-drm/libwayland-drm.la
 dri2_backend_FILES += drivers/dri2/platform_wayland.c
 endif
 
 if HAVE_EGL_PLATFORM_DRM
 AM_CFLAGS += -DHAVE_DRM_PLATFORM
-libEGL_la_LIBADD += $(top_builddir)/src/gbm/libgbm.la
+libEGL_common_la_LIBADD += $(top_builddir)/src/gbm/libgbm.la
 dri2_backend_FILES += drivers/dri2/platform_drm.c
 endif
 
@@ -87,7 +84,7 @@ endif
 if HAVE_EGL_PLATFORM_ANDROID
 AM_CFLAGS += -DHAVE_ANDROID_PLATFORM
 AM_CFLAGS += $(ANDROID_CFLAGS)
-libEGL_la_LIBADD += $(ANDROID_LIBS)
+libEGL_common_la_LIBADD += $(ANDROID_LIBS)
 dri2_backend_FILES += drivers/dri2/platform_android.c
 endif
 
@@ -102,15 +99,70 @@ AM_CFLAGS += \
 	-DDEFAULT_DRIVER_DIR=\"$(DRI_DRIVER_SEARCH_DIR)\" \
 	-D_EGL_BUILT_IN_DRIVER_DRI2
 
-libEGL_la_SOURCES += \
+libEGL_common_la_SOURCES += \
 	$(dri2_backend_core_FILES) \
 	$(dri2_backend_FILES) \
 	$(dri3_backend_FILES)
 
-libEGL_la_LIBADD += $(top_builddir)/src/loader/libloader.la
-libEGL_la_LIBADD += $(DLOPEN_LIBS) $(LIBDRM_LIBS) $(CLOCK_LIB)
+libEGL_common_la_LIBADD += $(top_builddir)/src/loader/libloader.la
+libEGL_common_la_LIBADD += $(DLOPEN_LIBS) $(LIBDRM_LIBS) $(CLOCK_LIB)
 endif
 
+GLVND_GEN_DEPS = generate/gen_egl_dispatch.py \
+	generate/egl.xml generate/eglFunctionList.py generate/genCommon.py \
+	generate/egl_other.xml
+
+PYTHON_GEN = $(AM_V_GEN)$(PYTHON2) $(PYTHON_FLAGS)
+g_egldispatchstubs.c: $(GLVND_GEN_DEPS)
+	$(PYTHON_GEN) $(top_srcdir)/src/egl/generate/gen_egl_dispatch.py source \
+		$(top_srcdir)/src/egl/generate/eglFunctionList.py \
+		$(top_srcdir)/src/egl/generate/egl.xml \
+		$(top_srcdir)/src/egl/generate/egl_other.xml > $@
+
+g_egldispatchstubs.h: $(GLVND_GEN_DEPS)
+	$(PYTHON_GEN) $(top_srcdir)/src/egl/generate/gen_egl_dispatch.py header \
+		$(top_srcdir)/src/egl/generate/eglFunctionList.py \
+		$(top_srcdir)/src/egl/generate/egl.xml \
+		$(top_srcdir)/src/egl/generate/egl_other.xml > $@
+
+BUILT_SOURCES = g_egldispatchstubs.c g_egldispatchstubs.h
+CLEANFILES = $(BUILT_SOURCES)
+
+if USE_LIBGLVND_EGL
+AM_CFLAGS += \
+	$(GLVND_CFLAGS)
+
+vendorjsondir = @LIBGLVND_DATADIR@/glvnd/egl_vendor.d
+vendorjson_DATA = main/50_mesa.json
+
+lib_LTLIBRARIES = libEGL_mesa.la
+libEGL_mesa_la_SOURCES = \
+	main/eglglvnd.c \
+	main/egldispatchstubs.h \
+	main/egldispatchstubs.c \
+	g_egldispatchstubs.c
+libEGL_mesa_la_LIBADD = libEGL_common.la
+libEGL_mesa_la_LDFLAGS = \
+	-no-undefined \
+	-version-number 0 \
+	$(BSYMBOLIC) \
+	$(GC_SECTIONS) \
+	$(LD_NO_UNDEFINED)
+
+else # USE_LIBGLVND_EGL
+
+lib_LTLIBRARIES = libEGL.la
+libEGL_la_SOURCES =
+libEGL_la_LIBADD = libEGL_common.la
+libEGL_la_LDFLAGS = \
+	-no-undefined \
+	-version-number 1:0 \
+	$(BSYMBOLIC) \
+	$(GC_SECTIONS) \
+	$(LD_NO_UNDEFINED)
+
+endif # USE_LIBGLVND_EGL
+
 include $(top_srcdir)/install-lib-links.mk
 
 pkgconfigdir = $(libdir)/pkgconfig
@@ -135,4 +187,7 @@ EXTRA_DIST = \
 	SConscript \
 	drivers/haiku \
 	main/egl.def \
-	main/README.txt
+	main/README.txt \
+	$(GLVND_GEN_DEPS) \
+	main/50_mesa.json
+
diff --git a/src/egl/generate/egl.xml b/src/egl/generate/egl.xml
new file mode 100755
index 0000000..f6dbbc0
--- /dev/null
+++ b/src/egl/generate/egl.xml
@@ -0,0 +1,2412 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<registry>
+    <!--
+    Copyright (c) 2013-2014 The Khronos Group Inc.
+
+    Permission is hereby granted, free of charge, to any person obtaining a
+    copy of this software and/or associated documentation files (the
+    "Materials"), to deal in the Materials without restriction, including
+    without limitation the rights to use, copy, modify, merge, publish,
+    distribute, sublicense, and/or sell copies of the Materials, and to
+    permit persons to whom the Materials are furnished to do so, subject to
+    the following conditions:
+
+    The above copyright notice and this permission notice shall be included
+    in all copies or substantial portions of the Materials.
+
+    THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+    MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+    -->
+    <!--
+    This file, egl.xml, is the EGL API Registry. The older ".spec" file
+    format has been retired and will no longer be updated with new
+    extensions and API versions. The canonical version of the registry,
+    together with documentation, schema, and Python generator scripts used
+    to generate C header files for EGL, can be found in the Khronos Registry
+    at
+        http://www.opengl.org/registry/
+    -->
+
+    <!-- SECTION: EGL type definitions. Does not include GL types. -->
+    <types>
+            <!-- These are dependencies EGL types require to be declared legally -->
+        <type name="khrplatform">#include <KHR/khrplatform.h></type>
+        <type name="eglplatform" requires="khrplatform">#include <EGL/eglplatform.h></type>
+        <type name="khronos_utime_nanoseconds_t" requires="khrplatform"/>
+        <type name="khronos_uint64_t" requires="khrplatform"/>
+        <type name="khronos_ssize_t" requires="khrplatform"/>
+        <type name="EGLNativeDisplayType" requires="eglplatform"/>
+        <type name="EGLNativePixmapType" requires="eglplatform"/>
+        <type name="EGLNativeWindowType" requires="eglplatform"/>
+        <type name="EGLint" requires="eglplatform"/>
+        <type name="NativeDisplayType" requires="eglplatform"/>
+        <type name="NativePixmapType" requires="eglplatform"/>
+        <type name="NativeWindowType" requires="eglplatform"/>
+        <!-- Dummy placeholders for non-EGL types -->
+        <type name="Bool"/>
+            <!-- These are actual EGL types.  -->
+        <type>typedef unsigned int <name>EGLBoolean</name>;</type>
+        <type>typedef unsigned int <name>EGLenum</name>;</type>
+        <type requires="khrplatform">typedef intptr_t <name>EGLAttribKHR</name>;</type>
+        <type requires="khrplatform">typedef intptr_t <name>EGLAttrib</name>;</type>
+        <type>typedef void *<name>EGLClientBuffer</name>;</type>
+        <type>typedef void *<name>EGLConfig</name>;</type>
+        <type>typedef void *<name>EGLContext</name>;</type>
+        <type>typedef void *<name>EGLDeviceEXT</name>;</type>
+        <type>typedef void *<name>EGLDisplay</name>;</type>
+        <type>typedef void *<name>EGLImage</name>;</type>
+        <type>typedef void *<name>EGLImageKHR</name>;</type>
+        <type>typedef void *<name>EGLLabelKHR</name>;</type>
+        <type>typedef void *<name>EGLObjectKHR</name>;</type>
+        <type>typedef void *<name>EGLOutputLayerEXT</name>;</type>
+        <type>typedef void *<name>EGLOutputPortEXT</name>;</type>
+        <type>typedef void *<name>EGLStreamKHR</name>;</type>
+        <type>typedef void *<name>EGLSurface</name>;</type>
+        <type>typedef void *<name>EGLSync</name>;</type>
+        <type>typedef void *<name>EGLSyncKHR</name>;</type>
+        <type>typedef void *<name>EGLSyncNV</name>;</type>
+        <type>typedef void (*<name>__eglMustCastToProperFunctionPointerType</name>)(void);</type>
+        <type requires="khrplatform">typedef khronos_utime_nanoseconds_t <name>EGLTimeKHR</name>;</type>
+        <type requires="khrplatform">typedef khronos_utime_nanoseconds_t <name>EGLTime</name>;</type>
+        <type requires="khrplatform">typedef khronos_utime_nanoseconds_t <name>EGLTimeNV</name>;</type>
+        <type requires="khrplatform">typedef khronos_utime_nanoseconds_t <name>EGLuint64NV</name>;</type>
+        <type requires="khrplatform">typedef khronos_uint64_t <name>EGLuint64KHR</name>;</type>
+        <type>typedef int <name>EGLNativeFileDescriptorKHR</name>;</type>
+        <type requires="khrplatform">typedef khronos_ssize_t <name>EGLsizeiANDROID</name>;</type>
+        <type requires="EGLsizeiANDROID">typedef void (*<name>EGLSetBlobFuncANDROID</name>) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize);</type>
+        <type requires="EGLsizeiANDROID">typedef EGLsizeiANDROID (*<name>EGLGetBlobFuncANDROID</name>) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize);</type>
+        <type>struct <name>EGLClientPixmapHI</name> {
+    void  *pData;
+    EGLint iWidth;
+    EGLint iHeight;
+    EGLint iStride;
+};</type>
+        <type>typedef void (<apientry/> *<name>EGLDEBUGPROCKHR</name>)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message);</type>
+    </types>
+
+    <!-- SECTION: EGL enumerant (token) definitions. -->
+
+    <!-- Bitmasks each have their own namespace, as do a few other
+         categories of enumeration -->
+
+    <enums namespace="EGLSurfaceTypeMask" type="bitmask" comment="EGL_SURFACE_TYPE bits">
+        <enum value="0x0001" name="EGL_PBUFFER_BIT"/>
+        <enum value="0x0002" name="EGL_PIXMAP_BIT"/>
+        <enum value="0x0004" name="EGL_WINDOW_BIT"/>
+        <enum value="0x0008" name="EGL_PBUFFER_IMAGE_BIT_TAO" comment="Unreleased TAO extension"/>
+        <enum value="0x0010" name="EGL_PBUFFER_PALETTE_IMAGE_BIT_TAO" comment="Unreleased TAO extension"/>
+        <enum value="0x0020" name="EGL_VG_COLORSPACE_LINEAR_BIT"/>
+        <enum value="0x0020" name="EGL_VG_COLORSPACE_LINEAR_BIT_KHR"/>
+        <enum value="0x0040" name="EGL_VG_ALPHA_FORMAT_PRE_BIT"/>
+        <enum value="0x0040" name="EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR"/>
+        <enum value="0x0080" name="EGL_LOCK_SURFACE_BIT_KHR"/>
+        <enum value="0x0100" name="EGL_OPTIMAL_FORMAT_BIT_KHR"/>
+        <enum value="0x0200" name="EGL_MULTISAMPLE_RESOLVE_BOX_BIT"/>
+        <enum value="0x0400" name="EGL_SWAP_BEHAVIOR_PRESERVED_BIT"/>
+        <enum value="0x0800" name="EGL_STREAM_BIT_KHR"/>
+            <!--
+        <enum value="0x0800"      name="EGL_STREAM_BIT_NV" comment="Draft EGL_NV_stream_producer_eglsurface extension (bug 8064)"/>
+            -->
+    </enums>
+
+    <enums namespace="EGLRenderableTypeMask" type="bitmask" comment="EGL_RENDERABLE_TYPE bits">
+        <enum value="0x0001" name="EGL_OPENGL_ES_BIT"/>
+        <enum value="0x0002" name="EGL_OPENVG_BIT"/>
+        <enum value="0x0004" name="EGL_OPENGL_ES2_BIT"/>
+        <enum value="0x0008" name="EGL_OPENGL_BIT"/>
+        <enum value="0x0010" name="EGL_INTEROP_BIT_KHR" comment="EGL_KHR_interop"/>
+        <enum value="0x0020" name="EGL_OPENMAX_IL_BIT_KHR" comment="EGL_KHR_interop"/>
+        <enum value="0x00000040" name="EGL_OPENGL_ES3_BIT"/>
+        <enum value="0x00000040" name="EGL_OPENGL_ES3_BIT_KHR" alias="EGL_OPENGL_ES3_BIT"/>
+    </enums>
+
+    <enums namespace="EGLLockUsageHintKHRMask" type="bitmask" comment="EGL_LOCK_USAGE_HINT_KHR bits">
+        <enum value="0x0001" name="EGL_READ_SURFACE_BIT_KHR"/>
+        <enum value="0x0002" name="EGL_WRITE_SURFACE_BIT_KHR"/>
+    </enums>
+
+    <enums namespace="EGLSyncFlagsKHR" type="bitmask" comment="Fence/reusable sync wait bits">
+        <enum value="0x0001" name="EGL_SYNC_FLUSH_COMMANDS_BIT"/>
+        <enum value="0x0001" name="EGL_SYNC_FLUSH_COMMANDS_BIT_KHR" alias="EGL_SYNC_FLUSH_COMMANDS_BIT"/>
+        <enum value="0x0001" name="EGL_SYNC_FLUSH_COMMANDS_BIT_NV" alias="EGL_SYNC_FLUSH_COMMANDS_BIT"/>
+    </enums>
+
+    <enums namespace="EGLDRMBufferUseMESAMask" type="bitmask" comment="EGL_DRM_BUFFER_USE_MESA bits">
+        <enum value="0x00000001" name="EGL_DRM_BUFFER_USE_SCANOUT_MESA"/>
+        <enum value="0x00000002" name="EGL_DRM_BUFFER_USE_SHARE_MESA"/>
+    </enums>
+
+    <!-- Should be shared with GL, but aren't aren't since the
+         FORWARD_COMPATIBLE and DEBUG_BIT values are swapped in the
+         corresponding GL enums. Oops :-( -->
+    <enums namespace="EGLContextFlagMask" type="bitmask" comment="EGL_CONTEXT_FLAGS_KHR bits">
+        <enum value="0x00000001" name="EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR"/>
+        <enum value="0x00000002" name="EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR"/>
+        <enum value="0x00000004" name="EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR"/>
+    </enums>
+
+    <enums namespace="EGLContextProfileMask" type="bitmask" comment="Shared with GL">
+        <enum value="0x00000001" name="EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT"/>
+        <enum value="0x00000001" name="EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR" alias="EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT"/>
+        <enum value="0x00000002" name="EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT"/>
+        <enum value="0x00000002" name="EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR" alias="EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT"/>
+    </enums>
+
+    <!-- The default ("API") enum namespace starts here. While some
+         assigned values may overlap, and different parts of the
+         namespace are reserved for different purposes, it is a single
+         namespace. The "class" attribute indicates some of the reserved
+         purposes but is by no means complete (and cannot be, since many
+         tokens are reused for different purposes in different
+         extensions and API versions). -->
+
+    <enums namespace="EGL" start="0x0000" end="0x2FFF" vendor="ARB"/>
+
+    <enums namespace="EGL" group="Boolean" vendor="ARB">
+        <enum value="0" name="EGL_FALSE"/>
+        <enum value="1" name="EGL_TRUE"/>
+    </enums>
+
+    <enums namespace="EGL" group="SpecialNumbers" vendor="ARB" comment="Tokens whose numeric value is intrinsically meaningful">
+        <enum value="((EGLint)-1)" name="EGL_DONT_CARE"/>
+        <enum value="((EGLint)-1)" name="EGL_UNKNOWN"/>
+        <enum value="-1" name="EGL_NO_NATIVE_FENCE_FD_ANDROID"/>
+        <enum value="0" name="EGL_DEPTH_ENCODING_NONE_NV"/>
+        <enum value="((EGLContext)0)" name="EGL_NO_CONTEXT"/>
+        <enum value="((EGLDeviceEXT)(0))" name="EGL_NO_DEVICE_EXT"/>
+        <enum value="((EGLDisplay)0)" name="EGL_NO_DISPLAY"/>
+        <enum value="((EGLImage)0)" name="EGL_NO_IMAGE"/>
+        <enum value="((EGLImageKHR)0)" name="EGL_NO_IMAGE_KHR"/>
+        <enum value="((EGLNativeDisplayType)0)" name="EGL_DEFAULT_DISPLAY"/>
+        <enum value="((EGLNativeFileDescriptorKHR)(-1))" name="EGL_NO_FILE_DESCRIPTOR_KHR"/>
+        <enum value="((EGLOutputLayerEXT)0)" name="EGL_NO_OUTPUT_LAYER_EXT"/>
+        <enum value="((EGLOutputPortEXT)0)" name="EGL_NO_OUTPUT_PORT_EXT"/>
+        <enum value="((EGLStreamKHR)0)" name="EGL_NO_STREAM_KHR"/>
+        <enum value="((EGLSurface)0)" name="EGL_NO_SURFACE"/>
+        <enum value="((EGLSync)0)" name="EGL_NO_SYNC"/>
+        <enum value="((EGLSyncKHR)0)" name="EGL_NO_SYNC_KHR" alias="EGL_NO_SYNC"/>
+        <enum value="((EGLSyncNV)0)" name="EGL_NO_SYNC_NV" alias="EGL_NO_SYNC"/>
+        <enum value="10000" name="EGL_DISPLAY_SCALING"/>
+        <enum value="0xFFFFFFFFFFFFFFFF" name="EGL_FOREVER" type="ull"/>
+        <enum value="0xFFFFFFFFFFFFFFFF" name="EGL_FOREVER_KHR" type="ull" alias="EGL_FOREVER"/>
+        <enum value="0xFFFFFFFFFFFFFFFF" name="EGL_FOREVER_NV" type="ull" alias="EGL_FOREVER"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3000" end="0x305F" vendor="KHR">
+        <enum value="0x3000" name="EGL_SUCCESS"/>
+        <enum value="0x3001" name="EGL_NOT_INITIALIZED"/>
+        <enum value="0x3002" name="EGL_BAD_ACCESS"/>
+        <enum value="0x3003" name="EGL_BAD_ALLOC"/>
+        <enum value="0x3004" name="EGL_BAD_ATTRIBUTE"/>
+        <enum value="0x3005" name="EGL_BAD_CONFIG"/>
+        <enum value="0x3006" name="EGL_BAD_CONTEXT"/>
+        <enum value="0x3007" name="EGL_BAD_CURRENT_SURFACE"/>
+        <enum value="0x3008" name="EGL_BAD_DISPLAY"/>
+        <enum value="0x3009" name="EGL_BAD_MATCH"/>
+        <enum value="0x300A" name="EGL_BAD_NATIVE_PIXMAP"/>
+        <enum value="0x300B" name="EGL_BAD_NATIVE_WINDOW"/>
+        <enum value="0x300C" name="EGL_BAD_PARAMETER"/>
+        <enum value="0x300D" name="EGL_BAD_SURFACE"/>
+        <enum value="0x300E" name="EGL_CONTEXT_LOST"/>
+            <unused start="0x300F" end="0x301F" comment="for additional errors"/>
+        <enum value="0x3020" name="EGL_BUFFER_SIZE"/>
+        <enum value="0x3021" name="EGL_ALPHA_SIZE"/>
+        <enum value="0x3022" name="EGL_BLUE_SIZE"/>
+        <enum value="0x3023" name="EGL_GREEN_SIZE"/>
+        <enum value="0x3024" name="EGL_RED_SIZE"/>
+        <enum value="0x3025" name="EGL_DEPTH_SIZE"/>
+        <enum value="0x3026" name="EGL_STENCIL_SIZE"/>
+        <enum value="0x3027" name="EGL_CONFIG_CAVEAT"/>
+        <enum value="0x3028" name="EGL_CONFIG_ID"/>
+        <enum value="0x3029" name="EGL_LEVEL"/>
+        <enum value="0x302A" name="EGL_MAX_PBUFFER_HEIGHT"/>
+        <enum value="0x302B" name="EGL_MAX_PBUFFER_PIXELS"/>
+        <enum value="0x302C" name="EGL_MAX_PBUFFER_WIDTH"/>
+        <enum value="0x302D" name="EGL_NATIVE_RENDERABLE"/>
+        <enum value="0x302E" name="EGL_NATIVE_VISUAL_ID"/>
+        <enum value="0x302F" name="EGL_NATIVE_VISUAL_TYPE"/>
+        <enum value="0x3031" name="EGL_SAMPLES"/>
+        <enum value="0x3032" name="EGL_SAMPLE_BUFFERS"/>
+        <enum value="0x3033" name="EGL_SURFACE_TYPE"/>
+        <enum value="0x3034" name="EGL_TRANSPARENT_TYPE"/>
+        <enum value="0x3035" name="EGL_TRANSPARENT_BLUE_VALUE"/>
+        <enum value="0x3036" name="EGL_TRANSPARENT_GREEN_VALUE"/>
+        <enum value="0x3037" name="EGL_TRANSPARENT_RED_VALUE"/>
+        <enum value="0x3038" name="EGL_NONE" comment="Attribute list terminator"/>
+        <enum value="0x3039" name="EGL_BIND_TO_TEXTURE_RGB"/>
+        <enum value="0x303A" name="EGL_BIND_TO_TEXTURE_RGBA"/>
+        <enum value="0x303B" name="EGL_MIN_SWAP_INTERVAL"/>
+        <enum value="0x303C" name="EGL_MAX_SWAP_INTERVAL"/>
+        <enum value="0x303D" name="EGL_LUMINANCE_SIZE"/>
+        <enum value="0x303E" name="EGL_ALPHA_MASK_SIZE"/>
+        <enum value="0x303F" name="EGL_COLOR_BUFFER_TYPE"/>
+        <enum value="0x3040" name="EGL_RENDERABLE_TYPE"/>
+        <enum value="0x3041" name="EGL_MATCH_NATIVE_PIXMAP"/>
+        <enum value="0x3042" name="EGL_CONFORMANT"/>
+        <enum value="0x3042" name="EGL_CONFORMANT_KHR"/>
+        <enum value="0x3043" name="EGL_MATCH_FORMAT_KHR"/>
+            <unused start="0x3044" end="0x304F" comment="for additional config attributes"/>
+        <enum value="0x3050" name="EGL_SLOW_CONFIG"/>
+        <enum value="0x3051" name="EGL_NON_CONFORMANT_CONFIG"/>
+        <enum value="0x3052" name="EGL_TRANSPARENT_RGB"/>
+        <enum value="0x3053" name="EGL_VENDOR"/>
+        <enum value="0x3054" name="EGL_VERSION"/>
+        <enum value="0x3055" name="EGL_EXTENSIONS"/>
+        <enum value="0x3056" name="EGL_HEIGHT"/>
+        <enum value="0x3057" name="EGL_WIDTH"/>
+        <enum value="0x3058" name="EGL_LARGEST_PBUFFER"/>
+        <enum value="0x3059" name="EGL_DRAW"/>
+        <enum value="0x305A" name="EGL_READ"/>
+        <enum value="0x305B" name="EGL_CORE_NATIVE_ENGINE"/>
+        <enum value="0x305C" name="EGL_NO_TEXTURE"/>
+        <enum value="0x305D" name="EGL_TEXTURE_RGB"/>
+        <enum value="0x305E" name="EGL_TEXTURE_RGBA"/>
+        <enum value="0x305F" name="EGL_TEXTURE_2D"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3060-0x306F" vendor="TAO" comment="Reserved for Phil Huxley">
+        <unused start="0x3060" end="0x306F"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3070-0x307F" vendor="NOK" comment="Reserved for Jani Vaarala">
+        <unused start="0x3070" end="0x307E"/>
+        <enum value="0x307F" name="EGL_Y_INVERTED_NOK"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3080-0x30AF" vendor="KHR">
+        <enum value="0x3080" name="EGL_TEXTURE_FORMAT"/>
+        <enum value="0x3081" name="EGL_TEXTURE_TARGET"/>
+        <enum value="0x3082" name="EGL_MIPMAP_TEXTURE"/>
+        <enum value="0x3083" name="EGL_MIPMAP_LEVEL"/>
+        <enum value="0x3084" name="EGL_BACK_BUFFER"/>
+        <enum value="0x3085" name="EGL_SINGLE_BUFFER"/>
+        <enum value="0x3086" name="EGL_RENDER_BUFFER"/>
+        <enum value="0x3087" name="EGL_COLORSPACE" alias="EGL_VG_COLORSPACE"/>
+        <enum value="0x3087" name="EGL_VG_COLORSPACE"/>
+        <enum value="0x3088" name="EGL_ALPHA_FORMAT" alias="EGL_VG_ALPHA_FORMAT"/>
+        <enum value="0x3088" name="EGL_VG_ALPHA_FORMAT"/>
+        <enum value="0x3089" name="EGL_COLORSPACE_sRGB"/>
+        <enum value="0x3089" name="EGL_GL_COLORSPACE_SRGB" alias="EGL_COLORSPACE_sRGB"/>
+        <enum value="0x3089" name="EGL_GL_COLORSPACE_SRGB_KHR" alias="EGL_COLORSPACE_sRGB"/>
+        <enum value="0x3089" name="EGL_VG_COLORSPACE_sRGB" alias="EGL_COLORSPACE_sRGB"/>
+        <enum value="0x308A" name="EGL_COLORSPACE_LINEAR"/>
+        <enum value="0x308A" name="EGL_GL_COLORSPACE_LINEAR" alias="EGL_COLORSPACE_LINEAR"/>
+        <enum value="0x308A" name="EGL_GL_COLORSPACE_LINEAR_KHR" alias="EGL_COLORSPACE_LINEAR"/>
+        <enum value="0x308A" name="EGL_VG_COLORSPACE_LINEAR" alias="EGL_COLORSPACE_LINEAR"/>
+        <enum value="0x308B" name="EGL_ALPHA_FORMAT_NONPRE" alias="EGL_VG_ALPHA_FORMAT_NONPRE"/>
+        <enum value="0x308B" name="EGL_VG_ALPHA_FORMAT_NONPRE"/>
+        <enum value="0x308C" name="EGL_ALPHA_FORMAT_PRE" alias="EGL_VG_ALPHA_FORMAT_PRE"/>
+        <enum value="0x308C" name="EGL_VG_ALPHA_FORMAT_PRE"/>
+        <enum value="0x308D" name="EGL_CLIENT_APIS"/>
+        <enum value="0x308E" name="EGL_RGB_BUFFER"/>
+        <enum value="0x308F" name="EGL_LUMINANCE_BUFFER"/>
+        <enum value="0x3090" name="EGL_HORIZONTAL_RESOLUTION"/>
+        <enum value="0x3091" name="EGL_VERTICAL_RESOLUTION"/>
+        <enum value="0x3092" name="EGL_PIXEL_ASPECT_RATIO"/>
+        <enum value="0x3093" name="EGL_SWAP_BEHAVIOR"/>
+        <enum value="0x3094" name="EGL_BUFFER_PRESERVED"/>
+        <enum value="0x3095" name="EGL_BUFFER_DESTROYED"/>
+        <enum value="0x3096" name="EGL_OPENVG_IMAGE"/>
+        <enum value="0x3097" name="EGL_CONTEXT_CLIENT_TYPE"/>
+        <enum value="0x3098" name="EGL_CONTEXT_CLIENT_VERSION"/>
+        <enum value="0x3098" name="EGL_CONTEXT_MAJOR_VERSION" alias="EGL_CONTEXT_CLIENT_VERSION"/>
+        <enum value="0x3098" name="EGL_CONTEXT_MAJOR_VERSION_KHR" alias="EGL_CONTEXT_CLIENT_VERSION"/>
+        <enum value="0x3099" name="EGL_MULTISAMPLE_RESOLVE"/>
+        <enum value="0x309A" name="EGL_MULTISAMPLE_RESOLVE_DEFAULT"/>
+        <enum value="0x309B" name="EGL_MULTISAMPLE_RESOLVE_BOX"/>
+        <enum value="0x309C" name="EGL_CL_EVENT_HANDLE"/>
+        <enum value="0x309C" name="EGL_CL_EVENT_HANDLE_KHR" alias="EGL_CL_EVENT_HANDLE"/>
+        <enum value="0x309D" name="EGL_GL_COLORSPACE"/>
+        <enum value="0x309D" name="EGL_GL_COLORSPACE_KHR" alias="EGL_GL_COLORSPACE"/>
+            <unused start="0x309E" end="0x309F"/>
+        <enum value="0x30A0" name="EGL_OPENGL_ES_API"/>
+        <enum value="0x30A1" name="EGL_OPENVG_API"/>
+        <enum value="0x30A2" name="EGL_OPENGL_API"/>
+            <unused start="0x30A3" end="0x30AF" comment="for additional client API names"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x30B0-0x30BF" vendor="NV" comment="Reserved for Ignacio Llamas">
+        <enum value="0x30B0" name="EGL_NATIVE_PIXMAP_KHR"/>
+        <enum value="0x30B1" name="EGL_GL_TEXTURE_2D"/>
+        <enum value="0x30B1" name="EGL_GL_TEXTURE_2D_KHR" alias="EGL_GL_TEXTURE_2D"/>
+        <enum value="0x30B2" name="EGL_GL_TEXTURE_3D"/>
+        <enum value="0x30B2" name="EGL_GL_TEXTURE_3D_KHR" alias="EGL_GL_TEXTURE_3D"/>
+        <enum value="0x30B3" name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X"/>
+        <enum value="0x30B3" name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR" alias="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X"/>
+        <enum value="0x30B4" name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X"/>
+        <enum value="0x30B4" name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR" alias="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X"/>
+        <enum value="0x30B5" name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y"/>
+        <enum value="0x30B5" name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR" alias="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y"/>
+        <enum value="0x30B6" name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y"/>
+        <enum value="0x30B6" name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR" alias="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y"/>
+        <enum value="0x30B7" name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z"/>
+        <enum value="0x30B7" name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR" alias="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z"/>
+        <enum value="0x30B8" name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z"/>
+        <enum value="0x30B8" name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR" alias="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z"/>
+        <enum value="0x30B9" name="EGL_GL_RENDERBUFFER"/>
+        <enum value="0x30B9" name="EGL_GL_RENDERBUFFER_KHR" alias="EGL_GL_RENDERBUFFER"/>
+        <enum value="0x30BA" name="EGL_VG_PARENT_IMAGE_KHR"/>
+        <enum value="0x30BC" name="EGL_GL_TEXTURE_LEVEL"/>
+        <enum value="0x30BC" name="EGL_GL_TEXTURE_LEVEL_KHR" alias="EGL_GL_TEXTURE_LEVEL"/>
+        <enum value="0x30BD" name="EGL_GL_TEXTURE_ZOFFSET"/>
+        <enum value="0x30BD" name="EGL_GL_TEXTURE_ZOFFSET_KHR" alias="EGL_GL_TEXTURE_ZOFFSET"/>
+        <enum value="0x30BE" name="EGL_POST_SUB_BUFFER_SUPPORTED_NV"/>
+        <enum value="0x30BF" name="EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT" alias="EGL_CONTEXT_OPENGL_ROBUST_ACCESS"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x30C0-0x30CF" vendor="KHR">
+        <enum value="0x30C0" name="EGL_FORMAT_RGB_565_EXACT_KHR"/>
+        <enum value="0x30C1" name="EGL_FORMAT_RGB_565_KHR"/>
+        <enum value="0x30C2" name="EGL_FORMAT_RGBA_8888_EXACT_KHR"/>
+        <enum value="0x30C3" name="EGL_FORMAT_RGBA_8888_KHR"/>
+        <enum value="0x30C4" name="EGL_MAP_PRESERVE_PIXELS_KHR"/>
+        <enum value="0x30C5" name="EGL_LOCK_USAGE_HINT_KHR"/>
+        <enum value="0x30C6" name="EGL_BITMAP_POINTER_KHR"/>
+        <enum value="0x30C7" name="EGL_BITMAP_PITCH_KHR"/>
+        <enum value="0x30C8" name="EGL_BITMAP_ORIGIN_KHR"/>
+        <enum value="0x30C9" name="EGL_BITMAP_PIXEL_RED_OFFSET_KHR"/>
+        <enum value="0x30CA" name="EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR"/>
+        <enum value="0x30CB" name="EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR"/>
+        <enum value="0x30CC" name="EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR"/>
+        <enum value="0x30CD" name="EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR"/>
+        <enum value="0x30CE" name="EGL_LOWER_LEFT_KHR"/>
+        <enum value="0x30CF" name="EGL_UPPER_LEFT_KHR"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x30D0" end="0x30DF" vendor="Symbian" comment="Reserved for Robert Palmer (bug #2545)">
+            <unused start="0x30D0" end="0x30D1"/>
+        <enum value="0x30D2" name="EGL_IMAGE_PRESERVED"/>
+        <enum value="0x30D2" name="EGL_IMAGE_PRESERVED_KHR"/>
+            <unused start="0x30D3" end="0x30D9"/>
+        <enum value="0x30DA" name="EGL_SHARED_IMAGE_NOK" comment="Unreleased extension"/>
+            <unused start="0x30DB" end="0x30DF"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x30E0" end="0x30EF" vendor="NV" comment="Reserved for Russell Pflughaupt (bug #3314)">
+        <enum value="0x30E0" name="EGL_COVERAGE_BUFFERS_NV"/>
+        <enum value="0x30E1" name="EGL_COVERAGE_SAMPLES_NV"/>
+        <enum value="0x30E2" name="EGL_DEPTH_ENCODING_NV"/>
+        <enum value="0x30E3" name="EGL_DEPTH_ENCODING_NONLINEAR_NV"/>
+            <unused start="0x30E4" end="0x30E5"/>
+        <enum value="0x30E6" name="EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV"/>
+        <enum value="0x30E7" name="EGL_SYNC_STATUS_NV"/>
+        <enum value="0x30E8" name="EGL_SIGNALED_NV"/>
+        <enum value="0x30E9" name="EGL_UNSIGNALED_NV"/>
+        <enum value="0x30EA" name="EGL_ALREADY_SIGNALED_NV"/>
+        <enum value="0x30EB" name="EGL_TIMEOUT_EXPIRED_NV"/>
+        <enum value="0x30EC" name="EGL_CONDITION_SATISFIED_NV"/>
+        <enum value="0x30ED" name="EGL_SYNC_TYPE_NV"/>
+        <enum value="0x30EE" name="EGL_SYNC_CONDITION_NV"/>
+        <enum value="0x30EF" name="EGL_SYNC_FENCE_NV"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x30F0" end="0x30FF" vendor="KHR">
+        <enum value="0x30F0" name="EGL_SYNC_PRIOR_COMMANDS_COMPLETE"/>
+        <enum value="0x30F0" name="EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR" alias="EGL_SYNC_PRIOR_COMMANDS_COMPLETE"/>
+        <enum value="0x30F1" name="EGL_SYNC_STATUS"/>
+        <enum value="0x30F1" name="EGL_SYNC_STATUS_KHR" alias="EGL_SYNC_STATUS"/>
+        <enum value="0x30F2" name="EGL_SIGNALED"/>
+        <enum value="0x30F2" name="EGL_SIGNALED_KHR" alias="EGL_SIGNALED"/>
+        <enum value="0x30F3" name="EGL_UNSIGNALED"/>
+        <enum value="0x30F3" name="EGL_UNSIGNALED_KHR" alias="EGL_UNSIGNALED"/>
+        <enum value="0x30F5" name="EGL_TIMEOUT_EXPIRED"/>
+        <enum value="0x30F5" name="EGL_TIMEOUT_EXPIRED_KHR" alias="EGL_TIMEOUT_EXPIRED"/>
+        <enum value="0x30F6" name="EGL_CONDITION_SATISFIED"/>
+        <enum value="0x30F6" name="EGL_CONDITION_SATISFIED_KHR" alias="EGL_CONDITION_SATISFIED"/>
+        <enum value="0x30F7" name="EGL_SYNC_TYPE"/>
+        <enum value="0x30F7" name="EGL_SYNC_TYPE_KHR" alias="EGL_SYNC_TYPE"/>
+        <enum value="0x30F8" name="EGL_SYNC_CONDITION"/>
+        <enum value="0x30F8" name="EGL_SYNC_CONDITION_KHR" alias="EGL_SYNC_CONDITION"/>
+        <enum value="0x30F9" name="EGL_SYNC_FENCE"/>
+        <enum value="0x30F9" name="EGL_SYNC_FENCE_KHR" alias="EGL_SYNC_FENCE"/>
+        <enum value="0x30FA" name="EGL_SYNC_REUSABLE_KHR"/>
+        <enum value="0x30FB" name="EGL_CONTEXT_MINOR_VERSION"/>
+        <enum value="0x30FB" name="EGL_CONTEXT_MINOR_VERSION_KHR" alias="EGL_CONTEXT_MINOR_VERSION"/>
+        <enum value="0x30FC" name="EGL_CONTEXT_FLAGS_KHR"/>
+        <enum value="0x30FD" name="EGL_CONTEXT_OPENGL_PROFILE_MASK"/>
+        <enum value="0x30FD" name="EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR" alias="EGL_CONTEXT_OPENGL_PROFILE_MASK"/>
+        <enum value="0x30FE" name="EGL_SYNC_CL_EVENT"/>
+        <enum value="0x30FE" name="EGL_SYNC_CL_EVENT_KHR" alias="EGL_SYNC_CL_EVENT"/>
+        <enum value="0x30FF" name="EGL_SYNC_CL_EVENT_COMPLETE"/>
+        <enum value="0x30FF" name="EGL_SYNC_CL_EVENT_COMPLETE_KHR" alias="EGL_SYNC_CL_EVENT_COMPLETE"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3100" end="0x310F" vendor="IMG" comment="Reserved for Ben Bowman (Khronos bug 4748)">
+        <enum value="0x3100" name="EGL_CONTEXT_PRIORITY_LEVEL_IMG"/>
+        <enum value="0x3101" name="EGL_CONTEXT_PRIORITY_HIGH_IMG"/>
+        <enum value="0x3102" name="EGL_CONTEXT_PRIORITY_MEDIUM_IMG"/>
+        <enum value="0x3103" name="EGL_CONTEXT_PRIORITY_LOW_IMG"/>
+            <unused start="0x3104" end="0x310F"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3110" end="0x311F" vendor="ATX" comment="Reserved for Tim Renouf, Antix (Khronos bug 4949)">
+        <enum value="0x3110" name="EGL_BITMAP_PIXEL_SIZE_KHR"/>
+            <unused start="0x3111" end="0x311F"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3120" end="0x312F" vendor="AMD" comment="Reserved for David Garcia (Khronos bug 5149)">
+            <unused start="0x3120" end="0x312F"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3130" end="0x313F" vendor="NV" comment="Reserved for Greg Prisament (Khronos bug 5166)">
+            <unused start="0x3130"/>
+        <enum value="0x3131" name="EGL_COVERAGE_SAMPLE_RESOLVE_NV"/>
+        <enum value="0x3132" name="EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV"/>
+        <enum value="0x3133" name="EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV"/>
+        <enum value="0x3134" name="EGL_MULTIVIEW_VIEW_COUNT_EXT"/>
+            <unused start="0x3135"/>
+        <enum value="0x3136" name="EGL_AUTO_STEREO_NV"/>
+            <unused start="0x3137"/>
+        <enum value="0x3138" name="EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT"/>
+            <unused start="0x3139" end="0x313C"/>
+        <enum value="0x313D" name="EGL_BUFFER_AGE_KHR"/>
+        <enum value="0x313D" name="EGL_BUFFER_AGE_EXT" alias="EGL_BUFFER_AGE_KHR"/>
+            <unused start="0x313E" end="0x313F"/>
+        <enum value="0x313F" name="EGL_PLATFORM_DEVICE_EXT"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3140" end="0x314F" vendor="Google" comment="Reserved for Mathias Agopian (Khronos bug 5199)">
+        <enum value="0x3140" name="EGL_NATIVE_BUFFER_ANDROID"/>
+        <enum value="0x3141" name="EGL_PLATFORM_ANDROID_KHR"/>
+        <enum value="0x3142" name="EGL_RECORDABLE_ANDROID"/>
+            <unused start="0x3143"/>
+        <enum value="0x3144" name="EGL_SYNC_NATIVE_FENCE_ANDROID"/>
+        <enum value="0x3145" name="EGL_SYNC_NATIVE_FENCE_FD_ANDROID"/>
+        <enum value="0x3146" name="EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID"/>
+        <enum value="0x3147" name="EGL_FRAMEBUFFER_TARGET_ANDROID"/>
+            <unused start="0x3148" end="0x314F"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3150" end="0x315F" vendor="NOK" comment="Reserved for Robert Palmer (Khronos bug 5368)">
+            <unused start="0x3150" end="0x315F"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3160" end="0x316F" vendor="Seaweed" comment="Reserved for Sree Sridharan (Khronos public bug 198)">
+            <unused start="0x3160" end="0x316F"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3170" end="0x318F" vendor="QNX" comment="Reserved for Joel Pilon (Khronos bug 5834)">
+            <unused start="0x3170" end="0x318F"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3190" end="0x31AF" vendor="FSL" comment="Reserved for Brian Murray, Freescale (Khronos bug 5939)">
+            <unused start="0x3190" end="0x31AF"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x31B0" end="0x31BF" vendor="KHR" comment="Reserved for Marcus Lorentzon (Khronos bug 6437)">
+        <enum value="0x31B0" name="EGL_CONTEXT_OPENGL_DEBUG"/>
+        <enum value="0x31B1" name="EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE"/>
+        <enum value="0x31B2" name="EGL_CONTEXT_OPENGL_ROBUST_ACCESS"/>
+        <enum value="0x31B3" name="EGL_CONTEXT_OPENGL_NO_ERROR_KHR"/>
+            <unused start="0x31B4" end="0x31BC" comment="0x31B3-0x31BC formerly reserved for EGL_image_stream"/>
+        <enum value="0x31BD" name="EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR" alias="EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY"/>
+        <enum value="0x31BD" name="EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY"/>
+        <enum value="0x31BE" name="EGL_NO_RESET_NOTIFICATION"/>
+        <enum value="0x31BE" name="EGL_NO_RESET_NOTIFICATION_KHR" alias="EGL_NO_RESET_NOTIFICATION"/>
+        <enum value="0x31BE" name="EGL_NO_RESET_NOTIFICATION_EXT" alias="EGL_NO_RESET_NOTIFICATION"/>
+        <enum value="0x31BF" name="EGL_LOSE_CONTEXT_ON_RESET"/>
+        <enum value="0x31BF" name="EGL_LOSE_CONTEXT_ON_RESET_KHR" alias="EGL_LOSE_CONTEXT_ON_RESET"/>
+        <enum value="0x31BF" name="EGL_LOSE_CONTEXT_ON_RESET_EXT" alias="EGL_LOSE_CONTEXT_ON_RESET"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x31C0" end="0x31CF" vendor="QCOM" comment="Reserved for Maurice Ribble (Khronos bug 6644) - EGL_QCOM_create_image spec TBD">
+            <unused start="0x31C0" end="0x31CF"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x31D0" end="0x31DF" vendor="MESA" comment="Reserved for Kristian Høgsberg (Khronos bug 6757)">
+        <enum value="0x31D0" name="EGL_DRM_BUFFER_FORMAT_MESA"/>
+        <enum value="0x31D1" name="EGL_DRM_BUFFER_USE_MESA"/>
+        <enum value="0x31D2" name="EGL_DRM_BUFFER_FORMAT_ARGB32_MESA"/>
+        <enum value="0x31D3" name="EGL_DRM_BUFFER_MESA"/>
+        <enum value="0x31D4" name="EGL_DRM_BUFFER_STRIDE_MESA"/>
+        <enum value="0x31D5" name="EGL_PLATFORM_X11_KHR"/>
+        <enum value="0x31D5" name="EGL_PLATFORM_X11_EXT" alias="EGL_PLATFORM_X11_KHR"/>
+        <enum value="0x31D6" name="EGL_PLATFORM_X11_SCREEN_KHR"/>
+        <enum value="0x31D6" name="EGL_PLATFORM_X11_SCREEN_EXT" alias="EGL_PLATFORM_X11_SCREEN_KHR"/>
+        <enum value="0x31D7" name="EGL_PLATFORM_GBM_KHR"/>
+        <enum value="0x31D7" name="EGL_PLATFORM_GBM_MESA" alias="EGL_PLATFORM_GBM_KHR"/>
+        <enum value="0x31D8" name="EGL_PLATFORM_WAYLAND_KHR"/>
+        <enum value="0x31D8" name="EGL_PLATFORM_WAYLAND_EXT" alias="EGL_PLATFORM_WAYLAND_KHR"/>
+            <unused start="0x31D9" end="0x31DF"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x31E0" end="0x31EF" vendor="HI" comment="Reserved for Mark Callow (Khronos bug 6799)">
+            <unused start="0x31E0" end="0x31EF"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x31F0" end="0x31FF" vendor="KHR">
+            <unused start="0x31F0" end="0x31FB" comment="Placeholders for draft extensions follow"/>
+        <!--
+            <enum value="0x31F0" name="EGL_IMAGE_USE_AS_OPENGL_ES1_RENDERBUFFER_KHR"        comment="Draft KHR_image_use_gl1_renderbuffer"/>
+            <enum value="0x31F1" name="EGL_IMAGE_USE_AS_OPENGL_ES1_TEXTURE_2D_KHR"          comment="Draft KHR_image_use_gl1_texture_2d"/>
+            <enum value="0x31F2" name="EGL_IMAGE_USE_AS_OPENGL_ES1_TEXTURE_EXTERNAL_KHR"    comment="Draft KHR_image_use_gl1_texture_external"/>
+            <enum value="0x31F3" name="EGL_IMAGE_USE_AS_OPENGL_ES2_RENDERBUFFER_KHR"        comment="Draft KHR_image_use_gl2_renderbuffer"/>
+            <enum value="0x31F4" name="EGL_IMAGE_USE_AS_OPENGL_ES2_TEXTURE_2D_KHR"          comment="Draft KHR_image_use_gl2_texture_2d"/>
+            <enum value="0x31F5" name="EGL_IMAGE_USE_AS_OPENGL_ES2_TEXTURE_EXTERNAL_KHR"    comment="Draft KHR_image_use_gl2_texture_external"/>
+            <enum value="0x31F6" name="EGL_IMAGE_USE_AS_OPENVG_IMAGE_KHR"                   comment="Draft KHR_image_use_vg_vgimage"/>
+            <enum value="0x31F7" name="EGL_STREAM_CONSUMER_ATTACHMENT_MESA"                 comment="Draft EGL_MESA_image_stream_internal"/>
+            <enum value="0x31F8" name="EGL_NO_FORMAT_MESA"                                  comment="Draft EGL_MESA_image_stream_internal"/>
+            <enum value="0x31F9" name="EGL_FORMAT_RGBA8888_MESA"                            comment="Draft EGL_MESA_image_stream_internal"/>
+            <enum value="0x31FA" name="EGL_FORMAT_RGB888_MESA"                              comment="Draft EGL_MESA_image_stream_internal"/>
+            <enum value="0x31FB" name="EGL_FORMAT_RGB565_MESA"                              comment="Draft EGL_MESA_image_stream_internal"/>
+        -->
+        <enum value="0x31FC" name="EGL_STREAM_FIFO_LENGTH_KHR"/>
+        <enum value="0x31FD" name="EGL_STREAM_TIME_NOW_KHR"/>
+        <enum value="0x31FE" name="EGL_STREAM_TIME_CONSUMER_KHR"/>
+        <enum value="0x31FF" name="EGL_STREAM_TIME_PRODUCER_KHR"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3200" end="0x320F" vendor="ANGLE" comment="Reserved for Daniel Koch, ANGLE Project (Khronos bug 7139)">
+        <enum value="0x3200" name="EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE"/>
+        <enum value="0x3201" name="EGL_FIXED_SIZE_ANGLE"/>
+            <unused start="0x3202" end="0x320F"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3210" end="0x321F" vendor="KHR">
+        <enum value="0x3210" name="EGL_CONSUMER_LATENCY_USEC_KHR"/>
+            <unused start="0x3211"/>
+        <enum value="0x3212" name="EGL_PRODUCER_FRAME_KHR"/>
+        <enum value="0x3213" name="EGL_CONSUMER_FRAME_KHR"/>
+        <enum value="0x3214" name="EGL_STREAM_STATE_KHR"/>
+        <enum value="0x3215" name="EGL_STREAM_STATE_CREATED_KHR"/>
+        <enum value="0x3216" name="EGL_STREAM_STATE_CONNECTING_KHR"/>
+        <enum value="0x3217" name="EGL_STREAM_STATE_EMPTY_KHR"/>
+        <enum value="0x3218" name="EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR"/>
+        <enum value="0x3219" name="EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR"/>
+        <enum value="0x321A" name="EGL_STREAM_STATE_DISCONNECTED_KHR"/>
+        <enum value="0x321B" name="EGL_BAD_STREAM_KHR"/>
+        <enum value="0x321C" name="EGL_BAD_STATE_KHR"/>
+        <enum value="0x321D" name="EGL_BUFFER_COUNT_NV" comment="From EGL_NV_stream_producer_eglsurface, which has no known specification and was replaced by a KHR extension"/>
+        <enum value="0x321E" name="EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR"/>
+        <enum value="0x321F" name="EGL_SYNC_NEW_FRAME_NV"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3220" end="0x325F" vendor="NV" comment="Reserved for Greg Roth (Bug 8220)">
+            <unused start="0x3220" end="0x322A"/>
+        <enum value="0x322B" name="EGL_BAD_DEVICE_EXT"/>
+        <enum value="0x322C" name="EGL_DEVICE_EXT"/>
+        <enum value="0x322D" name="EGL_BAD_OUTPUT_LAYER_EXT"/>
+        <enum value="0x322E" name="EGL_BAD_OUTPUT_PORT_EXT"/>
+        <enum value="0x322F" name="EGL_SWAP_INTERVAL_EXT"/>
+            <unused start="0x3230" end="0x3232"/>
+        <enum value="0x3233" name="EGL_DRM_DEVICE_FILE_EXT"/>
+        <enum value="0x3234" name="EGL_DRM_CRTC_EXT"/>
+        <enum value="0x3235" name="EGL_DRM_PLANE_EXT"/>
+        <enum value="0x3236" name="EGL_DRM_CONNECTOR_EXT"/>
+        <enum value="0x3237" name="EGL_OPENWF_DEVICE_ID_EXT"/>
+        <enum value="0x3238" name="EGL_OPENWF_PIPELINE_ID_EXT"/>
+        <enum value="0x3239" name="EGL_OPENWF_PORT_ID_EXT"/>
+        <enum value="0x323A" name="EGL_CUDA_DEVICE_NV"/>
+        <enum value="0x323B" name="EGL_CUDA_EVENT_HANDLE_NV"/>
+        <enum value="0x323C" name="EGL_SYNC_CUDA_EVENT_NV"/>
+        <enum value="0x323D" name="EGL_SYNC_CUDA_EVENT_COMPLETE_NV"/>
+            <unused start="0x323E" end="0x325F"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3260" end="0x326F" vendor="BCOM" comment="Reserved for Gary Sweet, Broadcom (Public bug 620)">
+            <unused start="0x3260" end="0x326F"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3270" end="0x328F" vendor="ARM" comment="Reserved for Tom Cooksey (Bug 9963)">
+        <enum value="0x3270" name="EGL_LINUX_DMA_BUF_EXT"/>
+        <enum value="0x3271" name="EGL_LINUX_DRM_FOURCC_EXT"/>
+        <enum value="0x3272" name="EGL_DMA_BUF_PLANE0_FD_EXT"/>
+        <enum value="0x3273" name="EGL_DMA_BUF_PLANE0_OFFSET_EXT"/>
+        <enum value="0x3274" name="EGL_DMA_BUF_PLANE0_PITCH_EXT"/>
+        <enum value="0x3275" name="EGL_DMA_BUF_PLANE1_FD_EXT"/>
+        <enum value="0x3276" name="EGL_DMA_BUF_PLANE1_OFFSET_EXT"/>
+        <enum value="0x3277" name="EGL_DMA_BUF_PLANE1_PITCH_EXT"/>
+        <enum value="0x3278" name="EGL_DMA_BUF_PLANE2_FD_EXT"/>
+        <enum value="0x3279" name="EGL_DMA_BUF_PLANE2_OFFSET_EXT"/>
+        <enum value="0x327A" name="EGL_DMA_BUF_PLANE2_PITCH_EXT"/>
+        <enum value="0x327B" name="EGL_YUV_COLOR_SPACE_HINT_EXT"/>
+        <enum value="0x327C" name="EGL_SAMPLE_RANGE_HINT_EXT"/>
+        <enum value="0x327D" name="EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT"/>
+        <enum value="0x327E" name="EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT"/>
+        <enum value="0x327F" name="EGL_ITU_REC601_EXT"/>
+        <enum value="0x3280" name="EGL_ITU_REC709_EXT"/>
+        <enum value="0x3281" name="EGL_ITU_REC2020_EXT"/>
+        <enum value="0x3282" name="EGL_YUV_FULL_RANGE_EXT"/>
+        <enum value="0x3283" name="EGL_YUV_NARROW_RANGE_EXT"/>
+        <enum value="0x3284" name="EGL_YUV_CHROMA_SITING_0_EXT"/>
+        <enum value="0x3285" name="EGL_YUV_CHROMA_SITING_0_5_EXT"/>
+        <enum value="0x3286" name="EGL_DISCARD_SAMPLES_ARM"/>
+            <unused start="0x3287" end="0x328F"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3290" end="0x329F" vendor="MESA" comment="Reserved for John Kåre Alsaker (Public bug 757)">
+            <unused start="0x3290" end="0x329F"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x32A0" end="0x32AF" vendor="Samsung" comment="Reserved for Dongyeon Kim (Public bug 880)">
+        <enum value="0x32A0" name="EGL_NATIVE_BUFFER_TIZEN"/>
+        <enum value="0x32A1" name="EGL_NATIVE_SURFACE_TIZEN"/>
+            <unused start="0x32A2" end="0x32AF"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x32B0" end="0x32BF" vendor="QCOM" comment="Reserved for Jeff Vigil (Bug 10663) - EGL_QCOM_lock_image spec TBD">
+            <unused start="0x32B0" end="0x32BF"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x32C0" end="0x32CF" vendor="Vivante" comment="Reserved for Yanjun Zhang (Bug 11498)">
+        <enum value="0x32C0" name="EGL_PROTECTED_CONTENT_EXT"/>
+            <unused start="0x32C1" end="0x32CF"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x32D0" end="0x32EF" vendor="QCOM" comment="Reserved for Jeff Vigil (Bug 11735) - EGL_QCOM_gpu_perf spec TBD + Bug 12286 - EGL_QCOM_content_protection spec TBD">
+            <unused start="0x32D0" end="0x32EF"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x32F0" end="0x32FF" vendor="BCOM" comment="Reserved for Gary Sweet, Broadcom (Bug 12870)">
+            <unused start="0x32F0" end="0x32FF"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3300" end="0x331F" vendor="QCOM" comment="Reserved for Jeff Vigil (Bugs 12973,12849) - EGL_EXT_yuv_surface spec TBD">
+        <enum value="0x3300" name="EGL_YUV_BUFFER_EXT"/>
+        <enum value="0x3301" name="EGL_YUV_ORDER_EXT"/>
+        <enum value="0x3302" name="EGL_YUV_ORDER_YUV_EXT"/>
+        <enum value="0x3303" name="EGL_YUV_ORDER_YVU_EXT"/>
+        <enum value="0x3304" name="EGL_YUV_ORDER_YUYV_EXT"/>
+        <enum value="0x3305" name="EGL_YUV_ORDER_UYVY_EXT"/>
+        <enum value="0x3306" name="EGL_YUV_ORDER_YVYU_EXT"/>
+        <enum value="0x3307" name="EGL_YUV_ORDER_VYUY_EXT"/>
+        <enum value="0x3308" name="EGL_YUV_ORDER_AYUV_EXT"/>
+            <unused start="0x3309"/>
+        <enum value="0x330A" name="EGL_YUV_CSC_STANDARD_EXT"/>
+        <enum value="0x330B" name="EGL_YUV_CSC_STANDARD_601_EXT"/>
+        <enum value="0x330C" name="EGL_YUV_CSC_STANDARD_709_EXT"/>
+        <enum value="0x330D" name="EGL_YUV_CSC_STANDARD_2020_EXT"/>
+            <unused start="0x330E" end="0x3310"/>
+        <enum value="0x3311" name="EGL_YUV_NUMBER_OF_PLANES_EXT"/>
+        <enum value="0x3312" name="EGL_YUV_SUBSAMPLE_EXT"/>
+        <enum value="0x3313" name="EGL_YUV_SUBSAMPLE_4_2_0_EXT"/>
+        <enum value="0x3314" name="EGL_YUV_SUBSAMPLE_4_2_2_EXT"/>
+        <enum value="0x3315" name="EGL_YUV_SUBSAMPLE_4_4_4_EXT"/>
+            <unused start="0x3316"/>
+        <enum value="0x3317" name="EGL_YUV_DEPTH_RANGE_EXT"/>
+        <enum value="0x3318" name="EGL_YUV_DEPTH_RANGE_LIMITED_EXT"/>
+        <enum value="0x3319" name="EGL_YUV_DEPTH_RANGE_FULL_EXT"/>
+        <enum value="0x331A" name="EGL_YUV_PLANE_BPP_EXT"/>
+        <enum value="0x331B" name="EGL_YUV_PLANE_BPP_0_EXT"/>
+        <enum value="0x331C" name="EGL_YUV_PLANE_BPP_8_EXT"/>
+        <enum value="0x331D" name="EGL_YUV_PLANE_BPP_10_EXT"/>
+            <unused start="0x331E" end="0x331F"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x3320" end="0x339F" vendor="NV" comment="Reserved for James Jones (Bug 13209)">
+            <unused start="0x3320" end="0x339F"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x33A0" end="0x33AF" vendor="ANGLE" comment="Reserved for Shannon Woods (Bug 13175)">
+        <enum value="0x33A0" name="EGL_D3D9_DEVICE_ANGLE"/>
+        <enum value="0x33A1" name="EGL_D3D11_DEVICE_ANGLE"/>
+            <unused start="0x33A2" end="0x33AF"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x33B0" end="0x33BF" vendor="KHR" comment="Reserved for EGL_KHR_debug / Jeff Vigil (Bug 13357)">
+        <enum value="0x33B0" name="EGL_OBJECT_THREAD_KHR"/>
+        <enum value="0x33B1" name="EGL_OBJECT_DISPLAY_KHR"/>
+        <enum value="0x33B2" name="EGL_OBJECT_CONTEXT_KHR"/>
+        <enum value="0x33B3" name="EGL_OBJECT_SURFACE_KHR"/>
+        <enum value="0x33B4" name="EGL_OBJECT_IMAGE_KHR"/>
+        <enum value="0x33B5" name="EGL_OBJECT_SYNC_KHR"/>
+        <enum value="0x33B6" name="EGL_OBJECT_STREAM_KHR"/>
+            <unused start="0x33B7"/>
+        <enum value="0x33B8" name="EGL_DEBUG_CALLBACK_KHR"/>
+        <enum value="0x33B9" name="EGL_DEBUG_MSG_CRITICAL_KHR"/>
+        <enum value="0x33BA" name="EGL_DEBUG_MSG_ERROR_KHR"/>
+        <enum value="0x33BB" name="EGL_DEBUG_MSG_WARN_KHR"/>
+        <enum value="0x33BC" name="EGL_DEBUG_MSG_INFO_KHR"/>
+            <unused start="0x33BD" end="0x33BF"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x33C0" end="0x33DF" vendor="BCOM" comment="Reserved for Gary Sweet (Bug 12203)">
+            <unused start="0x33C0" end="0x33DF"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x33E0" end="0x342F" vendor="QCOM" comment="Reserved for Jeff Vigil (Bugs 10663,13364)">
+            <unused start="0x33E0" end="0x342F"/>
+    </enums>
+
+<!-- Please remember that new enumerant allocations must be obtained by
+     request to the Khronos API registrar (see comments at the top of this
+     file) File requests in the Khronos Bugzilla, EGL project, Registry
+     component. Also note that some EGL enum values are shared with other
+     Khronos APIs, and new ranges should be allocated with such overlaps in
+     mind. -->
+
+<!-- Reservable for future use. To generate a new range, allocate multiples
+     of 16 starting at the lowest available point in this block. -->
+    <enums namespace="EGL" start="0x3420" end="0x3FFF" vendor="KHR">
+            <unused start="0x3420" end="0x3FFF" comment="Reserved for future use"/>
+    </enums>
+
+    <enums namespace="EGL" start="0x8F70" end="0x8F7F" vendor="HI" comment="For Mark Callow, Khronos bug 4055. Shared with GL.">
+        <enum value="0x8F70" name="EGL_COLOR_FORMAT_HI"/>
+        <enum value="0x8F71" name="EGL_COLOR_RGB_HI"/>
+        <enum value="0x8F72" name="EGL_COLOR_RGBA_HI"/>
+        <enum value="0x8F73" name="EGL_COLOR_ARGB_HI"/>
+        <enum value="0x8F74" name="EGL_CLIENT_PIXMAP_POINTER_HI"/>
+    </enums>
+
+    <!-- SECTION: EGL command definitions. -->
+    <commands namespace="EGL">
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglBindAPI</name></proto>
+            <param><ptype>EGLenum</ptype> <name>api</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglBindTexImage</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+            <param><ptype>EGLint</ptype> <name>buffer</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglChooseConfig</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+            <param><ptype>EGLConfig</ptype> *<name>configs</name></param>
+            <param><ptype>EGLint</ptype> <name>config_size</name></param>
+            <param><ptype>EGLint</ptype> *<name>num_config</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLint</ptype> <name>eglClientWaitSync</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSync</ptype> <name>sync</name></param>
+            <param><ptype>EGLint</ptype> <name>flags</name></param>
+            <param><ptype>EGLTime</ptype> <name>timeout</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLint</ptype> <name>eglClientWaitSyncKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSyncKHR</ptype> <name>sync</name></param>
+            <param><ptype>EGLint</ptype> <name>flags</name></param>
+            <param><ptype>EGLTimeKHR</ptype> <name>timeout</name></param>
+            <alias name="eglClientWaitSync"/>
+        </command>
+        <command>
+            <proto><ptype>EGLint</ptype> <name>eglClientWaitSyncNV</name></proto>
+            <param><ptype>EGLSyncNV</ptype> <name>sync</name></param>
+            <param><ptype>EGLint</ptype> <name>flags</name></param>
+            <param><ptype>EGLTimeNV</ptype> <name>timeout</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglCopyBuffers</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+            <param><ptype>EGLNativePixmapType</ptype> <name>target</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLContext</ptype> <name>eglCreateContext</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLConfig</ptype> <name>config</name></param>
+            <param><ptype>EGLContext</ptype> <name>share_context</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLImageKHR</ptype> <name>eglCreateDRMImageMESA</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLSyncNV</ptype> <name>eglCreateFenceSyncNV</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLenum</ptype> <name>condition</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLImage</ptype> <name>eglCreateImage</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLContext</ptype> <name>ctx</name></param>
+            <param><ptype>EGLenum</ptype> <name>target</name></param>
+            <param><ptype>EGLClientBuffer</ptype> <name>buffer</name></param>
+            <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLImageKHR</ptype> <name>eglCreateImageKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLContext</ptype> <name>ctx</name></param>
+            <param><ptype>EGLenum</ptype> <name>target</name></param>
+            <param><ptype>EGLClientBuffer</ptype> <name>buffer</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLSurface</ptype> <name>eglCreatePbufferFromClientBuffer</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLenum</ptype> <name>buftype</name></param>
+            <param><ptype>EGLClientBuffer</ptype> <name>buffer</name></param>
+            <param><ptype>EGLConfig</ptype> <name>config</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLSurface</ptype> <name>eglCreatePbufferSurface</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLConfig</ptype> <name>config</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLSurface</ptype> <name>eglCreatePixmapSurface</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLConfig</ptype> <name>config</name></param>
+            <param><ptype>EGLNativePixmapType</ptype> <name>pixmap</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLSurface</ptype> <name>eglCreatePixmapSurfaceHI</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLConfig</ptype> <name>config</name></param>
+            <param>struct <ptype>EGLClientPixmapHI</ptype> *<name>pixmap</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLSurface</ptype> <name>eglCreatePlatformPixmapSurface</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLConfig</ptype> <name>config</name></param>
+            <param>void *<name>native_pixmap</name></param>
+            <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLSurface</ptype> <name>eglCreatePlatformPixmapSurfaceEXT</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLConfig</ptype> <name>config</name></param>
+            <param>void *<name>native_pixmap</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLSurface</ptype> <name>eglCreatePlatformWindowSurface</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLConfig</ptype> <name>config</name></param>
+            <param>void *<name>native_window</name></param>
+            <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLSurface</ptype> <name>eglCreatePlatformWindowSurfaceEXT</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLConfig</ptype> <name>config</name></param>
+            <param>void *<name>native_window</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLStreamKHR</ptype> <name>eglCreateStreamFromFileDescriptorKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLNativeFileDescriptorKHR</ptype> <name>file_descriptor</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLStreamKHR</ptype> <name>eglCreateStreamKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLSurface</ptype> <name>eglCreateStreamProducerSurfaceKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLConfig</ptype> <name>config</name></param>
+            <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLSyncKHR</ptype> <name>eglCreateStreamSyncNV</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param>
+            <param><ptype>EGLenum</ptype> <name>type</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLSync</ptype> <name>eglCreateSync</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLenum</ptype> <name>type</name></param>
+            <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLSyncKHR</ptype> <name>eglCreateSyncKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLenum</ptype> <name>type</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLSyncKHR</ptype> <name>eglCreateSync64KHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLenum</ptype> <name>type</name></param>
+            <param>const <ptype>EGLAttribKHR</ptype> *<name>attrib_list</name></param>
+            <alias name="eglCreateSync"/>
+        </command>
+        <command>
+            <proto><ptype>EGLSurface</ptype> <name>eglCreateWindowSurface</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLConfig</ptype> <name>config</name></param>
+            <param><ptype>EGLNativeWindowType</ptype> <name>win</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLint</ptype> <name>eglDebugMessageControlKHR</name></proto>
+            <param><ptype>EGLDEBUGPROCKHR</ptype> <name>callback</name></param>
+            <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglDestroyContext</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLContext</ptype> <name>ctx</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglDestroyImage</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLImage</ptype> <name>image</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglDestroyImageKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLImageKHR</ptype> <name>image</name></param>
+            <alias name="eglDestroyImage"/>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglDestroyStreamKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglDestroySurface</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglDestroySync</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSync</ptype> <name>sync</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglDestroySyncKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSyncKHR</ptype> <name>sync</name></param>
+            <alias name="eglDestroySync"/>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglDestroySyncNV</name></proto>
+            <param><ptype>EGLSyncNV</ptype> <name>sync</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLint</ptype> <name>eglDupNativeFenceFDANDROID</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSyncKHR</ptype> <name>sync</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglExportDMABUFImageMESA</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLImageKHR</ptype> <name>image</name></param>
+            <param>int *<name>fds</name></param>
+            <param><ptype>EGLint</ptype> *<name>strides</name></param>
+            <param><ptype>EGLint</ptype> *<name>offsets</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglExportDMABUFImageQueryMESA</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLImageKHR</ptype> <name>image</name></param>
+            <param>int *<name>fourcc</name></param>
+            <param>int *<name>num_planes</name></param>
+            <param><ptype>EGLuint64KHR</ptype> *<name>modifiers</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglExportDRMImageMESA</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLImageKHR</ptype> <name>image</name></param>
+            <param><ptype>EGLint</ptype> *<name>name</name></param>
+            <param><ptype>EGLint</ptype> *<name>handle</name></param>
+            <param><ptype>EGLint</ptype> *<name>stride</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglFenceNV</name></proto>
+            <param><ptype>EGLSyncNV</ptype> <name>sync</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglGetConfigAttrib</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLConfig</ptype> <name>config</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLint</ptype> *<name>value</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglGetConfigs</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLConfig</ptype> *<name>configs</name></param>
+            <param><ptype>EGLint</ptype> <name>config_size</name></param>
+            <param><ptype>EGLint</ptype> *<name>num_config</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLContext</ptype> <name>eglGetCurrentContext</name></proto>
+        </command>
+        <command>
+            <proto><ptype>EGLDisplay</ptype> <name>eglGetCurrentDisplay</name></proto>
+        </command>
+        <command>
+            <proto><ptype>EGLSurface</ptype> <name>eglGetCurrentSurface</name></proto>
+            <param><ptype>EGLint</ptype> <name>readdraw</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLDisplay</ptype> <name>eglGetDisplay</name></proto>
+            <param><ptype>EGLNativeDisplayType</ptype> <name>display_id</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLint</ptype> <name>eglGetError</name></proto>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglGetOutputLayersEXT</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param>
+            <param><ptype>EGLOutputLayerEXT</ptype> *<name>layers</name></param>
+            <param><ptype>EGLint</ptype> <name>max_layers</name></param>
+            <param><ptype>EGLint</ptype> *<name>num_layers</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglGetOutputPortsEXT</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param>
+            <param><ptype>EGLOutputPortEXT</ptype> *<name>ports</name></param>
+            <param><ptype>EGLint</ptype> <name>max_ports</name></param>
+            <param><ptype>EGLint</ptype> *<name>num_ports</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLDisplay</ptype> <name>eglGetPlatformDisplay</name></proto>
+            <param><ptype>EGLenum</ptype> <name>platform</name></param>
+            <param>void *<name>native_display</name></param>
+            <param>const <ptype>EGLAttrib</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLDisplay</ptype> <name>eglGetPlatformDisplayEXT</name></proto>
+            <param><ptype>EGLenum</ptype> <name>platform</name></param>
+            <param>void *<name>native_display</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>__eglMustCastToProperFunctionPointerType</ptype> <name>eglGetProcAddress</name></proto>
+            <param>const char *<name>procname</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLNativeFileDescriptorKHR</ptype> <name>eglGetStreamFileDescriptorKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglGetSyncAttrib</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSync</ptype> <name>sync</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLAttrib</ptype> *<name>value</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglGetSyncAttribKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSyncKHR</ptype> <name>sync</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLint</ptype> *<name>value</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglGetSyncAttribNV</name></proto>
+            <param><ptype>EGLSyncNV</ptype> <name>sync</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLint</ptype> *<name>value</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLuint64NV</ptype> <name>eglGetSystemTimeFrequencyNV</name></proto>
+        </command>
+        <command>
+            <proto><ptype>EGLuint64NV</ptype> <name>eglGetSystemTimeNV</name></proto>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglInitialize</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLint</ptype> *<name>major</name></param>
+            <param><ptype>EGLint</ptype> *<name>minor</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLint</ptype> <name>eglLabelObjectKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>display</name></param>
+            <param><ptype>EGLenum</ptype> <name>objectType</name></param>
+            <param><ptype>EGLObjectKHR</ptype> <name>object</name></param>
+            <param><ptype>EGLLabelKHR</ptype> <name>label</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglLockSurfaceKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>attrib_list</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglMakeCurrent</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>draw</name></param>
+            <param><ptype>EGLSurface</ptype> <name>read</name></param>
+            <param><ptype>EGLContext</ptype> <name>ctx</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglOutputLayerAttribEXT</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLOutputLayerEXT</ptype> <name>layer</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLAttrib</ptype> <name>value</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglOutputPortAttribEXT</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLOutputPortEXT</ptype> <name>port</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLAttrib</ptype> <name>value</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglPostSubBufferNV</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+            <param><ptype>EGLint</ptype> <name>x</name></param>
+            <param><ptype>EGLint</ptype> <name>y</name></param>
+            <param><ptype>EGLint</ptype> <name>width</name></param>
+            <param><ptype>EGLint</ptype> <name>height</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLenum</ptype> <name>eglQueryAPI</name></proto>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQueryContext</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLContext</ptype> <name>ctx</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLint</ptype> *<name>value</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQueryDebugKHR</name></proto>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLAttrib</ptype> *<name>value</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQueryDeviceAttribEXT</name></proto>
+            <param><ptype>EGLDeviceEXT</ptype> <name>device</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLAttrib</ptype> *<name>value</name></param>
+        </command>
+        <command>
+            <proto>const char *<name>eglQueryDeviceStringEXT</name></proto>
+            <param><ptype>EGLDeviceEXT</ptype> <name>device</name></param>
+            <param><ptype>EGLint</ptype> <name>name</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQueryDevicesEXT</name></proto>
+            <param><ptype>EGLint</ptype> <name>max_devices</name></param>
+            <param><ptype>EGLDeviceEXT</ptype> *<name>devices</name></param>
+            <param><ptype>EGLint</ptype> *<name>num_devices</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQueryDisplayAttribEXT</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLAttrib</ptype> *<name>value</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQueryNativeDisplayNV</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLNativeDisplayType</ptype> *<name>display_id</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQueryNativePixmapNV</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surf</name></param>
+            <param><ptype>EGLNativePixmapType</ptype> *<name>pixmap</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQueryNativeWindowNV</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surf</name></param>
+            <param><ptype>EGLNativeWindowType</ptype> *<name>window</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQueryOutputLayerAttribEXT</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLOutputLayerEXT</ptype> <name>layer</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLAttrib</ptype> *<name>value</name></param>
+        </command>
+        <command>
+            <proto>const char *<name>eglQueryOutputLayerStringEXT</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLOutputLayerEXT</ptype> <name>layer</name></param>
+            <param><ptype>EGLint</ptype> <name>name</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQueryOutputPortAttribEXT</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLOutputPortEXT</ptype> <name>port</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLAttrib</ptype> *<name>value</name></param>
+        </command>
+        <command>
+            <proto>const char *<name>eglQueryOutputPortStringEXT</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLOutputPortEXT</ptype> <name>port</name></param>
+            <param><ptype>EGLint</ptype> <name>name</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQueryStreamKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param>
+            <param><ptype>EGLenum</ptype> <name>attribute</name></param>
+            <param><ptype>EGLint</ptype> *<name>value</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQueryStreamTimeKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param>
+            <param><ptype>EGLenum</ptype> <name>attribute</name></param>
+            <param><ptype>EGLTimeKHR</ptype> *<name>value</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQueryStreamu64KHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param>
+            <param><ptype>EGLenum</ptype> <name>attribute</name></param>
+            <param><ptype>EGLuint64KHR</ptype> *<name>value</name></param>
+        </command>
+        <command>
+            <proto>const char *<name>eglQueryString</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLint</ptype> <name>name</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQuerySurface</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLint</ptype> *<name>value</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQuerySurface64KHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLAttribKHR</ptype> *<name>value</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglQuerySurfacePointerANGLE</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param>void **<name>value</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglReleaseTexImage</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+            <param><ptype>EGLint</ptype> <name>buffer</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglReleaseThread</name></proto>
+        </command>
+        <command>
+            <proto>void <name>eglSetBlobCacheFuncsANDROID</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSetBlobFuncANDROID</ptype> <name>set</name></param>
+            <param><ptype>EGLGetBlobFuncANDROID</ptype> <name>get</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglSetDamageRegionKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+            <param><ptype>EGLint</ptype> *<name>rects</name></param>
+            <param><ptype>EGLint</ptype> <name>n_rects</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglSignalSyncKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSyncKHR</ptype> <name>sync</name></param>
+            <param><ptype>EGLenum</ptype> <name>mode</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglSignalSyncNV</name></proto>
+            <param><ptype>EGLSyncNV</ptype> <name>sync</name></param>
+            <param><ptype>EGLenum</ptype> <name>mode</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglStreamAttribKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param>
+            <param><ptype>EGLenum</ptype> <name>attribute</name></param>
+            <param><ptype>EGLint</ptype> <name>value</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglStreamConsumerAcquireKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglStreamConsumerGLTextureExternalKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglStreamConsumerOutputEXT</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param>
+            <param><ptype>EGLOutputLayerEXT</ptype> <name>layer</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglStreamConsumerReleaseKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLStreamKHR</ptype> <name>stream</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglSurfaceAttrib</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLint</ptype> <name>value</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglSwapBuffers</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglSwapBuffersWithDamageEXT</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+            <param><ptype>EGLint</ptype> *<name>rects</name></param>
+            <param><ptype>EGLint</ptype> <name>n_rects</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglSwapBuffersWithDamageKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+            <param><ptype>EGLint</ptype> *<name>rects</name></param>
+            <param><ptype>EGLint</ptype> <name>n_rects</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglSwapBuffersRegionNOK</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+            <param><ptype>EGLint</ptype> <name>numRects</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>rects</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglSwapBuffersRegion2NOK</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+            <param><ptype>EGLint</ptype> <name>numRects</name></param>
+            <param>const <ptype>EGLint</ptype> *<name>rects</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglSwapInterval</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLint</ptype> <name>interval</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglTerminate</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglUnlockSurfaceKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglWaitClient</name></proto>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglWaitGL</name></proto>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglWaitNative</name></proto>
+            <param><ptype>EGLint</ptype> <name>engine</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLBoolean</ptype> <name>eglWaitSync</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSync</ptype> <name>sync</name></param>
+            <param><ptype>EGLint</ptype> <name>flags</name></param>
+        </command>
+        <command>
+            <proto><ptype>EGLint</ptype> <name>eglWaitSyncKHR</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLSyncKHR</ptype> <name>sync</name></param>
+            <param><ptype>EGLint</ptype> <name>flags</name></param>
+        </command>
+    </commands>
+
+    <!-- SECTION: EGL API interface definitions. -->
+    <feature api="egl" name="EGL_VERSION_1_0" number="1.0">
+        <require>
+            <enum name="EGL_ALPHA_SIZE"/>
+            <enum name="EGL_BAD_ACCESS"/>
+            <enum name="EGL_BAD_ALLOC"/>
+            <enum name="EGL_BAD_ATTRIBUTE"/>
+            <enum name="EGL_BAD_CONFIG"/>
+            <enum name="EGL_BAD_CONTEXT"/>
+            <enum name="EGL_BAD_CURRENT_SURFACE"/>
+            <enum name="EGL_BAD_DISPLAY"/>
+            <enum name="EGL_BAD_MATCH"/>
+            <enum name="EGL_BAD_NATIVE_PIXMAP"/>
+            <enum name="EGL_BAD_NATIVE_WINDOW"/>
+            <enum name="EGL_BAD_PARAMETER"/>
+            <enum name="EGL_BAD_SURFACE"/>
+            <enum name="EGL_BLUE_SIZE"/>
+            <enum name="EGL_BUFFER_SIZE"/>
+            <enum name="EGL_CONFIG_CAVEAT"/>
+            <enum name="EGL_CONFIG_ID"/>
+            <enum name="EGL_CORE_NATIVE_ENGINE"/>
+            <enum name="EGL_DEPTH_SIZE"/>
+            <enum name="EGL_DONT_CARE"/>
+            <enum name="EGL_DRAW"/>
+            <enum name="EGL_EXTENSIONS"/>
+            <enum name="EGL_FALSE"/>
+            <enum name="EGL_GREEN_SIZE"/>
+            <enum name="EGL_HEIGHT"/>
+            <enum name="EGL_LARGEST_PBUFFER"/>
+            <enum name="EGL_LEVEL"/>
+            <enum name="EGL_MAX_PBUFFER_HEIGHT"/>
+            <enum name="EGL_MAX_PBUFFER_PIXELS"/>
+            <enum name="EGL_MAX_PBUFFER_WIDTH"/>
+            <enum name="EGL_NATIVE_RENDERABLE"/>
+            <enum name="EGL_NATIVE_VISUAL_ID"/>
+            <enum name="EGL_NATIVE_VISUAL_TYPE"/>
+            <enum name="EGL_NONE"/>
+            <enum name="EGL_NON_CONFORMANT_CONFIG"/>
+            <enum name="EGL_NOT_INITIALIZED"/>
+            <enum name="EGL_NO_CONTEXT"/>
+            <enum name="EGL_NO_DISPLAY"/>
+            <enum name="EGL_NO_SURFACE"/>
+            <enum name="EGL_PBUFFER_BIT"/>
+            <enum name="EGL_PIXMAP_BIT"/>
+            <enum name="EGL_READ"/>
+            <enum name="EGL_RED_SIZE"/>
+            <enum name="EGL_SAMPLES"/>
+            <enum name="EGL_SAMPLE_BUFFERS"/>
+            <enum name="EGL_SLOW_CONFIG"/>
+            <enum name="EGL_STENCIL_SIZE"/>
+            <enum name="EGL_SUCCESS"/>
+            <enum name="EGL_SURFACE_TYPE"/>
+            <enum name="EGL_TRANSPARENT_BLUE_VALUE"/>
+            <enum name="EGL_TRANSPARENT_GREEN_VALUE"/>
+            <enum name="EGL_TRANSPARENT_RED_VALUE"/>
+            <enum name="EGL_TRANSPARENT_RGB"/>
+            <enum name="EGL_TRANSPARENT_TYPE"/>
+            <enum name="EGL_TRUE"/>
+            <enum name="EGL_VENDOR"/>
+            <enum name="EGL_VERSION"/>
+            <enum name="EGL_WIDTH"/>
+            <enum name="EGL_WINDOW_BIT"/>
+            <command name="eglChooseConfig"/>
+            <command name="eglCopyBuffers"/>
+            <command name="eglCreateContext"/>
+            <command name="eglCreatePbufferSurface"/>
+            <command name="eglCreatePixmapSurface"/>
+            <command name="eglCreateWindowSurface"/>
+            <command name="eglDestroyContext"/>
+            <command name="eglDestroySurface"/>
+            <command name="eglGetConfigAttrib"/>
+            <command name="eglGetConfigs"/>
+            <command name="eglGetCurrentDisplay"/>
+            <command name="eglGetCurrentSurface"/>
+            <command name="eglGetDisplay"/>
+            <command name="eglGetError"/>
+            <command name="eglGetProcAddress"/>
+            <command name="eglInitialize"/>
+            <command name="eglMakeCurrent"/>
+            <command name="eglQueryContext"/>
+            <command name="eglQueryString"/>
+            <command name="eglQuerySurface"/>
+            <command name="eglSwapBuffers"/>
+            <command name="eglTerminate"/>
+            <command name="eglWaitGL"/>
+            <command name="eglWaitNative"/>
+        </require>
+    </feature>
+    <feature api="egl" name="EGL_VERSION_1_1" number="1.1">
+        <require>
+            <enum name="EGL_BACK_BUFFER"/>
+            <enum name="EGL_BIND_TO_TEXTURE_RGB"/>
+            <enum name="EGL_BIND_TO_TEXTURE_RGBA"/>
+            <enum name="EGL_CONTEXT_LOST"/>
+            <enum name="EGL_MIN_SWAP_INTERVAL"/>
+            <enum name="EGL_MAX_SWAP_INTERVAL"/>
+            <enum name="EGL_MIPMAP_TEXTURE"/>
+            <enum name="EGL_MIPMAP_LEVEL"/>
+            <enum name="EGL_NO_TEXTURE"/>
+            <enum name="EGL_TEXTURE_2D"/>
+            <enum name="EGL_TEXTURE_FORMAT"/>
+            <enum name="EGL_TEXTURE_RGB"/>
+            <enum name="EGL_TEXTURE_RGBA"/>
+            <enum name="EGL_TEXTURE_TARGET"/>
+            <command name="eglBindTexImage"/>
+            <command name="eglReleaseTexImage"/>
+            <command name="eglSurfaceAttrib"/>
+            <command name="eglSwapInterval"/>
+        </require>
+    </feature>
+    <feature api="egl" name="EGL_VERSION_1_2" number="1.2">
+        <require>
+            <enum name="EGL_ALPHA_FORMAT"/>
+            <enum name="EGL_ALPHA_FORMAT_NONPRE"/>
+            <enum name="EGL_ALPHA_FORMAT_PRE"/>
+            <enum name="EGL_ALPHA_MASK_SIZE"/>
+            <enum name="EGL_BUFFER_PRESERVED"/>
+            <enum name="EGL_BUFFER_DESTROYED"/>
+            <enum name="EGL_CLIENT_APIS"/>
+            <enum name="EGL_COLORSPACE"/>
+            <enum name="EGL_COLORSPACE_sRGB"/>
+            <enum name="EGL_COLORSPACE_LINEAR"/>
+            <enum name="EGL_COLOR_BUFFER_TYPE"/>
+            <enum name="EGL_CONTEXT_CLIENT_TYPE"/>
+            <enum name="EGL_DISPLAY_SCALING"/>
+            <enum name="EGL_HORIZONTAL_RESOLUTION"/>
+            <enum name="EGL_LUMINANCE_BUFFER"/>
+            <enum name="EGL_LUMINANCE_SIZE"/>
+            <enum name="EGL_OPENGL_ES_BIT"/>
+            <enum name="EGL_OPENVG_BIT"/>
+            <enum name="EGL_OPENGL_ES_API"/>
+            <enum name="EGL_OPENVG_API"/>
+            <enum name="EGL_OPENVG_IMAGE"/>
+            <enum name="EGL_PIXEL_ASPECT_RATIO"/>
+            <enum name="EGL_RENDERABLE_TYPE"/>
+            <enum name="EGL_RENDER_BUFFER"/>
+            <enum name="EGL_RGB_BUFFER"/>
+            <enum name="EGL_SINGLE_BUFFER"/>
+            <enum name="EGL_SWAP_BEHAVIOR"/>
+            <enum name="EGL_UNKNOWN"/>
+            <enum name="EGL_VERTICAL_RESOLUTION"/>
+            <command name="eglBindAPI"/>
+            <command name="eglQueryAPI"/>
+            <command name="eglCreatePbufferFromClientBuffer"/>
+            <command name="eglReleaseThread"/>
+            <command name="eglWaitClient"/>
+        </require>
+    </feature>
+    <feature api="egl" name="EGL_VERSION_1_3" number="1.3">
+        <require>
+            <enum name="EGL_CONFORMANT"/>
+            <enum name="EGL_CONTEXT_CLIENT_VERSION"/>
+            <enum name="EGL_MATCH_NATIVE_PIXMAP"/>
+            <enum name="EGL_OPENGL_ES2_BIT"/>
+            <enum name="EGL_VG_ALPHA_FORMAT"/>
+            <enum name="EGL_VG_ALPHA_FORMAT_NONPRE"/>
+            <enum name="EGL_VG_ALPHA_FORMAT_PRE"/>
+            <enum name="EGL_VG_ALPHA_FORMAT_PRE_BIT"/>
+            <enum name="EGL_VG_COLORSPACE"/>
+            <enum name="EGL_VG_COLORSPACE_sRGB"/>
+            <enum name="EGL_VG_COLORSPACE_LINEAR"/>
+            <enum name="EGL_VG_COLORSPACE_LINEAR_BIT"/>
+        </require>
+    </feature>
+    <feature api="egl" name="EGL_VERSION_1_4" number="1.4">
+        <require>
+            <enum name="EGL_DEFAULT_DISPLAY"/>
+            <enum name="EGL_MULTISAMPLE_RESOLVE_BOX_BIT"/>
+            <enum name="EGL_MULTISAMPLE_RESOLVE"/>
+            <enum name="EGL_MULTISAMPLE_RESOLVE_DEFAULT"/>
+            <enum name="EGL_MULTISAMPLE_RESOLVE_BOX"/>
+            <enum name="EGL_OPENGL_API"/>
+            <enum name="EGL_OPENGL_BIT"/>
+            <enum name="EGL_SWAP_BEHAVIOR_PRESERVED_BIT"/>
+            <command name="eglGetCurrentContext"/>
+        </require>
+    </feature>
+    <feature api="egl" name="EGL_VERSION_1_5" number="1.5">
+        <require comment="EGL_KHR_create_context features">
+            <enum name="EGL_CONTEXT_MAJOR_VERSION"/>
+            <enum name="EGL_CONTEXT_MINOR_VERSION"/>
+            <enum name="EGL_CONTEXT_OPENGL_PROFILE_MASK"/>
+            <enum name="EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY"/>
+            <enum name="EGL_NO_RESET_NOTIFICATION"/>
+            <enum name="EGL_LOSE_CONTEXT_ON_RESET"/>
+            <enum name="EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT"/>
+            <enum name="EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT"/>
+            <enum name="EGL_CONTEXT_OPENGL_DEBUG"/>
+            <enum name="EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE"/>
+            <enum name="EGL_CONTEXT_OPENGL_ROBUST_ACCESS"/>
+            <enum name="EGL_OPENGL_ES3_BIT"/>
+        </require>
+        <require comment="EGL_EXT_create_context_robustness">
+            <enum name="EGL_CONTEXT_OPENGL_ROBUST_ACCESS"/>
+            <enum name="EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY"/>
+        </require>
+        <require comment="EGL_EXT_client_extensions"/>
+        <require comment="EGL_KHR_cl_event2">
+            <enum name="EGL_CL_EVENT_HANDLE"/>
+            <enum name="EGL_SYNC_CL_EVENT"/>
+            <enum name="EGL_SYNC_CL_EVENT_COMPLETE"/>
+        </require>
+        <require comment="EGL_KHR_fence_sync">
+            <enum name="EGL_SYNC_PRIOR_COMMANDS_COMPLETE"/>
+            <enum name="EGL_SYNC_TYPE"/>
+            <enum name="EGL_SYNC_STATUS"/>
+            <enum name="EGL_SYNC_CONDITION"/>
+            <enum name="EGL_SIGNALED"/>
+            <enum name="EGL_UNSIGNALED"/>
+            <enum name="EGL_SYNC_FLUSH_COMMANDS_BIT"/>
+            <enum name="EGL_FOREVER"/>
+            <enum name="EGL_TIMEOUT_EXPIRED"/>
+            <enum name="EGL_CONDITION_SATISFIED"/>
+            <enum name="EGL_NO_SYNC"/>
+            <enum name="EGL_SYNC_FENCE"/>
+            <command name="eglCreateSync"/>
+            <command name="eglDestroySync"/>
+            <command name="eglClientWaitSync"/>
+            <command name="eglGetSyncAttrib"/>
+        </require>
+        <require comment="EGL_KHR_get_all_proc_addresses"/>
+        <require comment="EGL_KHR_client_get_all_proc_addresses"/>
+        <require comment="EGL_KHR_gl_colorspace">
+            <enum name="EGL_GL_COLORSPACE"/>
+            <enum name="EGL_GL_COLORSPACE_SRGB"/>
+            <enum name="EGL_GL_COLORSPACE_LINEAR"/>
+        </require>
+        <require comment="EGL_KHR_gl_renderbuffer_image">
+            <enum name="EGL_GL_RENDERBUFFER"/>
+        </require>
+        <require comment="EGL_KHR_gl_texture_2D_image">
+            <enum name="EGL_GL_TEXTURE_2D"/>
+            <enum name="EGL_GL_TEXTURE_LEVEL"/>
+        </require>
+        <require comment="EGL_KHR_gl_texture_3D_image">
+            <enum name="EGL_GL_TEXTURE_3D"/>
+            <enum name="EGL_GL_TEXTURE_ZOFFSET"/>
+        </require>
+        <require comment="EGL_KHR_gl_texture_cubemap_image">
+            <enum name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X"/>
+            <enum name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X"/>
+            <enum name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y"/>
+            <enum name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y"/>
+            <enum name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z"/>
+            <enum name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z"/>
+        </require>
+        <require comment="EGL_KHR_image_base">
+            <enum name="EGL_IMAGE_PRESERVED"/>
+            <enum name="EGL_NO_IMAGE"/>
+            <command name="eglCreateImage"/>
+            <command name="eglDestroyImage"/>
+        </require>
+        <require comment="EGL_EXT_platform_base">
+            <command name="eglGetPlatformDisplay"/>
+            <command name="eglCreatePlatformWindowSurface"/>
+            <command name="eglCreatePlatformPixmapSurface"/>
+        </require>
+        <require comment="EGL_KHR_surfaceless_context - just relaxes an error condition"/>
+        <require comment="EGL_KHR_wait_sync">
+            <command name="eglWaitSync"/>
+        </require>
+    </feature>
+
+    <!-- SECTION: EGL extension interface definitions -->
+    <extensions>
+        <extension name="EGL_ANDROID_blob_cache" supported="egl">
+            <require>
+                <command name="eglSetBlobCacheFuncsANDROID"/>
+            </require>
+        </extension>
+        <extension name="EGL_ANDROID_framebuffer_target" supported="egl">
+            <require>
+                <enum name="EGL_FRAMEBUFFER_TARGET_ANDROID"/>
+            </require>
+        </extension>
+        <extension name="EGL_ANDROID_image_native_buffer" supported="egl">
+            <require>
+                <enum name="EGL_NATIVE_BUFFER_ANDROID"/>
+            </require>
+        </extension>
+        <extension name="EGL_ANDROID_native_fence_sync" supported="egl">
+            <require>
+                <enum name="EGL_SYNC_NATIVE_FENCE_ANDROID"/>
+                <enum name="EGL_SYNC_NATIVE_FENCE_FD_ANDROID"/>
+                <enum name="EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID"/>
+                <enum name="EGL_NO_NATIVE_FENCE_FD_ANDROID"/>
+                <command name="eglDupNativeFenceFDANDROID"/>
+            </require>
+        </extension>
+        <extension name="EGL_ANDROID_recordable" supported="egl">
+            <require>
+                <enum name="EGL_RECORDABLE_ANDROID"/>
+            </require>
+        </extension>
+        <extension name="EGL_ANGLE_d3d_share_handle_client_buffer" supported="egl">
+            <require>
+                <enum name="EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE"/>
+            </require>
+        </extension>
+        <extension name="EGL_ANGLE_device_d3d" supported="egl">
+            <require>
+                <enum name="EGL_D3D9_DEVICE_ANGLE"/>
+                <enum name="EGL_D3D11_DEVICE_ANGLE"/>
+            </require>
+        </extension>
+        <extension name="EGL_ANGLE_query_surface_pointer" supported="egl">
+            <require>
+                <command name="eglQuerySurfacePointerANGLE"/>
+            </require>
+        </extension>
+        <extension name="EGL_ANGLE_surface_d3d_texture_2d_share_handle" supported="egl">
+            <require>
+                <enum name="EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE"/>
+            </require>
+        </extension>
+        <extension name="EGL_ANGLE_window_fixed_size" supported="egl">
+            <require>
+                <enum name="EGL_FIXED_SIZE_ANGLE"/>
+            </require>
+        </extension>
+        <extension name="EGL_ARM_pixmap_multisample_discard" supported="egl">
+            <require>
+                <enum name="EGL_DISCARD_SAMPLES_ARM"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_buffer_age" supported="egl">
+            <require>
+                <enum name="EGL_BUFFER_AGE_EXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_client_extensions" supported="egl"/>
+        <extension name="EGL_EXT_create_context_robustness" supported="egl">
+            <require>
+                <enum name="EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT"/>
+                <enum name="EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT"/>
+                <enum name="EGL_NO_RESET_NOTIFICATION_EXT"/>
+                <enum name="EGL_LOSE_CONTEXT_ON_RESET_EXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_device_base" supported="egl">
+            <require>
+                <enum name="EGL_NO_DEVICE_EXT"/>
+                <enum name="EGL_BAD_DEVICE_EXT"/>
+                <enum name="EGL_DEVICE_EXT"/>
+                <command name="eglQueryDeviceAttribEXT"/>
+                <command name="eglQueryDeviceStringEXT"/>
+                <command name="eglQueryDevicesEXT"/>
+                <command name="eglQueryDisplayAttribEXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_device_drm" supported="egl">
+            <require>
+                <enum name="EGL_DRM_DEVICE_FILE_EXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_device_enumeration" supported="egl">
+            <require>
+                <command name="eglQueryDevicesEXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_device_openwf" supported="egl">
+            <require>
+                <enum name="EGL_OPENWF_DEVICE_ID_EXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_device_query" supported="egl">
+            <require>
+                <enum name="EGL_NO_DEVICE_EXT"/>
+                <enum name="EGL_BAD_DEVICE_EXT"/>
+                <enum name="EGL_DEVICE_EXT"/>
+                <command name="eglQueryDeviceAttribEXT"/>
+                <command name="eglQueryDeviceStringEXT"/>
+                <command name="eglQueryDisplayAttribEXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_image_dma_buf_import" supported="egl">
+            <require>
+                <enum name="EGL_LINUX_DMA_BUF_EXT"/>
+                <enum name="EGL_LINUX_DRM_FOURCC_EXT"/>
+                <enum name="EGL_DMA_BUF_PLANE0_FD_EXT"/>
+                <enum name="EGL_DMA_BUF_PLANE0_OFFSET_EXT"/>
+                <enum name="EGL_DMA_BUF_PLANE0_PITCH_EXT"/>
+                <enum name="EGL_DMA_BUF_PLANE1_FD_EXT"/>
+                <enum name="EGL_DMA_BUF_PLANE1_OFFSET_EXT"/>
+                <enum name="EGL_DMA_BUF_PLANE1_PITCH_EXT"/>
+                <enum name="EGL_DMA_BUF_PLANE2_FD_EXT"/>
+                <enum name="EGL_DMA_BUF_PLANE2_OFFSET_EXT"/>
+                <enum name="EGL_DMA_BUF_PLANE2_PITCH_EXT"/>
+                <enum name="EGL_YUV_COLOR_SPACE_HINT_EXT"/>
+                <enum name="EGL_SAMPLE_RANGE_HINT_EXT"/>
+                <enum name="EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT"/>
+                <enum name="EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT"/>
+                <enum name="EGL_ITU_REC601_EXT"/>
+                <enum name="EGL_ITU_REC709_EXT"/>
+                <enum name="EGL_ITU_REC2020_EXT"/>
+                <enum name="EGL_YUV_FULL_RANGE_EXT"/>
+                <enum name="EGL_YUV_NARROW_RANGE_EXT"/>
+                <enum name="EGL_YUV_CHROMA_SITING_0_EXT"/>
+                <enum name="EGL_YUV_CHROMA_SITING_0_5_EXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_multiview_window" supported="egl">
+            <require>
+                <enum name="EGL_MULTIVIEW_VIEW_COUNT_EXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_output_base" supported="egl">
+            <require>
+                <type name="EGLOutputLayerEXT"/>
+                <type name="EGLOutputPortEXT"/>
+                <enum name="EGL_NO_OUTPUT_LAYER_EXT"/>
+                <enum name="EGL_NO_OUTPUT_PORT_EXT"/>
+                <enum name="EGL_BAD_OUTPUT_LAYER_EXT"/>
+                <enum name="EGL_BAD_OUTPUT_PORT_EXT"/>
+                <enum name="EGL_SWAP_INTERVAL_EXT"/>
+                <command name="eglGetOutputLayersEXT"/>
+                <command name="eglGetOutputPortsEXT"/>
+                <command name="eglOutputLayerAttribEXT"/>
+                <command name="eglQueryOutputLayerAttribEXT"/>
+                <command name="eglQueryOutputLayerStringEXT"/>
+                <command name="eglOutputPortAttribEXT"/>
+                <command name="eglQueryOutputPortAttribEXT"/>
+                <command name="eglQueryOutputPortStringEXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_output_drm" supported="egl">
+            <require>
+                <enum name="EGL_DRM_CRTC_EXT"/>
+                <enum name="EGL_DRM_PLANE_EXT"/>
+                <enum name="EGL_DRM_CONNECTOR_EXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_output_openwf" supported="egl">
+            <require>
+                <enum name="EGL_OPENWF_PIPELINE_ID_EXT"/>
+                <enum name="EGL_OPENWF_PORT_ID_EXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_platform_base" supported="egl">
+            <require>
+                <command name="eglGetPlatformDisplayEXT"/>
+                <command name="eglCreatePlatformWindowSurfaceEXT"/>
+                <command name="eglCreatePlatformPixmapSurfaceEXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_platform_device" supported="egl">
+            <require>
+                <enum name="EGL_PLATFORM_DEVICE_EXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_platform_wayland" supported="egl">
+            <require>
+                <enum name="EGL_PLATFORM_WAYLAND_EXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_platform_x11" supported="egl">
+            <require>
+                <enum name="EGL_PLATFORM_X11_EXT"/>
+                <enum name="EGL_PLATFORM_X11_SCREEN_EXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_protected_surface" supported="egl">
+            <require>
+                <enum name="EGL_PROTECTED_CONTENT_EXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_stream_consumer_egloutput" supported="egl">
+            <require>
+                <command name="eglStreamConsumerOutputEXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_swap_buffers_with_damage" supported="egl">
+            <require>
+                <command name="eglSwapBuffersWithDamageEXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_EXT_yuv_surface" supported="egl">
+            <require>
+                <enum name="EGL_YUV_ORDER_EXT"/>
+                <enum name="EGL_YUV_NUMBER_OF_PLANES_EXT"/>
+                <enum name="EGL_YUV_SUBSAMPLE_EXT"/>
+                <enum name="EGL_YUV_DEPTH_RANGE_EXT"/>
+                <enum name="EGL_YUV_CSC_STANDARD_EXT"/>
+                <enum name="EGL_YUV_PLANE_BPP_EXT"/>
+                <enum name="EGL_YUV_BUFFER_EXT"/>
+                <enum name="EGL_YUV_ORDER_YUV_EXT"/>
+                <enum name="EGL_YUV_ORDER_YVU_EXT"/>
+                <enum name="EGL_YUV_ORDER_YUYV_EXT"/>
+                <enum name="EGL_YUV_ORDER_UYVY_EXT"/>
+                <enum name="EGL_YUV_ORDER_YVYU_EXT"/>
+                <enum name="EGL_YUV_ORDER_VYUY_EXT"/>
+                <enum name="EGL_YUV_ORDER_AYUV_EXT"/>
+                <enum name="EGL_YUV_SUBSAMPLE_4_2_0_EXT"/>
+                <enum name="EGL_YUV_SUBSAMPLE_4_2_2_EXT"/>
+                <enum name="EGL_YUV_SUBSAMPLE_4_4_4_EXT"/>
+                <enum name="EGL_YUV_DEPTH_RANGE_LIMITED_EXT"/>
+                <enum name="EGL_YUV_DEPTH_RANGE_FULL_EXT"/>
+                <enum name="EGL_YUV_CSC_STANDARD_601_EXT"/>
+                <enum name="EGL_YUV_CSC_STANDARD_709_EXT"/>
+                <enum name="EGL_YUV_CSC_STANDARD_2020_EXT"/>
+                <enum name="EGL_YUV_PLANE_BPP_0_EXT"/>
+                <enum name="EGL_YUV_PLANE_BPP_8_EXT"/>
+                <enum name="EGL_YUV_PLANE_BPP_10_EXT"/>
+            </require>
+        </extension>
+        <extension name="EGL_HI_clientpixmap" supported="egl">
+            <require>
+                <enum name="EGL_CLIENT_PIXMAP_POINTER_HI"/>
+                <command name="eglCreatePixmapSurfaceHI"/>
+            </require>
+        </extension>
+        <extension name="EGL_HI_colorformats" supported="egl">
+            <require>
+                <enum name="EGL_COLOR_FORMAT_HI"/>
+                <enum name="EGL_COLOR_RGB_HI"/>
+                <enum name="EGL_COLOR_RGBA_HI"/>
+                <enum name="EGL_COLOR_ARGB_HI"/>
+            </require>
+        </extension>
+        <extension name="EGL_IMG_context_priority" supported="egl">
+            <require>
+                <enum name="EGL_CONTEXT_PRIORITY_LEVEL_IMG"/>
+                <enum name="EGL_CONTEXT_PRIORITY_HIGH_IMG"/>
+                <enum name="EGL_CONTEXT_PRIORITY_MEDIUM_IMG"/>
+                <enum name="EGL_CONTEXT_PRIORITY_LOW_IMG"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_cl_event" supported="egl">
+            <require>
+                <enum name="EGL_CL_EVENT_HANDLE_KHR"/>
+                <enum name="EGL_SYNC_CL_EVENT_KHR"/>
+                <enum name="EGL_SYNC_CL_EVENT_COMPLETE_KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_cl_event2" supported="egl">
+            <require>
+                <enum name="EGL_CL_EVENT_HANDLE_KHR"/>
+                <enum name="EGL_SYNC_CL_EVENT_KHR"/>
+                <enum name="EGL_SYNC_CL_EVENT_COMPLETE_KHR"/>
+                <command name="eglCreateSync64KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_config_attribs" supported="egl">
+            <require>
+                <enum name="EGL_CONFORMANT_KHR"/>
+                <enum name="EGL_VG_COLORSPACE_LINEAR_BIT_KHR"/>
+                <enum name="EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_client_get_all_proc_addresses" supported="egl" comment="Alias of EGL_KHR_get_all_proc_addresses"/>
+        <extension name="EGL_KHR_create_context" supported="egl">
+            <require>
+                <enum name="EGL_CONTEXT_MAJOR_VERSION_KHR"/>
+                <enum name="EGL_CONTEXT_MINOR_VERSION_KHR"/>
+                <enum name="EGL_CONTEXT_FLAGS_KHR"/>
+                <enum name="EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR"/>
+                <enum name="EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR"/>
+                <enum name="EGL_NO_RESET_NOTIFICATION_KHR"/>
+                <enum name="EGL_LOSE_CONTEXT_ON_RESET_KHR"/>
+                <enum name="EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR"/>
+                <enum name="EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR"/>
+                <enum name="EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR"/>
+                <enum name="EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR"/>
+                <enum name="EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR"/>
+                <enum name="EGL_OPENGL_ES3_BIT"/>
+                <enum name="EGL_OPENGL_ES3_BIT_KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_create_context_no_error" supported="egl">
+            <require>
+                <enum name="EGL_CONTEXT_OPENGL_NO_ERROR_KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_debug" supported="egl">
+            <require>
+                    <!-- Explicit dependencies require to get EGLDEBUGPROCKHR dependencies correct -->
+                <type name="EGLLabelKHR"/>
+                <type name="EGLObjectKHR"/>
+                <enum name="EGL_OBJECT_THREAD_KHR"/>
+                <enum name="EGL_OBJECT_DISPLAY_KHR"/>
+                <enum name="EGL_OBJECT_CONTEXT_KHR"/>
+                <enum name="EGL_OBJECT_SURFACE_KHR"/>
+                <enum name="EGL_OBJECT_IMAGE_KHR"/>
+                <enum name="EGL_OBJECT_SYNC_KHR"/>
+                <enum name="EGL_OBJECT_STREAM_KHR"/>
+                <enum name="EGL_DEBUG_MSG_CRITICAL_KHR"/>
+                <enum name="EGL_DEBUG_MSG_ERROR_KHR"/>
+                <enum name="EGL_DEBUG_MSG_WARN_KHR"/>
+                <enum name="EGL_DEBUG_MSG_INFO_KHR"/>
+                <enum name="EGL_DEBUG_CALLBACK_KHR"/>
+                <command name="eglDebugMessageControlKHR"/>
+                <command name="eglQueryDebugKHR"/>
+                <command name="eglLabelObjectKHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_fence_sync" protect="KHRONOS_SUPPORT_INT64" supported="egl">
+            <require>
+                <!-- Most interfaces also defined by EGL_KHR_reusable sync -->
+                <enum name="EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR"/>
+                <enum name="EGL_SYNC_CONDITION_KHR"/>
+                <enum name="EGL_SYNC_FENCE_KHR"/>
+                <command name="eglCreateSyncKHR"/>
+                <command name="eglDestroySyncKHR"/>
+                <command name="eglClientWaitSyncKHR"/>
+                <command name="eglGetSyncAttribKHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_get_all_proc_addresses" supported="egl"/>
+        <extension name="EGL_KHR_gl_colorspace" supported="egl">
+            <require>
+                <enum name="EGL_GL_COLORSPACE_KHR"/>
+                <enum name="EGL_GL_COLORSPACE_SRGB_KHR"/>
+                <enum name="EGL_GL_COLORSPACE_LINEAR_KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_gl_renderbuffer_image" supported="egl">
+            <require>
+                <enum name="EGL_GL_RENDERBUFFER_KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_gl_texture_2D_image" supported="egl">
+            <require>
+                <enum name="EGL_GL_TEXTURE_2D_KHR"/>
+                <enum name="EGL_GL_TEXTURE_LEVEL_KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_gl_texture_3D_image" supported="egl">
+            <require>
+                <enum name="EGL_GL_TEXTURE_3D_KHR"/>
+                <enum name="EGL_GL_TEXTURE_ZOFFSET_KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_gl_texture_cubemap_image" supported="egl">
+            <require>
+                <enum name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR"/>
+                <enum name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR"/>
+                <enum name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR"/>
+                <enum name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR"/>
+                <enum name="EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR"/>
+                <enum name="EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_image" supported="egl">
+            <require>
+                <enum name="EGL_NATIVE_PIXMAP_KHR"/>
+                <enum name="EGL_NO_IMAGE_KHR"/>
+                <command name="eglCreateImageKHR"/>
+                <command name="eglDestroyImageKHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_image_base" supported="egl">
+            <require>
+                <enum name="EGL_IMAGE_PRESERVED_KHR"/>
+                <enum name="EGL_NO_IMAGE_KHR"/>
+                <command name="eglCreateImageKHR"/>
+                <command name="eglDestroyImageKHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_image_pixmap" supported="egl">
+            <require>
+                <enum name="EGL_NATIVE_PIXMAP_KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_lock_surface" supported="egl">
+            <require>
+                <enum name="EGL_READ_SURFACE_BIT_KHR"/>
+                <enum name="EGL_WRITE_SURFACE_BIT_KHR"/>
+                <enum name="EGL_LOCK_SURFACE_BIT_KHR"/>
+                <enum name="EGL_OPTIMAL_FORMAT_BIT_KHR"/>
+                <enum name="EGL_MATCH_FORMAT_KHR"/>
+                <enum name="EGL_FORMAT_RGB_565_EXACT_KHR"/>
+                <enum name="EGL_FORMAT_RGB_565_KHR"/>
+                <enum name="EGL_FORMAT_RGBA_8888_EXACT_KHR"/>
+                <enum name="EGL_FORMAT_RGBA_8888_KHR"/>
+                <enum name="EGL_MAP_PRESERVE_PIXELS_KHR"/>
+                <enum name="EGL_LOCK_USAGE_HINT_KHR"/>
+                <enum name="EGL_BITMAP_POINTER_KHR"/>
+                <enum name="EGL_BITMAP_PITCH_KHR"/>
+                <enum name="EGL_BITMAP_ORIGIN_KHR"/>
+                <enum name="EGL_BITMAP_PIXEL_RED_OFFSET_KHR"/>
+                <enum name="EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR"/>
+                <enum name="EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR"/>
+                <enum name="EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR"/>
+                <enum name="EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR"/>
+                <enum name="EGL_LOWER_LEFT_KHR"/>
+                <enum name="EGL_UPPER_LEFT_KHR"/>
+                <command name="eglLockSurfaceKHR"/>
+                <command name="eglUnlockSurfaceKHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_lock_surface2" supported="egl">
+            <require>
+                <enum name="EGL_BITMAP_PIXEL_SIZE_KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_lock_surface3" supported="egl">
+            <require>
+                <enum name="EGL_READ_SURFACE_BIT_KHR"/>
+                <enum name="EGL_WRITE_SURFACE_BIT_KHR"/>
+                <enum name="EGL_LOCK_SURFACE_BIT_KHR"/>
+                <enum name="EGL_OPTIMAL_FORMAT_BIT_KHR"/>
+                <enum name="EGL_MATCH_FORMAT_KHR"/>
+                <enum name="EGL_FORMAT_RGB_565_EXACT_KHR"/>
+                <enum name="EGL_FORMAT_RGB_565_KHR"/>
+                <enum name="EGL_FORMAT_RGBA_8888_EXACT_KHR"/>
+                <enum name="EGL_FORMAT_RGBA_8888_KHR"/>
+                <enum name="EGL_MAP_PRESERVE_PIXELS_KHR"/>
+                <enum name="EGL_LOCK_USAGE_HINT_KHR"/>
+                <enum name="EGL_BITMAP_PITCH_KHR"/>
+                <enum name="EGL_BITMAP_ORIGIN_KHR"/>
+                <enum name="EGL_BITMAP_PIXEL_RED_OFFSET_KHR"/>
+                <enum name="EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR"/>
+                <enum name="EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR"/>
+                <enum name="EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR"/>
+                <enum name="EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR"/>
+                <enum name="EGL_BITMAP_PIXEL_SIZE_KHR"/>
+                <enum name="EGL_BITMAP_POINTER_KHR"/>
+                <enum name="EGL_LOWER_LEFT_KHR"/>
+                <enum name="EGL_UPPER_LEFT_KHR"/>
+                <command name="eglLockSurfaceKHR"/>
+                <command name="eglUnlockSurfaceKHR"/>
+                <command name="eglQuerySurface64KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_partial_update" supported="egl">
+            <require>
+                <enum name="EGL_BUFFER_AGE_KHR"/>
+                <command name="eglSetDamageRegionKHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_platform_android" supported="egl">
+            <require>
+                <enum name="EGL_PLATFORM_ANDROID_KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_platform_gbm" supported="egl">
+            <require>
+                <enum name="EGL_PLATFORM_GBM_KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_platform_wayland" supported="egl">
+            <require>
+                <enum name="EGL_PLATFORM_WAYLAND_KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_platform_x11" supported="egl">
+            <require>
+                <enum name="EGL_PLATFORM_X11_KHR"/>
+                <enum name="EGL_PLATFORM_X11_SCREEN_KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_reusable_sync" protect="KHRONOS_SUPPORT_INT64" supported="egl">
+            <require>
+                <enum name="EGL_SYNC_STATUS_KHR"/>
+                <enum name="EGL_SIGNALED_KHR"/>
+                <enum name="EGL_UNSIGNALED_KHR"/>
+                <enum name="EGL_TIMEOUT_EXPIRED_KHR"/>
+                <enum name="EGL_CONDITION_SATISFIED_KHR"/>
+                <enum name="EGL_SYNC_TYPE_KHR"/>
+                <enum name="EGL_SYNC_REUSABLE_KHR"/>
+                <enum name="EGL_SYNC_FLUSH_COMMANDS_BIT_KHR"/>
+                <enum name="EGL_FOREVER_KHR"/>
+                <enum name="EGL_NO_SYNC_KHR"/>
+                <command name="eglCreateSyncKHR"/>
+                <command name="eglDestroySyncKHR"/>
+                <command name="eglClientWaitSyncKHR"/>
+                <command name="eglSignalSyncKHR"/>
+                <command name="eglGetSyncAttribKHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_stream" protect="KHRONOS_SUPPORT_INT64" supported="egl">
+            <require>
+                <enum name="EGL_NO_STREAM_KHR"/>
+                <enum name="EGL_CONSUMER_LATENCY_USEC_KHR"/>
+                <enum name="EGL_PRODUCER_FRAME_KHR"/>
+                <enum name="EGL_CONSUMER_FRAME_KHR"/>
+                <enum name="EGL_STREAM_STATE_KHR"/>
+                <enum name="EGL_STREAM_STATE_CREATED_KHR"/>
+                <enum name="EGL_STREAM_STATE_CONNECTING_KHR"/>
+                <enum name="EGL_STREAM_STATE_EMPTY_KHR"/>
+                <enum name="EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR"/>
+                <enum name="EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR"/>
+                <enum name="EGL_STREAM_STATE_DISCONNECTED_KHR"/>
+                <enum name="EGL_BAD_STREAM_KHR"/>
+                <enum name="EGL_BAD_STATE_KHR"/>
+                <command name="eglCreateStreamKHR"/>
+                <command name="eglDestroyStreamKHR"/>
+                <command name="eglStreamAttribKHR"/>
+                <command name="eglQueryStreamKHR"/>
+                <command name="eglQueryStreamu64KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_stream_consumer_gltexture" protect="EGL_KHR_stream" supported="egl">
+            <require>
+                <enum name="EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR"/>
+                <command name="eglStreamConsumerGLTextureExternalKHR"/>
+                <command name="eglStreamConsumerAcquireKHR"/>
+                <command name="eglStreamConsumerReleaseKHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_stream_cross_process_fd" protect="EGL_KHR_stream" supported="egl">
+            <require>
+                <enum name="EGL_NO_FILE_DESCRIPTOR_KHR"/>
+                <command name="eglGetStreamFileDescriptorKHR"/>
+                <command name="eglCreateStreamFromFileDescriptorKHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_stream_fifo" protect="EGL_KHR_stream" supported="egl">
+            <require>
+                <enum name="EGL_STREAM_FIFO_LENGTH_KHR"/>
+                <enum name="EGL_STREAM_TIME_NOW_KHR"/>
+                <enum name="EGL_STREAM_TIME_CONSUMER_KHR"/>
+                <enum name="EGL_STREAM_TIME_PRODUCER_KHR"/>
+                <command name="eglQueryStreamTimeKHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_stream_producer_aldatalocator" protect="EGL_KHR_stream" supported="egl"/>
+        <extension name="EGL_KHR_stream_producer_eglsurface" protect="EGL_KHR_stream" supported="egl">
+            <require>
+                <enum name="EGL_STREAM_BIT_KHR"/>
+                <command name="eglCreateStreamProducerSurfaceKHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_surfaceless_context" supported="egl" comment="Just relaxes an error condition"/>
+        <extension name="EGL_KHR_swap_buffers_with_damage" supported="egl">
+            <require>
+                <command name="eglSwapBuffersWithDamageKHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_vg_parent_image" supported="egl">
+            <require>
+                <enum name="EGL_VG_PARENT_IMAGE_KHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_KHR_wait_sync" supported="egl">
+            <require>
+                <command name="eglWaitSyncKHR"/>
+            </require>
+        </extension>
+        <extension name="EGL_MESA_drm_image" supported="egl">
+            <require>
+                <enum name="EGL_DRM_BUFFER_FORMAT_MESA"/>
+                <enum name="EGL_DRM_BUFFER_USE_MESA"/>
+                <enum name="EGL_DRM_BUFFER_FORMAT_ARGB32_MESA"/>
+                <enum name="EGL_DRM_BUFFER_MESA"/>
+                <enum name="EGL_DRM_BUFFER_STRIDE_MESA"/>
+                <enum name="EGL_DRM_BUFFER_USE_SCANOUT_MESA"/>
+                <enum name="EGL_DRM_BUFFER_USE_SHARE_MESA"/>
+                <command name="eglCreateDRMImageMESA"/>
+                <command name="eglExportDRMImageMESA"/>
+            </require>
+        </extension>
+        <extension name="EGL_MESA_image_dma_buf_export" supported="egl">
+            <require>
+                <type name="EGLuint64KHR"/>
+                <command name="eglExportDMABUFImageQueryMESA"/>
+                <command name="eglExportDMABUFImageMESA"/>
+            </require>
+        </extension>
+        <extension name="EGL_MESA_platform_gbm" supported="egl">
+            <require>
+                <enum name="EGL_PLATFORM_GBM_MESA"/>
+            </require>
+        </extension>
+        <extension name="EGL_NOK_swap_region" supported="egl">
+            <require>
+                <command name="eglSwapBuffersRegionNOK"/>
+            </require>
+        </extension>
+        <extension name="EGL_NOK_swap_region2" supported="egl">
+            <require>
+                <command name="eglSwapBuffersRegion2NOK"/>
+            </require>
+        </extension>
+        <extension name="EGL_NOK_texture_from_pixmap" supported="egl">
+            <require>
+                <enum name="EGL_Y_INVERTED_NOK"/>
+            </require>
+        </extension>
+        <extension name="EGL_NV_3dvision_surface" supported="egl">
+            <require>
+                <enum name="EGL_AUTO_STEREO_NV"/>
+            </require>
+        </extension>
+        <extension name="EGL_NV_coverage_sample" supported="egl">
+            <require>
+                <enum name="EGL_COVERAGE_BUFFERS_NV"/>
+                <enum name="EGL_COVERAGE_SAMPLES_NV"/>
+            </require>
+        </extension>
+        <extension name="EGL_NV_coverage_sample_resolve" supported="egl">
+            <require>
+                <enum name="EGL_COVERAGE_SAMPLE_RESOLVE_NV"/>
+                <enum name="EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV"/>
+                <enum name="EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV"/>
+            </require>
+        </extension>
+        <extension name="EGL_NV_cuda_event" supported="egl">
+            <require>
+                <enum name="EGL_CUDA_EVENT_HANDLE_NV"/>
+                <enum name="EGL_SYNC_CUDA_EVENT_NV"/>
+                <enum name="EGL_SYNC_CUDA_EVENT_COMPLETE_NV"/>
+            </require>
+        </extension>
+        <extension name="EGL_NV_depth_nonlinear" supported="egl">
+            <require>
+                <enum name="EGL_DEPTH_ENCODING_NV"/>
+                <enum name="EGL_DEPTH_ENCODING_NONE_NV"/>
+                <enum name="EGL_DEPTH_ENCODING_NONLINEAR_NV"/>
+            </require>
+        </extension>
+        <extension name="EGL_NV_device_cuda" supported="egl">
+            <require>
+                <enum name="EGL_CUDA_DEVICE_NV"/>
+            </require>
+        </extension>
+        <extension name="EGL_NV_native_query" supported="egl">
+            <require>
+                <command name="eglQueryNativeDisplayNV"/>
+                <command name="eglQueryNativeWindowNV"/>
+                <command name="eglQueryNativePixmapNV"/>
+            </require>
+        </extension>
+        <extension name="EGL_NV_post_convert_rounding" supported="egl">
+            <require>
+            </require>
+        </extension>
+        <extension name="EGL_NV_post_sub_buffer" supported="egl">
+            <require>
+                <enum name="EGL_POST_SUB_BUFFER_SUPPORTED_NV"/>
+                <command name="eglPostSubBufferNV"/>
+            </require>
+        </extension>
+        <extension name="EGL_NV_stream_sync" supported="egl">
+            <require>
+                <enum name="EGL_SYNC_TYPE_KHR"/>
+                <enum name="EGL_SYNC_NEW_FRAME_NV"/>
+                <command name="eglCreateStreamSyncNV"/>
+            </require>
+        </extension>
+        <extension name="EGL_NV_sync" protect="KHRONOS_SUPPORT_INT64" supported="egl">
+            <require>
+                <enum name="EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV"/>
+                <enum name="EGL_SYNC_STATUS_NV"/>
+                <enum name="EGL_SIGNALED_NV"/>
+                <enum name="EGL_UNSIGNALED_NV"/>
+                <enum name="EGL_SYNC_FLUSH_COMMANDS_BIT_NV"/>
+                <enum name="EGL_FOREVER_NV"/>
+                <enum name="EGL_ALREADY_SIGNALED_NV"/>
+                <enum name="EGL_TIMEOUT_EXPIRED_NV"/>
+                <enum name="EGL_CONDITION_SATISFIED_NV"/>
+                <enum name="EGL_SYNC_TYPE_NV"/>
+                <enum name="EGL_SYNC_CONDITION_NV"/>
+                <enum name="EGL_SYNC_FENCE_NV"/>
+                <enum name="EGL_NO_SYNC_NV"/>
+                <command name="eglCreateFenceSyncNV"/>
+                <command name="eglDestroySyncNV"/>
+                <command name="eglFenceNV"/>
+                <command name="eglClientWaitSyncNV"/>
+                <command name="eglSignalSyncNV"/>
+                <command name="eglGetSyncAttribNV"/>
+            </require>
+        </extension>
+        <extension name="EGL_NV_system_time" protect="KHRONOS_SUPPORT_INT64" supported="egl">
+            <require>
+                <command name="eglGetSystemTimeFrequencyNV"/>
+                <command name="eglGetSystemTimeNV"/>
+            </require>
+        </extension>
+        <extension name="EGL_TIZEN_image_native_buffer" supported="egl">
+            <require>
+                <enum name="EGL_NATIVE_BUFFER_TIZEN"/>
+            </require>
+        </extension>
+        <extension name="EGL_TIZEN_image_native_surface" supported="egl">
+            <require>
+                <enum name="EGL_NATIVE_SURFACE_TIZEN"/>
+            </require>
+        </extension>
+    </extensions>
+</registry>
diff --git a/src/egl/generate/eglFunctionList.py b/src/egl/generate/eglFunctionList.py
new file mode 100644
index 0000000..b19b5f7
--- /dev/null
+++ b/src/egl/generate/eglFunctionList.py
@@ -0,0 +1,197 @@
+#!/usr/bin/env python
+
+"""
+Contains a list of EGL functions to generate dispatch functions for.
+
+This is used from gen_egl_dispatch.py.
+
+EGL_FUNCTIONS is a sequence of (name, eglData) pairs, where name is the name
+of the function, and eglData is a dictionary containing data about that
+function.
+
+The values in the eglData dictionary are:
+- method (string):
+    How to select a vendor library. See "Method values" below.
+
+- prefix (string):
+    This string is prepended to the name of the dispatch function. If
+    unspecified, the default is "" (an empty string).
+
+- static (boolean)
+  If True, this function should be declared static.
+
+- "public" (boolean)
+    If True, the function should be exported from the library. Vendor libraries
+    generally should not use this.
+
+- extension (string):
+    If specified, this is the name of a macro to check for before defining a
+    function. Used for checking for extension macros and such.
+
+- retval (string):
+    If specified, this is a C expression with the default value to return if we
+    can't find a function to call. By default, it will try to guess from the
+    return type: EGL_NO_whatever for the various handle types, NULL for
+    pointers, and zero for everything else.
+
+method values:
+- "custom"
+    The dispatch stub will be hand-written instead of generated.
+
+- "none"
+    No dispatch function exists at all, but the function should still have an
+    entry in the index array. This is for other functions that a stub may need
+    to call that are implemented in libEGL itself.
+
+- "display"
+    Select a vendor from an EGLDisplay argument.
+
+- "device"
+    Select a vendor from an EGLDeviceEXT argument.
+
+- "current"
+    Select the vendor that owns the current context.
+"""
+
+def _eglFunc(name, method, static=False, public=False, inheader=None, prefix="", extension=None, retval=None):
+    """
+    A convenience function to define an entry in the EGL function list.
+    """
+    if inheader is None:
+        inheader = (not public)
+    values = {
+        "method" : method,
+        "prefix" : prefix,
+        "extension" : extension,
+        "retval" : retval,
+        "static" : static,
+        "public" : public,
+        "inheader" : inheader,
+    }
+    return (name, values)
+
+EGL_FUNCTIONS = (
+    # EGL_VERSION_1_0
+    _eglFunc("eglChooseConfig",                      "none"),
+    _eglFunc("eglCopyBuffers",                       "none"),
+    _eglFunc("eglCreateContext",                     "none"),
+    _eglFunc("eglCreatePbufferSurface",              "none"),
+    _eglFunc("eglCreatePixmapSurface",               "none"),
+    _eglFunc("eglCreateWindowSurface",               "none"),
+    _eglFunc("eglDestroyContext",                    "none"),
+    _eglFunc("eglDestroySurface",                    "none"),
+    _eglFunc("eglGetConfigAttrib",                   "none"),
+    _eglFunc("eglGetConfigs",                        "none"),
+    _eglFunc("eglQueryContext",                      "none"),
+    _eglFunc("eglQuerySurface",                      "none"),
+    _eglFunc("eglSwapBuffers",                       "none"),
+    _eglFunc("eglWaitGL",                            "none"),
+    _eglFunc("eglWaitNative",                        "none"),
+    _eglFunc("eglTerminate",                         "none"),
+    _eglFunc("eglInitialize",                        "none"),
+
+    _eglFunc("eglGetCurrentDisplay",                 "none"),
+    _eglFunc("eglGetCurrentSurface",                 "none"),
+    _eglFunc("eglGetDisplay",                        "none"),
+    _eglFunc("eglGetError",                          "none"),
+    _eglFunc("eglGetProcAddress",                    "none"),
+    _eglFunc("eglMakeCurrent",                       "none"),
+    _eglFunc("eglQueryString",                       "none"),
+
+    # EGL_VERSION_1_1
+    _eglFunc("eglBindTexImage",                      "none"),
+    _eglFunc("eglReleaseTexImage",                   "none"),
+    _eglFunc("eglSurfaceAttrib",                     "none"),
+    _eglFunc("eglSwapInterval",                      "none"),
+
+    # EGL_VERSION_1_2
+    _eglFunc("eglCreatePbufferFromClientBuffer",     "none"),
+    _eglFunc("eglWaitClient",                        "none"),
+    _eglFunc("eglBindAPI",                           "none"),
+    _eglFunc("eglQueryAPI",                          "none"),
+    _eglFunc("eglReleaseThread",                     "none"),
+
+    # EGL_VERSION_1_4
+    _eglFunc("eglGetCurrentContext",                 "none"),
+
+    # EGL_VERSION_1_5
+    _eglFunc("eglCreateSync",                        "none"),
+    _eglFunc("eglDestroySync",                       "none"),
+    _eglFunc("eglClientWaitSync",                    "none"),
+    _eglFunc("eglGetSyncAttrib",                     "none"),
+    _eglFunc("eglCreateImage",                       "none"),
+    _eglFunc("eglDestroyImage",                      "none"),
+    _eglFunc("eglCreatePlatformWindowSurface",       "none"),
+    _eglFunc("eglCreatePlatformPixmapSurface",       "none"),
+    _eglFunc("eglWaitSync",                          "none"),
+    _eglFunc("eglGetPlatformDisplay",                "none"),
+
+    # EGL_EXT_platform_base
+    _eglFunc("eglCreatePlatformWindowSurfaceEXT",    "display"),
+    _eglFunc("eglCreatePlatformPixmapSurfaceEXT",    "display"),
+    _eglFunc("eglGetPlatformDisplayEXT",             "none"),
+
+    # TODO: Most of these extensions should be provided by the vendor
+    # libraries, not by libEGL. They're here now to make testing everything
+    # else easier.
+
+    # EGL_EXT_swap_buffers_with_damage
+    _eglFunc("eglSwapBuffersWithDamageEXT",          "display"),
+
+    # KHR_EXT_swap_buffers_with_damage
+    _eglFunc("eglSwapBuffersWithDamageKHR",          "display"),
+
+    # EGL_KHR_cl_event2
+    _eglFunc("eglCreateSync64KHR",                   "display"),
+
+    # EGL_KHR_fence_sync
+    _eglFunc("eglCreateSyncKHR",                     "display"),
+    _eglFunc("eglDestroySyncKHR",                    "display"),
+    _eglFunc("eglClientWaitSyncKHR",                 "display"),
+    _eglFunc("eglGetSyncAttribKHR",                  "display"),
+
+    # EGL_KHR_image
+    _eglFunc("eglCreateImageKHR",                    "display"),
+    _eglFunc("eglDestroyImageKHR",                   "display"),
+
+    # EGL_KHR_image_base
+    # eglCreateImageKHR already defined in EGL_KHR_image
+    # eglDestroyImageKHR already defined in EGL_KHR_image
+
+    # EGL_KHR_reusable_sync
+    _eglFunc("eglSignalSyncKHR",                     "display"),
+    # eglCreateSyncKHR already defined in EGL_KHR_fence_sync
+    # eglDestroySyncKHR already defined in EGL_KHR_fence_sync
+    # eglClientWaitSyncKHR already defined in EGL_KHR_fence_sync
+    # eglGetSyncAttribKHR already defined in EGL_KHR_fence_sync
+
+    # EGL_KHR_wait_sync
+    _eglFunc("eglWaitSyncKHR",                       "display"),
+
+    # EGL_MESA_drm_image
+    _eglFunc("eglCreateDRMImageMESA",                "display"),
+    _eglFunc("eglExportDRMImageMESA",                "display"),
+
+    # EGL_MESA_image_dma_buf_export
+    _eglFunc("eglExportDMABUFImageQueryMESA",        "display"),
+    _eglFunc("eglExportDMABUFImageMESA",             "display"),
+
+    # EGL_NOK_swap_region
+    _eglFunc("eglSwapBuffersRegionNOK",              "display"),
+
+    # EGL_NV_post_sub_buffer
+    _eglFunc("eglPostSubBufferNV",                   "display"),
+
+    # EGL_WL_bind_wayland_display
+    _eglFunc("eglCreateWaylandBufferFromImageWL",    "display"),
+    _eglFunc("eglUnbindWaylandDisplayWL",            "display"),
+    _eglFunc("eglQueryWaylandBufferWL",              "display"),
+    _eglFunc("eglBindWaylandDisplayWL",              "display"),
+
+    # EGL_CHROMIUM_get_sync_values
+    _eglFunc("eglGetSyncValuesCHROMIUM",             "display"),
+
+    # EGL_ANDROID_native_fence_sync
+    _eglFunc("eglDupNativeFenceFDANDROID",           "display"),
+)
+
diff --git a/src/egl/generate/egl_other.xml b/src/egl/generate/egl_other.xml
new file mode 100644
index 0000000..7fe3a9e
--- /dev/null
+++ b/src/egl/generate/egl_other.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<registry>
+    <comment>
+        This file contains any EGL extension functions that are missing from
+        the normal egl.xml list.
+    </comment>
+    <commands namespace="EGL">
+        <!-- EGL_WL_bind_wayland_display -->
+        <command>
+            <proto>struct wl_buffer * <name>eglCreateWaylandBufferFromImageWL</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>EGLImage</ptype> <name>image</name></param>
+        </command>
+
+        <command>
+            <proto>EGLBoolean <name>eglUnbindWaylandDisplayWL</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>struct wl_display *</ptype> <name>display</name></param>
+        </command>
+
+        <command>
+            <proto>EGLBoolean <name>eglQueryWaylandBufferWL</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>struct wl_resource *</ptype> <name>buffer</name></param>
+            <param><ptype>EGLint</ptype> <name>attribute</name></param>
+            <param><ptype>EGLint *</ptype> <name>value</name></param>
+        </command>
+
+        <command>
+            <proto>EGLBoolean <name>eglBindWaylandDisplayWL</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>dpy</name></param>
+            <param><ptype>struct wl_display *</ptype> <name>display</name></param>
+        </command>
+
+        <!-- EGL_CHROMIUM_get_sync_values -->
+        <command>
+            <proto>EGLBoolean <name>eglGetSyncValuesCHROMIUM</name></proto>
+            <param><ptype>EGLDisplay</ptype> <name>display</name></param>
+            <param><ptype>EGLSurface</ptype> <name>surface</name></param>
+            <param><ptype>EGLuint64KHR *</ptype> <name>ust</name></param>
+            <param><ptype>EGLuint64KHR *</ptype> <name>msc</name></param>
+            <param><ptype>EGLuint64KHR *</ptype> <name>sbc</name></param>
+        </command>
+    </commands>
+</registry>
+
+
diff --git a/src/egl/generate/genCommon.py b/src/egl/generate/genCommon.py
new file mode 100644
index 0000000..d493d7b
--- /dev/null
+++ b/src/egl/generate/genCommon.py
@@ -0,0 +1,223 @@
+#!/usr/bin/env python
+
+# (C) Copyright 2015, NVIDIA CORPORATION.
+# All Rights Reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# on the rights to use, copy, modify, merge, publish, distribute, sub
+# license, and/or sell copies of the Software, and to permit persons to whom
+# the Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice (including the next
+# paragraph) shall be included in all copies or substantial portions of the
+# Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+#
+# Authors:
+#    Kyle Brenneman <kbrenneman at nvidia.com>
+
+import collections
+import re
+import sys
+import xml.etree.cElementTree as etree
+
+MAPI_TABLE_NUM_DYNAMIC = 4096
+
+_LIBRARY_FEATURE_NAMES = {
+    # libGL and libGLdiapatch both include every function.
+    "gl" : None,
+    "gldispatch" : None,
+    "opengl" : frozenset(( "GL_VERSION_1_0", "GL_VERSION_1_1",
+        "GL_VERSION_1_2", "GL_VERSION_1_3", "GL_VERSION_1_4", "GL_VERSION_1_5",
+        "GL_VERSION_2_0", "GL_VERSION_2_1", "GL_VERSION_3_0", "GL_VERSION_3_1",
+        "GL_VERSION_3_2", "GL_VERSION_3_3", "GL_VERSION_4_0", "GL_VERSION_4_1",
+        "GL_VERSION_4_2", "GL_VERSION_4_3", "GL_VERSION_4_4", "GL_VERSION_4_5",
+    )),
+    "glesv1" : frozenset(("GL_VERSION_ES_CM_1_0", "GL_OES_point_size_array")),
+    "glesv2" : frozenset(("GL_ES_VERSION_2_0", "GL_ES_VERSION_3_0",
+            "GL_ES_VERSION_3_1" "GL_ES_VERSION_3_2",
+    )),
+}
+
+def getFunctions(xmlFiles):
+    """
+    Reads an XML file and returns all of the functions defined in it.
+
+    xmlFile should be the path to Khronos's gl.xml file. The return value is a
+    sequence of FunctionDesc objects, ordered by slot number.
+    """
+    roots = [ etree.parse(xmlFile).getroot() for xmlFile in xmlFiles ]
+    return getFunctionsFromRoots(roots)
+
+def getFunctionsFromRoots(roots):
+    functions = {}
+    for root in roots:
+        for func in _getFunctionList(root):
+            functions[func.name] = func
+    functions = functions.values()
+
+    # Sort the function list by name.
+    functions = sorted(functions, key=lambda f: f.name)
+
+    # Assign a slot number to each function. This isn't strictly necessary,
+    # since you can just look at the index in the list, but it makes it easier
+    # to include the slot when formatting output.
+    for i in range(len(functions)):
+        functions[i] = functions[i]._replace(slot=i)
+
+    return functions
+
+def getExportNamesFromRoots(target, roots):
+    """
+    Goes through the <feature> tags from gl.xml and returns a set of OpenGL
+    functions that a library should export.
+
+    target should be one of "gl", "gldispatch", "opengl", "glesv1", or
+    "glesv2".
+    """
+    featureNames = _LIBRARY_FEATURE_NAMES[target]
+    if featureNames is None:
+        return set(func.name for func in getFunctionsFromRoots(roots))
+
+    names = set()
+    for root in roots:
+        features = []
+        for featElem in root.findall("feature"):
+            if featElem.get("name") in featureNames:
+                features.append(featElem)
+        for featElem in root.findall("extensions/extension"):
+            if featElem.get("name") in featureNames:
+                features.append(featElem)
+        for featElem in features:
+            for commandElem in featElem.findall("require/command"):
+                names.add(commandElem.get("name"))
+    return names
+
+class FunctionArg(collections.namedtuple("FunctionArg", "type name")):
+    @property
+    def dec(self):
+        """
+        Returns a "TYPE NAME" string, suitable for a function prototype.
+        """
+        rv = str(self.type)
+        if not rv.endswith("*"):
+            rv += " "
+        rv += self.name
+        return rv
+
+class FunctionDesc(collections.namedtuple("FunctionDesc", "name rt args slot")):
+    def hasReturn(self):
+        """
+        Returns true if the function returns a value.
+        """
+        return (self.rt != "void")
+
+    @property
+    def decArgs(self):
+        """
+        Returns a string with the types and names of the arguments, as you
+        would use in a function declaration.
+        """
+        if not self.args:
+            return "void"
+        else:
+            return ", ".join(arg.dec for arg in self.args)
+
+    @property
+    def callArgs(self):
+        """
+        Returns a string with the names of the arguments, as you would use in a
+        function call.
+        """
+        return ", ".join(arg.name for arg in self.args)
+
+    @property
+    def basename(self):
+        assert self.name.startswith("gl")
+        return self.name[2:]
+
+def _getFunctionList(root):
+    for elem in root.findall("commands/command"):
+        yield _parseCommandElem(elem)
+
+def _parseCommandElem(elem):
+    protoElem = elem.find("proto")
+    (rt, name) = _parseProtoElem(protoElem)
+
+    args = []
+    for ch in elem.findall("param"):
+        # <param> tags have the same format as a <proto> tag.
+        args.append(FunctionArg(*_parseProtoElem(ch)))
+    func = FunctionDesc(name, rt, tuple(args), slot=None)
+
+    return func
+
+def _parseProtoElem(elem):
+    # If I just remove the tags and string the text together, I'll get valid C code.
+    text = _flattenText(elem)
+    text = text.strip()
+    m = re.match(r"^(.+)\b(\w+)(?:\s*\[\s*(\d*)\s*\])?$", text, re.S)
+    if m:
+        typename = _fixupTypeName(m.group(1))
+        name = m.group(2)
+        if m.group(3):
+            # HACK: glPathGlyphIndexRangeNV defines an argument like this:
+            # GLuint baseAndCount[2]
+            # Convert it to a pointer and hope for the best.
+            typename += "*"
+        return (typename, name)
+    else:
+        raise ValueError("Can't parse element %r -> %r" % (elem, text))
+
+def _flattenText(elem):
+    """
+    Returns the text in an element and all child elements, with the tags
+    removed.
+    """
+    text = ""
+    if elem.text is not None:
+        text = elem.text
+    for ch in elem:
+        text += _flattenText(ch)
+        if ch.tail is not None:
+            text += ch.tail
+    return text
+
+def _fixupTypeName(typeName):
+    """
+    Converts a typename into a more consistent format.
+    """
+
+    rv = typeName.strip()
+
+    # Replace "GLvoid" with just plain "void".
+    rv = re.sub(r"\bGLvoid\b", "void", rv)
+
+    # Remove the vendor suffixes from types that have a suffix-less version.
+    rv = re.sub(r"\b(GLhalf|GLintptr|GLsizeiptr|GLint64|GLuint64)(?:ARB|EXT|NV|ATI)\b", r"\1", rv)
+
+    rv = re.sub(r"\bGLvoid\b", "void", rv)
+
+    # Clear out any leading and trailing whitespace.
+    rv = rv.strip()
+
+    # Remove any whitespace before a '*'
+    rv = re.sub(r"\s+\*", r"*", rv)
+
+    # Change "foo*" to "foo *"
+    rv = re.sub(r"([^\*])\*", r"\1 *", rv)
+
+    # Condense all whitespace into a single space.
+    rv = re.sub(r"\s+", " ", rv)
+
+    return rv
+
diff --git a/src/egl/generate/gen_egl_dispatch.py b/src/egl/generate/gen_egl_dispatch.py
new file mode 100755
index 0000000..eeb3f3f
--- /dev/null
+++ b/src/egl/generate/gen_egl_dispatch.py
@@ -0,0 +1,250 @@
+#!/usr/bin/env python
+
+# (C) Copyright 2016, NVIDIA CORPORATION.
+# All Rights Reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# on the rights to use, copy, modify, merge, publish, distribute, sub
+# license, and/or sell copies of the Software, and to permit persons to whom
+# the Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice (including the next
+# paragraph) shall be included in all copies or substantial portions of the
+# Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+# IBM AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+# IN THE SOFTWARE.
+#
+# Authors:
+#    Kyle Brenneman <kbrenneman at nvidia.com>
+
+"""
+Generates dispatch functions for EGL.
+
+The list of functions and arguments is read from the Khronos's XML files, with
+additional information defined in the module eglFunctionList.
+"""
+
+import argparse
+import collections
+import imp
+import sys
+import textwrap
+
+import genCommon
+
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument("target", choices=("header", "source"),
+            help="Whether to build the source or header file.")
+    parser.add_argument("func_list_file", help="The function list .py file.")
+    parser.add_argument("xml_files", nargs="+", help="The XML files with the EGL function lists.")
+
+    args = parser.parse_args()
+
+    # The function list is a Python module, but it's specified on the command
+    # line.
+    eglFunctionList = imp.load_source("eglFunctionList", args.func_list_file)
+
+    xmlFunctions = genCommon.getFunctions(args.xml_files)
+    xmlByName = dict((f.name, f) for f in xmlFunctions)
+    functions = []
+    for (name, eglFunc) in eglFunctionList.EGL_FUNCTIONS:
+        func = xmlByName[name]
+        eglFunc = fixupEglFunc(func, eglFunc)
+        functions.append((func, eglFunc))
+
+    # Sort the function list by name.
+    functions = sorted(functions, key=lambda f: f[0].name)
+
+    if args.target == "header":
+        text = generateHeader(functions)
+    elif args.target == "source":
+        text = generateSource(functions)
+    sys.stdout.write(text)
+
+def fixupEglFunc(func, eglFunc):
+    result = dict(eglFunc)
+    if result.get("prefix") is None:
+        result["prefix"] = ""
+
+    if result.get("extension") is not None:
+        text = "defined(" + result["extension"] + ")"
+        result["extension"] = text
+
+    if result["method"] in ("none", "custom"):
+        return result
+
+    if result["method"] not in ("display", "device", "current"):
+        raise ValueError("Invalid dispatch method %r for function %r" % (result["method"], func.name))
+
+    if func.hasReturn():
+        if result.get("retval") is None:
+            result["retval"] = getDefaultReturnValue(func.rt)
+
+    return result
+
+def generateHeader(functions):
+    text = textwrap.dedent(r"""
+    #ifndef G_EGLDISPATCH_STUBS_H
+    #define G_EGLDISPATCH_STUBS_H
+
+    #ifdef __cplusplus
+    extern "C" {
+    #endif
+
+    #include <EGL/egl.h>
+    #include <EGL/eglext.h>
+    #include "glvnd/libeglabi.h"
+
+    """.lstrip("\n"))
+
+    text += "enum {\n"
+    for (func, eglFunc) in functions:
+        text += generateGuardBegin(func, eglFunc)
+        text += "    __EGL_DISPATCH_" + func.name + ",\n"
+        text += generateGuardEnd(func, eglFunc)
+    text += "    __EGL_DISPATCH_COUNT\n"
+    text += "};\n"
+
+    for (func, eglFunc) in functions:
+        if eglFunc["inheader"]:
+            text += generateGuardBegin(func, eglFunc)
+            text += "{f.rt} EGLAPIENTRY {ex[prefix]}{f.name}({f.decArgs});\n".format(f=func, ex=eglFunc)
+            text += generateGuardEnd(func, eglFunc)
+
+    text += textwrap.dedent(r"""
+    #ifdef __cplusplus
+    }
+    #endif
+    #endif // G_EGLDISPATCH_STUBS_H
+    """)
+    return text
+
+def generateSource(functions):
+    # First, sort the function list by name.
+    text = ""
+    text += '#include "egldispatchstubs.h"\n'
+    text += '#include "g_egldispatchstubs.h"\n'
+    text += "\n"
+
+    for (func, eglFunc) in functions:
+        if eglFunc["method"] not in ("custom", "none"):
+            text += generateGuardBegin(func, eglFunc)
+            text += generateDispatchFunc(func, eglFunc)
+            text += generateGuardEnd(func, eglFunc)
+
+    text += "\n"
+    text += "const char * const __EGL_DISPATCH_FUNC_NAMES[__EGL_DISPATCH_COUNT + 1] = {\n"
+    for (func, eglFunc) in functions:
+        text += generateGuardBegin(func, eglFunc)
+        text += '    "' + func.name + '",\n'
+        text += generateGuardEnd(func, eglFunc)
+    text += "    NULL\n"
+    text += "};\n"
+
+    text += "const __eglMustCastToProperFunctionPointerType __EGL_DISPATCH_FUNCS[__EGL_DISPATCH_COUNT + 1] = {\n"
+    for (func, eglFunc) in functions:
+        text += generateGuardBegin(func, eglFunc)
+        if eglFunc["method"] != "none":
+            text += "    (__eglMustCastToProperFunctionPointerType) " + eglFunc.get("prefix", "") + func.name + ",\n"
+        else:
+            text += "    NULL, // " + func.name + "\n"
+        text += generateGuardEnd(func, eglFunc)
+    text += "    NULL\n"
+    text += "};\n"
+
+    return text
+
+def generateGuardBegin(func, eglFunc):
+    ext = eglFunc.get("extension")
+    if ext is not None:
+        return "#if " + ext + "\n"
+    else:
+        return ""
+
+def generateGuardEnd(func, eglFunc):
+    if eglFunc.get("extension") is not None:
+        return "#endif\n"
+    else:
+        return ""
+
+def generateDispatchFunc(func, eglFunc):
+    text = ""
+
+    if eglFunc.get("static"):
+        text += "static "
+    elif eglFunc.get("public"):
+        text += "PUBLIC "
+    text += textwrap.dedent(
+    r"""
+    {f.rt} EGLAPIENTRY {ef[prefix]}{f.name}({f.decArgs})
+    {{
+        typedef {f.rt} EGLAPIENTRY (* _pfn_{f.name})({f.decArgs});
+    """).lstrip("\n").format(f=func, ef=eglFunc)
+
+    if func.hasReturn():
+        text += "    {f.rt} _ret = {ef[retval]};\n".format(f=func, ef=eglFunc)
+
+    text += "    _pfn_{f.name} _ptr_{f.name} = (_pfn_{f.name}) ".format(f=func)
+    if eglFunc["method"] == "current":
+        text += "__eglDispatchFetchByCurrent(__EGL_DISPATCH_{f.name});\n".format(f=func)
+
+    elif eglFunc["method"] in ("display", "device"):
+        if eglFunc["method"] == "display":
+            lookupFunc = "__eglDispatchFetchByDisplay"
+            lookupType = "EGLDisplay"
+        else:
+            assert eglFunc["method"] == "device"
+            lookupFunc = "__eglDispatchFetchByDevice"
+            lookupType = "EGLDeviceEXT"
+
+        lookupArg = None
+        for arg in func.args:
+            if arg.type == lookupType:
+                lookupArg = arg.name
+                break
+        if lookupArg is None:
+            raise ValueError("Can't find %s argument for function %s" % (lookupType, func.name,))
+
+        text += "{lookupFunc}({lookupArg}, __EGL_DISPATCH_{f.name});\n".format(
+                f=func, lookupFunc=lookupFunc, lookupArg=lookupArg)
+    else:
+        raise ValueError("Unknown dispatch method: %r" % (eglFunc["method"],))
+
+    text += "    if(_ptr_{f.name} != NULL) {{\n".format(f=func)
+    text += "        "
+    if func.hasReturn():
+        text += "_ret = "
+    text += "_ptr_{f.name}({f.callArgs});\n".format(f=func)
+    text += "    }\n"
+
+    if func.hasReturn():
+        text += "    return _ret;\n"
+    text += "}\n"
+    return text
+
+def getDefaultReturnValue(typename):
+    if typename.endswith("*"):
+        return "NULL"
+    elif typename == "EGLDisplay":
+        return "EGL_NO_DISPLAY"
+    elif typename == "EGLContext":
+        return "EGL_NO_CONTEXT"
+    elif typename == "EGLSurface":
+        return "EGL_NO_SURFACE"
+    elif typename == "EGLBoolean":
+        return "EGL_FALSE";
+
+    return "0"
+
+if __name__ == "__main__":
+    main()
+
diff --git a/src/egl/main/50_mesa.json b/src/egl/main/50_mesa.json
new file mode 100644
index 0000000..8aaaa10
--- /dev/null
+++ b/src/egl/main/50_mesa.json
@@ -0,0 +1,6 @@
+{
+    "file_format_version" : "1.0.0",
+    "ICD" : {
+        "library_path" : "libEGL_mesa.so.0"
+    }
+}
diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
index a349992..fd9b3b3 100644
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c
@@ -651,7 +651,11 @@ eglQueryString(EGLDisplay dpy, EGLint name)
    _EGLDriver *drv;
 
    if (dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS) {
-      RETURN_EGL_SUCCESS(NULL, _eglGlobal.ClientExtensionString);
+      const char *ret = _eglGetClientExtensionString();
+      if (ret != NULL)
+         RETURN_EGL_SUCCESS(NULL, ret);
+      else
+         RETURN_EGL_ERROR(NULL, EGL_BAD_ALLOC, NULL);
    }
 
    disp = _eglLockDisplay(dpy);
diff --git a/src/egl/main/egldispatchstubs.c b/src/egl/main/egldispatchstubs.c
new file mode 100644
index 0000000..e02abd7
--- /dev/null
+++ b/src/egl/main/egldispatchstubs.c
@@ -0,0 +1,110 @@
+#include "egldispatchstubs.h"
+#include "g_egldispatchstubs.h"
+
+#include <string.h>
+
+#include "eglcurrent.h"
+
+static const __EGLapiExports *exports;
+
+const int __EGL_DISPATCH_FUNC_COUNT = __EGL_DISPATCH_COUNT;
+int __EGL_DISPATCH_FUNC_INDICES[__EGL_DISPATCH_COUNT + 1];
+
+static int FindProcIndex(const char *name)
+{
+    unsigned first = 0;
+    unsigned last = __EGL_DISPATCH_COUNT - 1;
+
+    while (first <= last) {
+        unsigned middle = (first + last) / 2;
+        int comp = strcmp(name,
+                          __EGL_DISPATCH_FUNC_NAMES[middle]);
+
+        if (comp > 0)
+            first = middle + 1;
+        else if (comp < 0)
+            last = middle - 1;
+        else
+            return middle;
+    }
+
+    /* Just point to the dummy entry at the end of the respective table */
+    return __EGL_DISPATCH_COUNT;
+}
+
+void __eglInitDispatchStubs(const __EGLapiExports *exportsTable)
+{
+    int i;
+    exports = exportsTable;
+    for (i=0; i<__EGL_DISPATCH_FUNC_COUNT; i++) {
+        __EGL_DISPATCH_FUNC_INDICES[i] = -1;
+    }
+}
+
+void __eglSetDispatchIndex(const char *name, int dispatchIndex)
+{
+    int index = FindProcIndex(name);
+    __EGL_DISPATCH_FUNC_INDICES[index] = dispatchIndex;
+}
+
+void *__eglDispatchFindDispatchFunction(const char *name)
+{
+    int index = FindProcIndex(name);
+    return (void *) __EGL_DISPATCH_FUNCS[index];
+}
+
+static __eglMustCastToProperFunctionPointerType FetchVendorFunc(__EGLvendorInfo *vendor,
+        int index, EGLint errorCode)
+{
+    __eglMustCastToProperFunctionPointerType func = NULL;
+
+    if (vendor != NULL) {
+        func = exports->fetchDispatchEntry(vendor, __EGL_DISPATCH_FUNC_INDICES[index]);
+    }
+    if (func == NULL) {
+        if (errorCode != EGL_SUCCESS) {
+            _eglError(errorCode, __EGL_DISPATCH_FUNC_NAMES[index]);
+        }
+        return NULL;
+    }
+
+    if (!exports->setLastVendor(vendor)) {
+        // Don't bother trying to set an error code in libglvnd. If
+        // setLastVendor failed, then setEGLError would also fail.
+        _eglError(errorCode, __EGL_DISPATCH_FUNC_NAMES[index]);
+        return NULL;
+    }
+
+    return func;
+}
+
+__eglMustCastToProperFunctionPointerType __eglDispatchFetchByCurrent(int index)
+{
+    __EGLvendorInfo *vendor;
+
+    // Note: This is only used for the eglWait* functions. For those, if
+    // there's no current context, then they're supposed to do nothing but
+    // return success.
+    exports->threadInit();
+    vendor = exports->getCurrentVendor();
+    return FetchVendorFunc(vendor, index, EGL_SUCCESS);
+}
+
+__eglMustCastToProperFunctionPointerType __eglDispatchFetchByDisplay(EGLDisplay dpy, int index)
+{
+    __EGLvendorInfo *vendor;
+
+    exports->threadInit();
+    vendor = exports->getVendorFromDisplay(dpy);
+    return FetchVendorFunc(vendor, index, EGL_BAD_DISPLAY);
+}
+
+__eglMustCastToProperFunctionPointerType __eglDispatchFetchByDevice(EGLDeviceEXT dev, int index)
+{
+    __EGLvendorInfo *vendor;
+
+    exports->threadInit();
+    vendor = exports->getVendorFromDevice(dev);
+    return FetchVendorFunc(vendor, index, EGL_BAD_DEVICE_EXT);
+}
+
diff --git a/src/egl/main/egldispatchstubs.h b/src/egl/main/egldispatchstubs.h
new file mode 100644
index 0000000..7861ea5
--- /dev/null
+++ b/src/egl/main/egldispatchstubs.h
@@ -0,0 +1,26 @@
+#ifndef EGLDISPATCHSTUBS_H
+#define EGLDISPATCHSTUBS_H
+
+#include "glvnd/libeglabi.h"
+
+// These variables are all generated along with the dispatch stubs.
+extern const int __EGL_DISPATCH_FUNC_COUNT;
+extern const char * const __EGL_DISPATCH_FUNC_NAMES[];
+extern int __EGL_DISPATCH_FUNC_INDICES[];
+extern const __eglMustCastToProperFunctionPointerType __EGL_DISPATCH_FUNCS[];
+
+void __eglInitDispatchStubs(const __EGLapiExports *exportsTable);
+void __eglSetDispatchIndex(const char *name, int index);
+
+/**
+ * Returns the dispatch function for the given name, or \c NULL if the function
+ * isn't supported.
+ */
+void *__eglDispatchFindDispatchFunction(const char *name);
+
+// Helper functions used by the generated stubs.
+__eglMustCastToProperFunctionPointerType __eglDispatchFetchByDisplay(EGLDisplay dpy, int index);
+__eglMustCastToProperFunctionPointerType __eglDispatchFetchByDevice(EGLDeviceEXT dpy, int index);
+__eglMustCastToProperFunctionPointerType __eglDispatchFetchByCurrent(int index);
+
+#endif // EGLDISPATCHSTUBS_H
diff --git a/src/egl/main/eglglobals.c b/src/egl/main/eglglobals.c
index cb41063..baf96bb 100644
--- a/src/egl/main/eglglobals.c
+++ b/src/egl/main/eglglobals.c
@@ -29,6 +29,8 @@
 
 
 #include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
 #include <assert.h>
 #include "c11/threads.h"
 
@@ -50,9 +52,13 @@ struct _egl_global _eglGlobal =
       _eglFiniDisplay
    },
 
-   /* ClientExtensionString */
+   /* ClientOnlyExtensionString */
    "EGL_EXT_client_extensions"
    " EGL_EXT_platform_base"
+   " EGL_KHR_client_get_all_proc_addresses"
+   " EGL_KHR_debug",
+
+   /* PlatformExtensionString */
 #ifdef HAVE_WAYLAND_PLATFORM
    " EGL_EXT_platform_wayland"
 #endif
@@ -65,8 +71,9 @@ struct _egl_global _eglGlobal =
 #ifdef HAVE_SURFACELESS_PLATFORM
    " EGL_MESA_platform_surfaceless"
 #endif
-   " EGL_KHR_client_get_all_proc_addresses"
-   " EGL_KHR_debug",
+   "",
+
+   NULL, /* ClientExtensionsString */
 
    NULL, /* debugCallback */
    _EGL_DEBUG_BIT_CRITICAL | _EGL_DEBUG_BIT_ERROR, /* debugTypesEnabled */
@@ -101,3 +108,37 @@ _eglAddAtExitCall(void (*func)(void))
       mtx_unlock(_eglGlobal.Mutex);
    }
 }
+
+const char *
+_eglGetClientExtensionString(void)
+{
+   const char *ret;
+
+   mtx_lock(_eglGlobal.Mutex);
+
+   if (_eglGlobal.ClientExtensionString == NULL) {
+      size_t clientLen = strlen(_eglGlobal.ClientOnlyExtensionString);
+      size_t platformLen = strlen(_eglGlobal.PlatformExtensionString);
+
+      _eglGlobal.ClientExtensionString = (char *) malloc(clientLen + platformLen + 1);
+      if (_eglGlobal.ClientExtensionString != NULL) {
+         char *ptr = _eglGlobal.ClientExtensionString;
+
+         memcpy(ptr, _eglGlobal.ClientOnlyExtensionString, clientLen);
+         ptr += clientLen;
+
+         if (platformLen > 0) {
+            // Note that if PlatformExtensionString is not empty, then it will
+            // already have a leading space.
+            assert(_eglGlobal.PlatformExtensionString[0] == ' ');
+            memcpy(ptr, _eglGlobal.PlatformExtensionString, platformLen);
+            ptr += platformLen;
+         }
+         *ptr = '\0';
+      }
+   }
+   ret = _eglGlobal.ClientExtensionString;
+
+   mtx_unlock(_eglGlobal.Mutex);
+   return ret;
+}
diff --git a/src/egl/main/eglglobals.h b/src/egl/main/eglglobals.h
index ec4f3d0..c6ef59d 100644
--- a/src/egl/main/eglglobals.h
+++ b/src/egl/main/eglglobals.h
@@ -57,7 +57,15 @@ struct _egl_global
    EGLint NumAtExitCalls;
    void (*AtExitCalls[10])(void);
 
-   const char *ClientExtensionString;
+   /*
+    * Under libglvnd, the client extension string has to be split into two
+    * strings, one for platform extensions, and one for everything else. So,
+    * define separate strings for them. _eglGetClientExtensionString will
+    * concatenate them together for a non-libglvnd build.
+    */
+   const char *ClientOnlyExtensionString;
+   const char *PlatformExtensionString;
+   char *ClientExtensionString;
 
    EGLDEBUGPROCKHR debugCallback;
    unsigned int debugTypesEnabled;
@@ -76,4 +84,7 @@ static inline unsigned int DebugBitFromType(EGLenum type)
    return (1 << (type - EGL_DEBUG_MSG_CRITICAL_KHR));
 }
 
+extern const char *
+_eglGetClientExtensionString(void);
+
 #endif /* EGLGLOBALS_INCLUDED */
diff --git a/src/egl/main/eglglvnd.c b/src/egl/main/eglglvnd.c
new file mode 100644
index 0000000..6b984ed
--- /dev/null
+++ b/src/egl/main/eglglvnd.c
@@ -0,0 +1,82 @@
+#include <string.h>
+#include <assert.h>
+
+#include <glvnd/libeglabi.h>
+
+#include "eglcurrent.h"
+#include "egldispatchstubs.h"
+#include "eglglobals.h"
+
+static const __EGLapiExports *__eglGLVNDApiExports = NULL;
+
+static const char * EGLAPIENTRY
+__eglGLVNDQueryString(EGLDisplay dpy, EGLenum name)
+{
+   // For client extensions, return the list of non-platform extensions. The
+   // platform extensions are returned by __eglGLVNDGetVendorString.
+   if (dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS)
+      return _eglGlobal.ClientOnlyExtensionString;
+
+   // For everything else, forward to the normal eglQueryString function.
+   return eglQueryString(dpy, name);
+}
+
+static const char *
+__eglGLVNDGetVendorString(int name)
+{
+   if (name == __EGL_VENDOR_STRING_PLATFORM_EXTENSIONS) {
+      const char *str = _eglGlobal.PlatformExtensionString;
+      // The platform extension string may have a leading space. If it does,
+      // then skip over it.
+      while (*str == ' ') {
+         str++;
+      }
+      return str;
+   }
+
+   return NULL;
+}
+
+static EGLDisplay
+__eglGLVNDGetPlatformDisplay(EGLenum platform, void *native_display,
+      const EGLAttrib *attrib_list)
+{
+   if (platform == EGL_NONE) {
+      assert(native_display == (void *) EGL_DEFAULT_DISPLAY);
+      assert(attrib_list == NULL);
+      return eglGetDisplay((EGLNativeDisplayType) native_display);
+   } else {
+      return eglGetPlatformDisplay(platform, native_display, attrib_list);
+   }
+}
+
+static void *
+__eglGLVNDGetProcAddress(const char *procName)
+{
+   if (strcmp(procName, "eglQueryString") == 0)
+      return (void *) __eglGLVNDQueryString;
+
+   return (void *) eglGetProcAddress(procName);
+}
+
+EGLAPI EGLBoolean
+__egl_Main(uint32_t version, const __EGLapiExports *exports,
+     __EGLvendorInfo *vendor, __EGLapiImports *imports)
+{
+   if (EGL_VENDOR_ABI_GET_MAJOR_VERSION(version) !=
+       EGL_VENDOR_ABI_MAJOR_VERSION)
+      return EGL_FALSE;
+
+   __eglGLVNDApiExports = exports;
+   __eglInitDispatchStubs(exports);
+
+   imports->getPlatformDisplay = __eglGLVNDGetPlatformDisplay;
+   imports->getSupportsAPI = _eglIsApiValid;
+   imports->getVendorString = __eglGLVNDGetVendorString;
+   imports->getProcAddress = __eglGLVNDGetProcAddress;
+   imports->getDispatchAddress = __eglDispatchFindDispatchFunction;
+   imports->setDispatchIndex = __eglSetDispatchIndex;
+
+   return EGL_TRUE;
+}
+
-- 
2.7.4



More information about the mesa-dev mailing list