Add EGL 1.5 entry points.

This enables running dEQP on Linux when it was built against an EGL 1.5
capable driver. Note that this is not a complete EGL 1.5 implementation.

Change-Id: Ie29d9ec61e7e3694eb8862aad7432b77fe7c7bae
Reviewed-on: https://swiftshader-review.googlesource.com/15909
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Common/Version.h b/src/Common/Version.h
index eae755d..72bd15d 100644
--- a/src/Common/Version.h
+++ b/src/Common/Version.h
@@ -15,7 +15,7 @@
 #define MAJOR_VERSION 4
 #define MINOR_VERSION 1
 #define BUILD_VERSION 0
-#define BUILD_REVISION 1
+#define BUILD_REVISION 2
 
 #define STRINGIFY(x) #x
 #define MACRO_STRINGIFY(x) STRINGIFY(x)
diff --git a/src/OpenGL/libEGL/Display.cpp b/src/OpenGL/libEGL/Display.cpp
index 0b2c6dd..5821ba9 100644
--- a/src/OpenGL/libEGL/Display.cpp
+++ b/src/OpenGL/libEGL/Display.cpp
@@ -284,7 +284,7 @@
 	return true;
 }
 
-EGLSurface Display::createWindowSurface(EGLNativeWindowType window, EGLConfig config, const EGLint *attribList)
+EGLSurface Display::createWindowSurface(EGLNativeWindowType window, EGLConfig config, const EGLAttrib *attribList)
 {
 	const Config *configuration = mConfigSet.get(config);
 
diff --git a/src/OpenGL/libEGL/Display.h b/src/OpenGL/libEGL/Display.h
index 30f01b9..ddef14a 100644
--- a/src/OpenGL/libEGL/Display.h
+++ b/src/OpenGL/libEGL/Display.h
@@ -59,7 +59,7 @@
 		bool getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig);
 		bool getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value);
 
-		EGLSurface createWindowSurface(EGLNativeWindowType window, EGLConfig config, const EGLint *attribList);
+		EGLSurface createWindowSurface(EGLNativeWindowType window, EGLConfig config, const EGLAttrib *attribList);
 		EGLSurface createPBufferSurface(EGLConfig config, const EGLint *attribList, EGLClientBuffer clientBuffer = nullptr);
 		EGLContext createContext(EGLConfig configHandle, const Context *shareContext, EGLint clientVersion);
 		EGLSyncKHR createSync(Context *context);
diff --git a/src/OpenGL/libEGL/libEGL.cpp b/src/OpenGL/libEGL/libEGL.cpp
index 952fb88..c76f52b 100644
--- a/src/OpenGL/libEGL/libEGL.cpp
+++ b/src/OpenGL/libEGL/libEGL.cpp
@@ -30,11 +30,14 @@
 #endif
 
 #include <algorithm>
+#include <vector>
 #include <string.h>
 
-using namespace egl;
-
-static bool validateDisplay(egl::Display *display)
+namespace egl
+{
+namespace
+{
+bool validateDisplay(egl::Display *display)
 {
 	if(display == EGL_NO_DISPLAY)
 	{
@@ -49,7 +52,7 @@
 	return true;
 }
 
-static bool validateConfig(egl::Display *display, EGLConfig config)
+bool validateConfig(egl::Display *display, EGLConfig config)
 {
 	if(!validateDisplay(display))
 	{
@@ -64,7 +67,7 @@
 	return true;
 }
 
-static bool validateContext(egl::Display *display, egl::Context *context)
+bool validateContext(egl::Display *display, egl::Context *context)
 {
 	if(!validateDisplay(display))
 	{
@@ -79,7 +82,7 @@
 	return true;
 }
 
-static bool validateSurface(egl::Display *display, egl::Surface *surface)
+bool validateSurface(egl::Display *display, egl::Surface *surface)
 {
 	if(!validateDisplay(display))
 	{
@@ -94,8 +97,34 @@
 	return true;
 }
 
-namespace egl
+// Class to facilitate conversion from EGLint to EGLAttrib lists.
+class EGLAttribs
 {
+public:
+	explicit EGLAttribs(const EGLint *attrib_list)
+	{
+		if(attrib_list)
+		{
+			while(*attrib_list != EGL_NONE)
+			{
+				attrib.push_back(static_cast<EGLAttrib>(*attrib_list));
+				attrib_list++;
+			}
+		}
+
+		attrib.push_back(EGL_NONE);
+	}
+
+	operator const EGLAttrib*() const
+	{
+		return &attrib[0];
+	}
+
+private:
+	std::vector<EGLAttrib> attrib;
+};
+}
+
 EGLint GetError(void)
 {
 	TRACE("()");
@@ -301,10 +330,10 @@
 	return success(EGL_TRUE);
 }
 
-EGLSurface CreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list)
+EGLSurface CreatePlatformWindowSurface(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list)
 {
-	TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, EGLNativeWindowType win = %p, "
-	      "const EGLint *attrib_list = %p)", dpy, config, window, attrib_list);
+	TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, void *native_window = %p, "
+	      "const EGLint *attrib_list = %p)", dpy, config, native_window, attrib_list);
 
 	egl::Display *display = egl::Display::get(dpy);
 
@@ -313,12 +342,30 @@
 		return EGL_NO_SURFACE;
 	}
 
-	if(!display->isValidWindow(window))
+	if(!display->isValidWindow((EGLNativeWindowType)native_window))
 	{
 		return error(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
 	}
 
-	return display->createWindowSurface(window, config, attrib_list);
+	return display->createWindowSurface((EGLNativeWindowType)native_window, config, attrib_list);
+}
+
+EGLSurface CreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list)
+{
+	TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, void *native_window = %p, "
+	      "const EGLint *attrib_list = %p)", dpy, config, native_window, attrib_list);
+
+	EGLAttribs attribs(attrib_list);
+	return CreatePlatformWindowSurface(dpy, config, native_window, attribs);
+}
+
+EGLSurface CreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list)
+{
+	TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, EGLNativeWindowType window = %p, "
+	      "const EGLint *attrib_list = %p)", dpy, config, window, attrib_list);
+
+	EGLAttribs attribs(attrib_list);
+	return CreatePlatformWindowSurface(dpy, config, (void*)window, attribs);
 }
 
 EGLSurface CreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list)
@@ -336,10 +383,10 @@
 	return display->createPBufferSurface(config, attrib_list);
 }
 
-EGLSurface CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list)
+EGLSurface CreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list)
 {
-	TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, EGLNativePixmapType pixmap = %p, "
-	      "const EGLint *attrib_list = %p)", dpy, config, pixmap, attrib_list);
+	TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, void *native_pixmap = %p, "
+	      "const EGLint *attrib_list = %p)", dpy, config, native_pixmap, attrib_list);
 
 	egl::Display *display = egl::Display::get(dpy);
 
@@ -353,6 +400,24 @@
 	return success(EGL_NO_SURFACE);
 }
 
+EGLSurface CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list)
+{
+	TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, void *native_pixmap = %p, "
+	      "const EGLint *attrib_list = %p)", dpy, config, native_pixmap, attrib_list);
+
+	EGLAttribs attribs(attrib_list);
+	return CreatePlatformPixmapSurface(dpy, config, native_pixmap, attribs);
+}
+
+EGLSurface CreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list)
+{
+	TRACE("(EGLDisplay dpy = %p, EGLConfig config = %p, EGLNativePixmapType pixmap = %p, "
+	      "const EGLint *attrib_list = %p)", dpy, config, pixmap, attrib_list);
+
+	EGLAttribs attribs(attrib_list);
+	return CreatePlatformPixmapSurface(dpy, config, (void*)pixmap, attribs);
+}
+
 EGLBoolean DestroySurface(EGLDisplay dpy, EGLSurface surface)
 {
 	TRACE("(EGLDisplay dpy = %p, EGLSurface surface = %p)", dpy, surface);
@@ -1062,9 +1127,9 @@
 	return success(EGL_FALSE);
 }
 
-EGLImageKHR CreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
+EGLImage CreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list)
 {
-	TRACE("(EGLDisplay dpy = %p, EGLContext ctx = %p, EGLenum target = 0x%X, buffer = %p, const EGLint attrib_list = %p)", dpy, ctx, target, buffer, attrib_list);
+	TRACE("(EGLDisplay dpy = %p, EGLContext ctx = %p, EGLenum target = 0x%X, buffer = %p, const EGLAttrib *attrib_list = %p)", dpy, ctx, target, buffer, attrib_list);
 
 	egl::Display *display = egl::Display::get(dpy);
 	egl::Context *context = static_cast<egl::Context*>(ctx);
@@ -1083,15 +1148,15 @@
 	GLuint textureLevel = 0;
 	if(attrib_list)
 	{
-		for(const EGLint *attribute = attrib_list; attribute[0] != EGL_NONE; attribute += 2)
+		for(const EGLAttrib *attribute = attrib_list; attribute[0] != EGL_NONE; attribute += 2)
 		{
 			if(attribute[0] == EGL_IMAGE_PRESERVED_KHR)
 			{
-				imagePreserved = attribute[1];
+				imagePreserved = static_cast<EGLenum>(attribute[1]);
 			}
 			else if(attribute[0] == EGL_GL_TEXTURE_LEVEL_KHR)
 			{
-				textureLevel = attribute[1];
+				textureLevel = static_cast<GLuint>(attribute[1]);
 			}
 			else
 			{
@@ -1144,11 +1209,19 @@
 		return error(EGL_BAD_PARAMETER, EGL_NO_IMAGE_KHR);
 	}
 
-	EGLImageKHR eglImage = display->createSharedImage(image);
+	EGLImage eglImage = display->createSharedImage(image);
 
 	return success(eglImage);
 }
 
+EGLImageKHR CreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
+{
+	TRACE("(EGLDisplay dpy = %p, EGLContext ctx = %p, EGLenum target = 0x%X, buffer = %p, const EGLint attrib_list = %p)", dpy, ctx, target, buffer, attrib_list);
+
+	EGLAttribs attribs(attrib_list);
+	return CreateImage(dpy, ctx, target, buffer, attribs);
+}
+
 EGLBoolean DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
 {
 	TRACE("(EGLDisplay dpy = %p, EGLImageKHR image = %p)", dpy, image);
@@ -1168,32 +1241,21 @@
 	return success(EGL_TRUE);
 }
 
-EGLDisplay GetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list)
+EGLDisplay GetPlatformDisplay(EGLenum platform, void *native_display, const EGLAttrib *attrib_list)
 {
-	TRACE("(EGLenum platform = 0x%X, void *native_display = %p, const EGLint *attrib_list = %p)", platform, native_display, attrib_list);
+	TRACE("(EGLenum platform = 0x%X, void *native_display = %p, const EGLAttrib *attrib_list = %p)", platform, native_display, attrib_list);
 
 	#if defined(__linux__) && !defined(__ANDROID__)
 		switch(platform)
 		{
-		#if defined(USE_X11)
-		case EGL_PLATFORM_X11_EXT: break;
-		#endif
-		case EGL_PLATFORM_GBM_KHR: break;
+		case EGL_PLATFORM_X11_EXT:
+		case EGL_PLATFORM_GBM_KHR:
+			break;
 		default:
 			return error(EGL_BAD_PARAMETER, EGL_NO_DISPLAY);
 		}
 
-		if(platform == EGL_PLATFORM_GBM_KHR)
-		{
-			if(native_display != (void*)EGL_DEFAULT_DISPLAY || attrib_list != NULL)
-			{
-				return error(EGL_BAD_ATTRIBUTE, EGL_NO_DISPLAY);   // Unimplemented
-			}
-
-			return success(HEADLESS_DISPLAY);
-		}
-		#if defined(USE_X11)
-		else if(platform == EGL_PLATFORM_X11_EXT)
+		if(platform == EGL_PLATFORM_X11_EXT)
 		{
 			if(!libX11)
 			{
@@ -1205,7 +1267,15 @@
 				return error(EGL_BAD_ATTRIBUTE, EGL_NO_DISPLAY);   // Unimplemented
 			}
 		}
-		#endif
+		else if(platform == EGL_PLATFORM_GBM_KHR)
+		{
+			if(native_display != (void*)EGL_DEFAULT_DISPLAY || attrib_list != NULL)
+			{
+				return error(EGL_BAD_ATTRIBUTE, EGL_NO_DISPLAY);   // Unimplemented
+			}
+
+			return success(HEADLESS_DISPLAY);
+		}
 
 		return success(PRIMARY_DISPLAY);   // We only support the default display
 	#else
@@ -1213,19 +1283,17 @@
 	#endif
 }
 
-EGLSurface CreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list)
+EGLDisplay GetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list)
 {
-	return CreateWindowSurface(dpy, config, (EGLNativeWindowType)native_window, attrib_list);
+	TRACE("(EGLenum platform = 0x%X, void *native_display = %p, const EGLint *attrib_list = %p)", platform, native_display, attrib_list);
+
+	EGLAttribs attribs(attrib_list);
+	return GetPlatformDisplay(platform, native_display, attribs);
 }
 
-EGLSurface CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list)
+EGLSync CreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
 {
-	return CreatePixmapSurface(dpy, config, (EGLNativePixmapType)native_pixmap, attrib_list);
-}
-
-EGLSyncKHR CreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
-{
-	TRACE("(EGLDisplay dpy = %p, EGLunum type = %x, EGLint *attrib_list=%p)", dpy, type, attrib_list);
+	TRACE("(EGLDisplay dpy = %p, EGLunum type = %x, EGLAttrib *attrib_list=%p)", dpy, type, attrib_list);
 
 	egl::Display *display = egl::Display::get(dpy);
 
@@ -1256,6 +1324,14 @@
 	return success(sync);
 }
 
+EGLSyncKHR CreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
+{
+	TRACE("(EGLDisplay dpy = %p, EGLunum type = %x, EGLint *attrib_list=%p)", dpy, type, attrib_list);
+
+	EGLAttribs attribs(attrib_list);
+	return CreateSync(dpy, type, attribs);
+}
+
 EGLBoolean DestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
 {
 	TRACE("(EGLDisplay dpy = %p, EGLSyncKHR sync = %p)", dpy, sync);
@@ -1306,9 +1382,9 @@
 	return success(EGL_CONDITION_SATISFIED_KHR);
 }
 
-EGLBoolean GetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
+EGLBoolean GetSyncAttrib(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLAttrib *value)
 {
-	TRACE("(EGLDisplay dpy = %p, EGLSyncKHR sync = %p, EGLint attribute = %x, EGLint *value = %p)", dpy, sync, attribute, value);
+	TRACE("(EGLDisplay dpy = %p, EGLSyncKHR sync = %p, EGLint attribute = %x, EGLAttrib *value = %p)", dpy, sync, attribute, value);
 
 	egl::Display *display = egl::Display::get(dpy);
 	FenceSync *eglSync = static_cast<FenceSync*>(sync);
@@ -1340,6 +1416,14 @@
 	}
 }
 
+EGLBoolean GetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
+{
+	EGLAttrib attrib_value;
+	EGLBoolean result = GetSyncAttrib(dpy, sync, attribute, &attrib_value);
+	*value = static_cast<EGLint>(attrib_value);
+	return result;
+}
+
 __eglMustCastToProperFunctionPointerType GetProcAddress(const char *procname)
 {
 	TRACE("(const char *procname = \"%s\")", procname);
@@ -1367,20 +1451,27 @@
 		FUNCTION(eglBindAPI),
 		FUNCTION(eglBindTexImage),
 		FUNCTION(eglChooseConfig),
+		FUNCTION(eglClientWaitSync),
 		FUNCTION(eglClientWaitSyncKHR),
 		FUNCTION(eglCopyBuffers),
 		FUNCTION(eglCreateContext),
+		FUNCTION(eglCreateImage),
 		FUNCTION(eglCreateImageKHR),
 		FUNCTION(eglCreatePbufferFromClientBuffer),
 		FUNCTION(eglCreatePbufferSurface),
 		FUNCTION(eglCreatePixmapSurface),
+		FUNCTION(eglCreatePlatformPixmapSurface),
 		FUNCTION(eglCreatePlatformPixmapSurfaceEXT),
+		FUNCTION(eglCreatePlatformWindowSurface),
 		FUNCTION(eglCreatePlatformWindowSurfaceEXT),
+		FUNCTION(eglCreateSync),
 		FUNCTION(eglCreateSyncKHR),
 		FUNCTION(eglCreateWindowSurface),
 		FUNCTION(eglDestroyContext),
+		FUNCTION(eglDestroyImage),
 		FUNCTION(eglDestroyImageKHR),
 		FUNCTION(eglDestroySurface),
+		FUNCTION(eglDestroySync),
 		FUNCTION(eglDestroySyncKHR),
 		FUNCTION(eglGetConfigAttrib),
 		FUNCTION(eglGetConfigs),
@@ -1389,8 +1480,10 @@
 		FUNCTION(eglGetCurrentSurface),
 		FUNCTION(eglGetDisplay),
 		FUNCTION(eglGetError),
+		FUNCTION(eglGetPlatformDisplay),
 		FUNCTION(eglGetPlatformDisplayEXT),
 		FUNCTION(eglGetProcAddress),
+		FUNCTION(eglGetSyncAttrib),
 		FUNCTION(eglGetSyncAttribKHR),
 		FUNCTION(eglInitialize),
 		FUNCTION(eglMakeCurrent),
@@ -1407,6 +1500,8 @@
 		FUNCTION(eglWaitClient),
 		FUNCTION(eglWaitGL),
 		FUNCTION(eglWaitNative),
+		FUNCTION(eglWaitSync),
+		FUNCTION(eglWaitSyncKHR),
 
 		#undef FUNCTION
 	};
diff --git a/src/OpenGL/libEGL/libEGL.lds b/src/OpenGL/libEGL/libEGL.lds
index 7a2a479..5252a30 100644
--- a/src/OpenGL/libEGL/libEGL.lds
+++ b/src/OpenGL/libEGL/libEGL.lds
@@ -4,14 +4,21 @@
 	eglBindAPI;
 	eglBindTexImage;
 	eglChooseConfig;
+	eglClientWaitSync;
 	eglCopyBuffers;
 	eglCreateContext;
+	eglCreateImage;
 	eglCreatePbufferFromClientBuffer;
 	eglCreatePbufferSurface;
 	eglCreatePixmapSurface;
+	eglCreatePlatformPixmapSurface;
+	eglCreatePlatformWindowSurface;
+	eglCreateSync;
 	eglCreateWindowSurface;
 	eglDestroyContext;
+	eglDestroyImage;
 	eglDestroySurface;
+	eglDestroySync;
 	eglGetConfigAttrib;
 	eglGetConfigs;
 	eglGetCurrentContext;
@@ -19,7 +26,9 @@
 	eglGetCurrentSurface;
 	eglGetDisplay;
 	eglGetError;
+	eglGetPlatformDisplay;
 	eglGetProcAddress;
+	eglGetSyncAttrib;
 	eglInitialize;
 	eglMakeCurrent;
 	eglQueryAPI;
@@ -35,6 +44,7 @@
 	eglWaitClient;
 	eglWaitGL;
 	eglWaitNative;
+	eglWaitSync;
 
 	# Extensions
 	eglCreateImageKHR;
@@ -56,4 +66,4 @@
 
 local:
 	*;
-};
\ No newline at end of file
+};
diff --git a/src/OpenGL/libEGL/main.cpp b/src/OpenGL/libEGL/main.cpp
index a1ff6f1..c6c5630 100644
--- a/src/OpenGL/libEGL/main.cpp
+++ b/src/OpenGL/libEGL/main.cpp
@@ -368,14 +368,20 @@
 EGLBoolean SwapBuffers(EGLDisplay dpy, EGLSurface surface);
 EGLBoolean CopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
 EGLImageKHR CreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
+EGLImageKHR CreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list);
 EGLBoolean DestroyImageKHR(EGLDisplay dpy, EGLImageKHR image);
 EGLDisplay GetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list);
+EGLDisplay GetPlatformDisplay(EGLenum platform, void *native_display, const EGLAttrib *attrib_list);
 EGLSurface CreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list);
+EGLSurface CreatePlatformWindowSurface(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list);
 EGLSurface CreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list);
+EGLSurface CreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list);
 EGLSyncKHR CreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list);
+EGLSyncKHR CreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list);
 EGLBoolean DestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync);
 EGLint ClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout);
 EGLBoolean GetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value);
+EGLBoolean GetSyncAttrib(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLAttrib *value);
 __eglMustCastToProperFunctionPointerType GetProcAddress(const char *procname);
 }
 
@@ -551,46 +557,101 @@
 	return egl::CreateImageKHR(dpy, ctx, target, buffer, attrib_list);
 }
 
+EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImage(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list)
+{
+	return egl::CreateImage(dpy, ctx, target, buffer, attrib_list);
+}
+
 EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
 {
 	return egl::DestroyImageKHR(dpy, image);
 }
 
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImage(EGLDisplay dpy, EGLImageKHR image)
+{
+	return egl::DestroyImageKHR(dpy, image);
+}
+
 EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT(EGLenum platform, void *native_display, const EGLint *attrib_list)
 {
 	return egl::GetPlatformDisplayEXT(platform, native_display, attrib_list);
 }
 
+EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplay(EGLenum platform, void *native_display, const EGLAttrib *attrib_list)
+{
+	return egl::GetPlatformDisplay(platform, native_display, attrib_list);
+}
+
 EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list)
 {
 	return egl::CreatePlatformWindowSurfaceEXT(dpy, config, native_window, attrib_list);
 }
 
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurface(EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list)
+{
+	return egl::CreatePlatformWindowSurface(dpy, config, native_window, attrib_list);
+}
+
 EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list)
 {
 	return egl::CreatePlatformPixmapSurfaceEXT(dpy, config, native_pixmap, attrib_list);
 }
 
+EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurface(EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list)
+{
+	return egl::CreatePlatformPixmapSurface(dpy, config, native_pixmap, attrib_list);
+}
+
 EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR(EGLDisplay dpy, EGLenum type, const EGLint *attrib_list)
 {
 	return egl::CreateSyncKHR(dpy, type, attrib_list);
 }
 
+EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSync(EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list)
+{
+	return egl::CreateSync(dpy, type, attrib_list);
+}
+
 EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR(EGLDisplay dpy, EGLSyncKHR sync)
 {
 	return egl::DestroySyncKHR(dpy, sync);
 }
 
+EGLAPI EGLBoolean EGLAPIENTRY eglDestroySync(EGLDisplay dpy, EGLSyncKHR sync)
+{
+	return egl::DestroySyncKHR(dpy, sync);
+}
+
 EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
 {
 	return egl::ClientWaitSyncKHR(dpy, sync, flags, timeout);
 }
 
+EGLAPI EGLint EGLAPIENTRY eglClientWaitSync(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout)
+{
+	return egl::ClientWaitSyncKHR(dpy, sync, flags, timeout);
+}
+
 EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value)
 {
 	return egl::GetSyncAttribKHR(dpy, sync, attribute, value);
 }
 
+EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttrib(EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLAttrib *value)
+{
+	return egl::GetSyncAttrib(dpy, sync, attribute, value);
+}
+
+EGLAPI EGLint EGLAPIENTRY eglWaitSyncKHR(EGLDisplay dpy, EGLSyncKHR sync, EGLint flags)
+{
+	return egl::ClientWaitSyncKHR(dpy, sync, flags, EGL_FOREVER_KHR);
+}
+
+EGLAPI EGLBoolean EGLAPIENTRY eglWaitSync(EGLDisplay dpy, EGLSync sync, EGLint flags)
+{
+	return egl::ClientWaitSyncKHR(dpy, sync, flags, EGL_FOREVER_KHR);
+}
+
 EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname)
 {
 	return egl::GetProcAddress(procname);
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index b7ae2c5..789b0c8 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -6280,16 +6280,6 @@
 		__eglMustCastToProperFunctionPointerType address;
 	};
 
-	struct CompareFunctor
-	{
-		bool operator()(const Function &a, const Function &b) const
-		{
-			return strcmp(a.name, b.name) < 0;
-		}
-	};
-
-	// This array must be kept sorted with respect to strcmp(), so that binary search works correctly.
-	// The Unix command "LC_COLLATE=C sort" will generate the correct order.
 	static const Function glFunctions[] =
 	{
 		#define FUNCTION(name) {#name, (__eglMustCastToProperFunctionPointerType)name}
@@ -6593,12 +6583,29 @@
 	static const size_t numFunctions = sizeof glFunctions / sizeof(Function);
 	static const Function *const glFunctionsEnd = glFunctions + numFunctions;
 
-	Function needle;
-	needle.name = procname;
+	// The array must be kept sorted with respect to strcmp(), so that binary search works correctly.
+	// The Unix command "LC_COLLATE=C sort" will generate the correct order.
+	#ifndef NDEBUG
+		for(size_t i = 0; i < numFunctions - 1; i++)
+		{
+			ASSERT(strcmp(glFunctions[i].name, glFunctions[i + 1].name) < 0);
+		}
+	#endif
 
 	if(procname && strncmp("gl", procname, 2) == 0)
 	{
+		struct CompareFunctor
+		{
+			bool operator()(const Function &a, const Function &b) const
+			{
+				return strcmp(a.name, b.name) < 0;
+			}
+		};
+
+		Function needle;
+		needle.name = procname;
 		const Function *result = std::lower_bound(glFunctions, glFunctionsEnd, needle, CompareFunctor());
+
 		if(result != glFunctionsEnd && strcmp(procname, result->name) == 0)
 		{
 			return (__eglMustCastToProperFunctionPointerType)result->address;