Access library dependencies through a single object.

Bug 18752589

Change-Id: I93155cead50b30faa876023f9ed00f60b7c9e34e
Reviewed-on: https://swiftshader-review.googlesource.com/2831
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Greg Hartman <ghartman@google.com>
Tested-by: Greg Hartman <ghartman@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libEGL/Context.hpp b/src/OpenGL/libEGL/Context.hpp
index b48789f..bde79b5 100644
--- a/src/OpenGL/libEGL/Context.hpp
+++ b/src/OpenGL/libEGL/Context.hpp
@@ -20,7 +20,7 @@
 	virtual void bindTexImage(Surface *surface) = 0;

 	virtual EGLenum validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel) = 0;

 	virtual Image *createSharedImage(EGLenum target, GLuint name, GLuint textureLevel) = 0;

-	virtual int getClientVersion() = 0;

+	virtual int getClientVersion() const = 0;

 

 protected:

 	virtual ~Context() {};

diff --git a/src/OpenGL/libEGL/Display.cpp b/src/OpenGL/libEGL/Display.cpp
index 8d99bc7..28042f9 100644
--- a/src/OpenGL/libEGL/Display.cpp
+++ b/src/OpenGL/libEGL/Display.cpp
@@ -420,17 +420,17 @@
 
 	if(clientVersion == 1 && config->mRenderableType & EGL_OPENGL_ES_BIT)
 	{
-		if(es1::createContext != 0)
+		if(libGLES_CM)
 		{
-			context = es1::createContext(config, shareContext);
+			context = libGLES_CM->es1CreateContext(config, shareContext);
 		}
 	}
 	else if((clientVersion == 2 && config->mRenderableType & EGL_OPENGL_ES2_BIT) ||
 	        (clientVersion == 3 && config->mRenderableType & EGL_OPENGL_ES3_BIT))
 	{
-		if(es2::createContext != 0)
+		if(libGLESv2)
 		{
-			context = es2::createContext(config, shareContext, clientVersion);
+			context = libGLESv2->es2CreateContext(config, shareContext, clientVersion);
 		}
 	}
 	else
diff --git a/src/OpenGL/libEGL/Surface.cpp b/src/OpenGL/libEGL/Surface.cpp
index 1a36a93..17e8586 100644
--- a/src/OpenGL/libEGL/Surface.cpp
+++ b/src/OpenGL/libEGL/Surface.cpp
@@ -137,8 +137,15 @@
     deleteResources();

 

     if(mWindow)

-    {

-		frameBuffer = es::createFrameBuffer(mDisplay->getNativeDisplay(), mWindow, backBufferWidth, backBufferHeight);

+    {
+		if(libGLES_CM)
+		{

+			frameBuffer = libGLES_CM->createFrameBuffer(mDisplay->getNativeDisplay(), mWindow, backBufferWidth, backBufferHeight);
+		}
+		else if(libGLESv2)
+		{

+			frameBuffer = libGLESv2->createFrameBuffer(mDisplay->getNativeDisplay(), mWindow, backBufferWidth, backBufferHeight);
+		}

 

 		if(!frameBuffer)

 		{

@@ -147,8 +154,15 @@
 			return error(EGL_BAD_ALLOC, false);

 		}

     }

-

-	backBuffer = es::createBackBuffer(backBufferWidth, backBufferHeight, mConfig);

+
+	if(libGLES_CM)
+	{

+		backBuffer = libGLES_CM->createBackBuffer(backBufferWidth, backBufferHeight, mConfig);
+	}
+	else if(libGLESv2)
+	{
+		backBuffer = libGLESv2->createBackBuffer(backBufferWidth, backBufferHeight, mConfig);
+	}

 

     if(!backBuffer)

     {

@@ -158,8 +172,16 @@
     }

 

     if(mConfig->mDepthStencilFormat != sw::FORMAT_NULL)

-    {

-        mDepthStencil = es::createDepthStencil(backBufferWidth, backBufferHeight, mConfig->mDepthStencilFormat, 1, false);

+    {
+
+		if(libGLES_CM)
+		{

+			mDepthStencil = libGLES_CM->createDepthStencil(backBufferWidth, backBufferHeight, mConfig->mDepthStencilFormat, 1, false);
+		}
+		else if(libGLESv2)
+		{
+			mDepthStencil = libGLESv2->createDepthStencil(backBufferWidth, backBufferHeight, mConfig->mDepthStencilFormat, 1, false);
+		}

 

 		if(!mDepthStencil)

 		{

diff --git a/src/OpenGL/libEGL/exports.map b/src/OpenGL/libEGL/exports.map
index 6a455e7..6ab0b00 100644
--- a/src/OpenGL/libEGL/exports.map
+++ b/src/OpenGL/libEGL/exports.map
@@ -42,9 +42,7 @@
     eglCreatePlatformWindowSurfaceEXT;

     eglCreatePlatformPixmapSurfaceEXT;

 

-	# Functions that don't change the error code, for use by client APIs

-	clientGetCurrentContext;

-	clientGetCurrentDisplay;

+	libEGLexports;

 

 local:

     *;

diff --git a/src/OpenGL/libEGL/libEGL.cbp b/src/OpenGL/libEGL/libEGL.cbp
index ee5fa97..2582c34 100644
--- a/src/OpenGL/libEGL/libEGL.cbp
+++ b/src/OpenGL/libEGL/libEGL.cbp
@@ -126,6 +126,7 @@
 		<Unit filename="Surface.h" />
 		<Unit filename="exports.map" />
 		<Unit filename="libEGL.cpp" />
+		<Unit filename="libEGL.hpp" />
 		<Unit filename="main.cpp" />
 		<Unit filename="main.h" />
 		<Extensions>
diff --git a/src/OpenGL/libEGL/libEGL.cpp b/src/OpenGL/libEGL/libEGL.cpp
index 1e2a70c..0dd14b7 100644
--- a/src/OpenGL/libEGL/libEGL.cpp
+++ b/src/OpenGL/libEGL/libEGL.cpp
@@ -26,6 +26,8 @@
 

 #include <string.h>

 

+using namespace egl;

+

 static bool validateDisplay(egl::Display *display)

 {

 	if(display == EGL_NO_DISPLAY)

@@ -630,13 +632,19 @@
 	}

 

 	egl::Display *display = static_cast<egl::Display*>(dpy);

+	egl::Context *shareContext = static_cast<egl::Context*>(share_context);

 

 	if(!validateConfig(display, config))

 	{

 		return EGL_NO_CONTEXT;

 	}

 

-	return display->createContext(config, static_cast<egl::Context*>(share_context), clientVersion);

+	if(shareContext && shareContext->getClientVersion() != clientVersion)

+	{

+		return error(EGL_BAD_CONTEXT, EGL_NO_CONTEXT);

+	}

+

+	return display->createContext(config, shareContext, clientVersion);

 }

 

 EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx)

@@ -977,15 +985,15 @@
 		}

 	}

 

-	if(es2::getProcAddress != 0)

+	if(libGLESv2)

 	{

-		__eglMustCastToProperFunctionPointerType proc = es2::getProcAddress(procname);

+		__eglMustCastToProperFunctionPointerType proc = libGLESv2->es2GetProcAddress(procname);

 		if(proc) return proc;

 	}

 

-	if(es1::getProcAddress != 0)

+	if(libGLES_CM)

 	{

-		__eglMustCastToProperFunctionPointerType proc =  es1::getProcAddress(procname);

+		__eglMustCastToProperFunctionPointerType proc =  libGLES_CM->es1GetProcAddress(procname);

 		if(proc) return proc;

 	}

 

diff --git a/src/OpenGL/libEGL/libEGL.def b/src/OpenGL/libEGL/libEGL.def
index e9293a9..df088dd 100644
--- a/src/OpenGL/libEGL/libEGL.def
+++ b/src/OpenGL/libEGL/libEGL.def
@@ -42,6 +42,4 @@
     eglCreatePlatformWindowSurfaceEXT

     eglCreatePlatformPixmapSurfaceEXT

 

-	; Functions that don't change the error code, for use by client APIs

-	clientGetCurrentContext

-	clientGetCurrentDisplay
\ No newline at end of file
+	libEGLexports
\ No newline at end of file
diff --git a/src/OpenGL/libEGL/libEGL.hpp b/src/OpenGL/libEGL/libEGL.hpp
new file mode 100644
index 0000000..2fd614d
--- /dev/null
+++ b/src/OpenGL/libEGL/libEGL.hpp
@@ -0,0 +1,108 @@
+#ifndef libEGL_hpp
+#define libEGL_hpp
+
+#define EGLAPI
+#include <EGL/egl.h>
+#define EGL_EGLEXT_PROTOTYPES
+#include <EGL/eglext.h>
+
+#include "Common/SharedLibrary.hpp"
+
+class LibEGLexports
+{
+public:
+	LibEGLexports();
+
+	EGLint (EGLAPIENTRY *eglGetError)(void);
+	EGLDisplay (EGLAPIENTRY *eglGetDisplay)(EGLNativeDisplayType display_id);
+	EGLBoolean (EGLAPIENTRY *eglInitialize)(EGLDisplay dpy, EGLint *major, EGLint *minor);
+	EGLBoolean (EGLAPIENTRY *eglTerminate)(EGLDisplay dpy);
+	const char *(EGLAPIENTRY *eglQueryString)(EGLDisplay dpy, EGLint name);
+	EGLBoolean (EGLAPIENTRY *eglGetConfigs)(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
+	EGLBoolean (EGLAPIENTRY *eglChooseConfig)(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
+	EGLBoolean (EGLAPIENTRY *eglGetConfigAttrib)(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value);
+	EGLSurface (EGLAPIENTRY *eglCreateWindowSurface)(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list);
+	EGLSurface (EGLAPIENTRY *eglCreatePbufferSurface)(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list);
+	EGLSurface (EGLAPIENTRY *eglCreatePixmapSurface)(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list);
+	EGLBoolean (EGLAPIENTRY *eglDestroySurface)(EGLDisplay dpy, EGLSurface surface);
+	EGLBoolean (EGLAPIENTRY *eglQuerySurface)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value);
+	EGLBoolean (EGLAPIENTRY *eglBindAPI)(EGLenum api);
+	EGLenum (EGLAPIENTRY *eglQueryAPI)(void);
+	EGLBoolean (EGLAPIENTRY *eglWaitClient)(void);
+	EGLBoolean (EGLAPIENTRY *eglReleaseThread)(void);
+	EGLSurface (EGLAPIENTRY *eglCreatePbufferFromClientBuffer)(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list);
+	EGLBoolean (EGLAPIENTRY *eglSurfaceAttrib)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value);
+	EGLBoolean (EGLAPIENTRY *eglBindTexImage)(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
+	EGLBoolean (EGLAPIENTRY *eglReleaseTexImage)(EGLDisplay dpy, EGLSurface surface, EGLint buffer);
+	EGLBoolean (EGLAPIENTRY *eglSwapInterval)(EGLDisplay dpy, EGLint interval);
+	EGLContext (EGLAPIENTRY *eglCreateContext)(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list);
+	EGLBoolean (EGLAPIENTRY *eglDestroyContext)(EGLDisplay dpy, EGLContext ctx);
+	EGLBoolean (EGLAPIENTRY *eglMakeCurrent)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
+	EGLContext (EGLAPIENTRY *eglGetCurrentContext)(void);
+	EGLSurface (EGLAPIENTRY *eglGetCurrentSurface)(EGLint readdraw);
+	EGLDisplay (EGLAPIENTRY *eglGetCurrentDisplay)(void);
+	EGLBoolean (EGLAPIENTRY *eglQueryContext)(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value);
+	EGLBoolean (EGLAPIENTRY *eglWaitGL)(void);
+	EGLBoolean (EGLAPIENTRY *eglWaitNative)(EGLint engine);
+	EGLBoolean (EGLAPIENTRY *eglSwapBuffers)(EGLDisplay dpy, EGLSurface surface);
+	EGLBoolean (EGLAPIENTRY *eglCopyBuffers)(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target);
+	EGLImageKHR (EGLAPIENTRY *eglCreateImageKHR)(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list);
+	EGLBoolean (EGLAPIENTRY *eglDestroyImageKHR)(EGLDisplay dpy, EGLImageKHR image);
+	__eglMustCastToProperFunctionPointerType (EGLAPIENTRY *eglGetProcAddress)(const char*);
+
+	// Functions that don't change the error code, for use by client APIs
+	egl::Context *(*clientGetCurrentContext)();
+	egl::Display *(*clientGetCurrentDisplay)();
+};
+
+class LibEGL
+{
+public:
+	LibEGL()
+	{
+		libEGL = nullptr;
+		libEGLexports = nullptr;
+	}
+
+	~LibEGL()
+	{
+		freeLibrary(libEGL);
+	}
+
+	LibEGLexports *operator->()
+	{
+		return loadExports();
+	}
+
+private:
+	LibEGLexports *loadExports()
+	{
+		if(!libEGL)
+		{
+			#if defined(_WIN32)
+			const char *libEGL_lib[] = {"libEGL.dll", "libEGL_translator.dll"};
+			#elif defined(__ANDROID__)
+			const char *libEGL_lib[] = {"/vendor/lib/egl/libEGL_swiftshader.so"};
+			#elif defined(__LP64__)
+			const char *libEGL_lib[] = {"lib64EGL_translator.so", "libEGL.so.1", "libEGL.so"};
+			#else
+			const char *libEGL_lib[] = {"libEGL_translator.so", "libEGL.so.1", "libEGL.so"};
+			#endif
+
+			libEGL = loadLibrary(libEGL_lib);
+
+			if(libEGL)
+			{
+				auto libEGLexportsProc = (LibEGLexports *(*)())getProcAddress(libEGL, "libEGLexports");
+				libEGLexports = libEGLexportsProc();
+			}
+		}
+
+		return libEGLexports;
+	}
+
+	void *libEGL;
+	LibEGLexports *libEGLexports;
+};
+
+#endif   // libEGL_hpp
diff --git a/src/OpenGL/libEGL/libEGL.vcxproj b/src/OpenGL/libEGL/libEGL.vcxproj
index 3211fe7..da31900 100644
--- a/src/OpenGL/libEGL/libEGL.vcxproj
+++ b/src/OpenGL/libEGL/libEGL.vcxproj
@@ -312,6 +312,7 @@
     <ClInclude Include="Context.hpp" />

     <ClInclude Include="Display.h" />

     <ClInclude Include="Image.hpp" />

+    <ClInclude Include="libEGL.hpp" />

     <ClInclude Include="main.h" />

     <ClInclude Include="resource.h" />

     <ClInclude Include="Surface.h" />

diff --git a/src/OpenGL/libEGL/libEGL.vcxproj.filters b/src/OpenGL/libEGL/libEGL.vcxproj.filters
index 5f18d2d..c41caac 100644
--- a/src/OpenGL/libEGL/libEGL.vcxproj.filters
+++ b/src/OpenGL/libEGL/libEGL.vcxproj.filters
@@ -73,6 +73,9 @@
     <ClInclude Include="..\common\Object.hpp">

       <Filter>Header Files</Filter>

     </ClInclude>

+    <ClInclude Include="libEGL.hpp">

+      <Filter>Header Files</Filter>

+    </ClInclude>

   </ItemGroup>

   <ItemGroup>

     <ResourceCompile Include="libEGL.rc" />

diff --git a/src/OpenGL/libEGL/main.cpp b/src/OpenGL/libEGL/main.cpp
index 4f9c731..04bfdd7 100644
--- a/src/OpenGL/libEGL/main.cpp
+++ b/src/OpenGL/libEGL/main.cpp
@@ -13,6 +13,7 @@
 

 #include "main.h"

 

+#include "libEGL.hpp"

 #include "Context.hpp"

 #include "Surface.h"

 

@@ -21,6 +22,9 @@
 #include "Common/SharedLibrary.hpp"

 #include "common/debug.h"

 

+#define EGL_EGLEXT_PROTOTYPES

+#include <EGL/eglext.h>

+

 static sw::Thread::LocalStorageKey currentTLS = TLS_OUT_OF_INDEXES;

 

 #if !defined(_MSC_VER)

@@ -62,7 +66,7 @@
 	}

 }

 

-CONSTRUCTOR static bool eglAttachProcess()

+CONSTRUCTOR static void eglAttachProcess()

 {

     TRACE("()");

 

@@ -81,51 +85,10 @@
 

     if(currentTLS == TLS_OUT_OF_INDEXES)

     {

-        return false;

+        return;

     }

 

 	eglAttachThread();

-

-	#if defined(_WIN32)

-	const char *libGLES_CM_lib[] = {"libGLES_CM.dll", "libGLES_CM_translator.dll"};

-	#elif defined(__ANDROID__)

-	const char *libGLES_CM_lib[] = {"/vendor/lib/egl/libGLESv1_CM_swiftshader.so"};

-	#elif defined(__LP64__)

-	const char *libGLES_CM_lib[] = {"lib64GLES_CM_translator.so", "libGLES_CM.so.1", "libGLES_CM.so"};

-	#else

-	const char *libGLES_CM_lib[] = {"libGLES_CM_translator.so", "libGLES_CM.so.1", "libGLES_CM.so"};

-	#endif

-

-    libGLES_CM = loadLibrary(libGLES_CM_lib);

-    es1::createContext = (egl::Context *(*)(const egl::Config*, const egl::Context*))getProcAddress(libGLES_CM, "glCreateContext");

-    es1::getProcAddress = (__eglMustCastToProperFunctionPointerType (*)(const char*))getProcAddress(libGLES_CM, "glGetProcAddress");

-

-	#if defined(_WIN32)

-	const char *libGLESv2_lib[] = {"libGLESv2.dll", "libGLES_V2_translator.dll"};

-	#elif defined(__ANDROID__)

-	const char *libGLESv2_lib[] = {"/vendor/lib/egl/libGLESv2_swiftshader.so"};

-	#elif defined(__LP64__)

-	const char *libGLESv2_lib[] = {"lib64GLES_V2_translator.so", "libGLESv2.so.2", "libGLESv2.so"};

-	#else

-	const char *libGLESv2_lib[] = {"libGLES_V2_translator.so", "libGLESv2.so.2", "libGLESv2.so"};

-	#endif

-

-    libGLESv2 = loadLibrary(libGLESv2_lib);

-    es2::createContext = (egl::Context *(*)(const egl::Config*, const egl::Context*, EGLint))getProcAddress(libGLESv2, "glCreateContext");

-    es2::getProcAddress = (__eglMustCastToProperFunctionPointerType (*)(const char*))getProcAddress(libGLESv2, "glGetProcAddress");

-

-	es::createBackBuffer = (egl::Image *(*)(int, int, const egl::Config*))getProcAddress(libGLES_CM, "createBackBuffer");

-	es::createDepthStencil = (egl::Image *(*)(unsigned int, unsigned int, sw::Format, int, bool))getProcAddress(libGLES_CM, "createDepthStencil");

-    es::createFrameBuffer = (sw::FrameBuffer *(*)(EGLNativeDisplayType, EGLNativeWindowType, int, int))getProcAddress(libGLES_CM, "createFrameBuffer");

-

-	if(!es::createBackBuffer)

-	{

-		es::createBackBuffer = (egl::Image *(*)(int, int, const egl::Config*))getProcAddress(libGLESv2, "createBackBuffer");

-		es::createDepthStencil = (egl::Image *(*)(unsigned int, unsigned int, sw::Format, int, bool))getProcAddress(libGLESv2, "createDepthStencil");

-		es::createFrameBuffer = (sw::FrameBuffer *(*)(EGLNativeDisplayType, EGLNativeWindowType, int, int))getProcAddress(libGLESv2, "createFrameBuffer");

-	}

-

-	return libGLES_CM != 0 || libGLESv2 != 0;

 }

 

 DESTRUCTOR static void eglDetachProcess()

@@ -134,7 +97,6 @@
 

 	eglDetachThread();

 	sw::Thread::freeLocalStorageKey(currentTLS);

-	freeLibrary(libGLESv2);

 }

 

 #if defined(_WIN32)

@@ -183,7 +145,7 @@
 		#ifndef NDEBUG

 			WaitForDebugger(instance);

 		#endif

-        return eglAttachProcess();

+        eglAttachProcess();

         break;

     case DLL_THREAD_ATTACH:

         eglAttachThread();

@@ -329,7 +291,6 @@
 

     return current->readSurface;

 }

-}

 

 void error(EGLint errorCode)

 {

@@ -357,38 +318,56 @@
 		}

 	}

 }

-

-extern "C"

-{

-EGLContext clientGetCurrentContext()

-{

-    return egl::getCurrentContext();

 }

 

-EGLContext clientGetCurrentDisplay()

+LibEGLexports::LibEGLexports()

 {

-    return egl::getCurrentDisplay();

-}

+	this->eglGetError = ::eglGetError;

+	this->eglGetDisplay = ::eglGetDisplay;

+	this->eglInitialize = ::eglInitialize;

+	this->eglTerminate = ::eglTerminate;

+	this->eglQueryString = ::eglQueryString;

+	this->eglGetConfigs = ::eglGetConfigs;

+	this->eglChooseConfig = ::eglChooseConfig;

+	this->eglGetConfigAttrib = ::eglGetConfigAttrib;

+	this->eglCreateWindowSurface = ::eglCreateWindowSurface;

+	this->eglCreatePbufferSurface = ::eglCreatePbufferSurface;

+	this->eglCreatePixmapSurface = ::eglCreatePixmapSurface;

+	this->eglDestroySurface = ::eglDestroySurface;

+	this->eglQuerySurface = ::eglQuerySurface;

+	this->eglBindAPI = ::eglBindAPI;

+	this->eglQueryAPI = ::eglQueryAPI;

+	this->eglWaitClient = ::eglWaitClient;

+	this->eglReleaseThread = ::eglReleaseThread;

+	this->eglCreatePbufferFromClientBuffer = ::eglCreatePbufferFromClientBuffer;

+	this->eglSurfaceAttrib = ::eglSurfaceAttrib;

+	this->eglBindTexImage = ::eglBindTexImage;

+	this->eglReleaseTexImage = ::eglReleaseTexImage;

+	this->eglSwapInterval = ::eglSwapInterval;

+	this->eglCreateContext = ::eglCreateContext;

+	this->eglDestroyContext = ::eglDestroyContext;

+	this->eglMakeCurrent = ::eglMakeCurrent;

+	this->eglGetCurrentContext = ::eglGetCurrentContext;

+	this->eglGetCurrentSurface = ::eglGetCurrentSurface;

+	this->eglGetCurrentDisplay = ::eglGetCurrentDisplay;

+	this->eglQueryContext = ::eglQueryContext;

+	this->eglWaitGL = ::eglWaitGL;

+	this->eglWaitNative = ::eglWaitNative;

+	this->eglSwapBuffers = ::eglSwapBuffers;

+	this->eglCopyBuffers = ::eglCopyBuffers;

+	this->eglCreateImageKHR = ::eglCreateImageKHR;

+	this->eglDestroyImageKHR = ::eglDestroyImageKHR;

+	this->eglGetProcAddress = ::eglGetProcAddress;

+

+	this->clientGetCurrentContext = egl::getCurrentContext;

+	this->clientGetCurrentDisplay = egl::getCurrentDisplay;

 }

 

-namespace es1

+extern "C" LibEGLexports *libEGLexports()

 {

-	egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext) = 0;

-	__eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname) = 0;

+	static LibEGLexports libEGL;

+	return &libEGL;

 }

 

-namespace es2

-{

-	egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext, EGLint clientVersion) = 0;

-	__eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname) = 0;

-}

-

-namespace es

-{

-	egl::Image *(*createBackBuffer)(int width, int height, const egl::Config *config) = 0;

-	egl::Image *(*createDepthStencil)(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard) = 0;

-	sw::FrameBuffer *(*createFrameBuffer)(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height) = 0;

-}

-

-void *libGLES_CM = 0;   // Handle to the libGLES_CM module

-void *libGLESv2 = 0;   // Handle to the libGLESv2 module

+LibGLES_CM libGLES_CM;

+LibGLESv2 libGLESv2;

diff --git a/src/OpenGL/libEGL/main.h b/src/OpenGL/libEGL/main.h
index 9758237..0f3211e 100644
--- a/src/OpenGL/libEGL/main.h
+++ b/src/OpenGL/libEGL/main.h
@@ -14,8 +14,12 @@
 #ifndef LIBEGL_MAIN_H_
 #define LIBEGL_MAIN_H_
 
+#include "libGLES_CM/libGLES_CM.hpp"
+#include "libGLESv2/libGLESv2.hpp"
+
 #define EGLAPI
 #include <EGL/egl.h>
+#define EGL_EGLEXT_PROTOTYPES
 #include <EGL/eglext.h>
 
 namespace egl
@@ -51,28 +55,25 @@
 
 	void setCurrentReadSurface(Surface *surface);
 	Surface *getCurrentReadSurface();
-}
 
-void error(EGLint errorCode);
+	void error(EGLint errorCode);
+	
+	template<class T>
+	const T &error(EGLint errorCode, const T &returnValue)
+	{
+		egl::error(errorCode);
 
-template<class T>
-const T &error(EGLint errorCode, const T &returnValue)
-{
-    error(errorCode);
+		return returnValue;
+	}
 
-    return returnValue;
-}
+	template<class T>
+	const T &success(const T &returnValue)
+	{
+		egl::setCurrentError(EGL_SUCCESS);
 
-template<class T>
-const T &success(const T &returnValue)
-{
-    egl::setCurrentError(EGL_SUCCESS);
+		return returnValue;
+	}
 
-    return returnValue;
-}
-
-namespace egl
-{
 	class Config;
 	class Surface;
 	class Display;
@@ -80,34 +81,7 @@
 	class Image;
 }
 
-namespace sw
-{
-	class FrameBuffer;
-	enum Format : unsigned char;
-}
-
-// libGLES_CM dependencies
-namespace es1
-{
-	extern egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext);
-	extern __eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname);
-}
-
-// libGLESv2 dependencies
-namespace es2
-{
-	extern egl::Context *(*createContext)(const egl::Config *config, const egl::Context *shareContext, EGLint clientVersion);
-	extern __eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname);
-}
-
-namespace es
-{
-	extern egl::Image *(*createBackBuffer)(int width, int height, const egl::Config *config);
-	extern egl::Image *(*createDepthStencil)(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
-	extern sw::FrameBuffer *(*createFrameBuffer)(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);
-}
-
-extern void *libGLES_CM;   // Handle to the libGLES_CM module
-extern void *libGLESv2;    // Handle to the libGLESv2 module
+extern LibGLES_CM libGLES_CM;
+extern LibGLESv2 libGLESv2;
 
 #endif  // LIBEGL_MAIN_H_