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/Common/SharedLibrary.hpp b/src/Common/SharedLibrary.hpp
index adaa7fc..bcddce7 100644
--- a/src/Common/SharedLibrary.hpp
+++ b/src/Common/SharedLibrary.hpp
@@ -9,6 +9,9 @@
// or implied, including but not limited to any patent rights, are granted to you.
//
+#ifndef SharedLibrary_hpp
+#define SharedLibrary_hpp
+
#if defined(_WIN32)
#include <Windows.h>
#else
@@ -102,3 +105,5 @@
return library ? dlsym(library, name) : 0;
}
#endif
+
+#endif // SharedLibrary_hpp
diff --git a/src/Main/FrameBufferAndroid.cpp b/src/Main/FrameBufferAndroid.cpp
index 56aa94c..daa178a 100644
--- a/src/Main/FrameBufferAndroid.cpp
+++ b/src/Main/FrameBufferAndroid.cpp
@@ -96,10 +96,7 @@
}
}
-extern "C"
+sw::FrameBuffer *createFrameBuffer(void *display, ANativeWindow* window, int width, int height)
{
- sw::FrameBuffer *createFrameBuffer(void *display, void* window, int width, int height)
- {
- return new sw::FrameBufferAndroid((ANativeWindow*)window, width, height);
- }
+ return new sw::FrameBufferAndroid(window, width, height);
}
diff --git a/src/Main/FrameBufferWin.cpp b/src/Main/FrameBufferWin.cpp
index 928aa55..8765171 100644
--- a/src/Main/FrameBufferWin.cpp
+++ b/src/Main/FrameBufferWin.cpp
@@ -52,27 +52,24 @@
#include "FrameBufferGDI.hpp"
#include "Common/Configurator.hpp"
-extern "C"
+sw::FrameBufferWin *createFrameBufferWin(HWND windowHandle, int width, int height, bool fullscreen, bool topLeftOrigin)
{
- sw::FrameBufferWin *createFrameBufferWin(HWND windowHandle, int width, int height, bool fullscreen, bool topLeftOrigin)
+ sw::Configurator ini("SwiftShader.ini");
+ int api = ini.getInteger("Testing", "FrameBufferAPI", 0);
+
+ if(api == 0 && topLeftOrigin)
{
- sw::Configurator ini("SwiftShader.ini");
- int api = ini.getInteger("Testing", "FrameBufferAPI", 0);
-
- if(api == 0 && topLeftOrigin)
- {
- return new sw::FrameBufferDD(windowHandle, width, height, fullscreen, topLeftOrigin);
- }
- else
- {
- return new sw::FrameBufferGDI(windowHandle, width, height, fullscreen, topLeftOrigin);
- }
-
- return 0;
+ return new sw::FrameBufferDD(windowHandle, width, height, fullscreen, topLeftOrigin);
+ }
+ else
+ {
+ return new sw::FrameBufferGDI(windowHandle, width, height, fullscreen, topLeftOrigin);
}
- sw::FrameBuffer *createFrameBuffer(HDC display, HWND window, int width, int height)
- {
- return createFrameBufferWin(window, width, height, false, false);
- }
+ return 0;
+}
+
+sw::FrameBuffer *createFrameBuffer(HDC display, HWND window, int width, int height)
+{
+ return createFrameBufferWin(window, width, height, false, false);
}
diff --git a/src/Main/FrameBufferWin.hpp b/src/Main/FrameBufferWin.hpp
index dfbe302..c887c67 100644
--- a/src/Main/FrameBufferWin.hpp
+++ b/src/Main/FrameBufferWin.hpp
@@ -54,9 +54,4 @@
};
}
-extern "C"
-{
- sw::FrameBufferWin *createFrameBufferWin(HWND windowHandle, int width, int height, bool fullscreen, bool topLeftOrigin);
-}
-
#endif // sw_FrameBufferWin_hpp
diff --git a/src/Main/FrameBufferX11.cpp b/src/Main/FrameBufferX11.cpp
index f0d3c50..c43a930 100644
--- a/src/Main/FrameBufferX11.cpp
+++ b/src/Main/FrameBufferX11.cpp
@@ -144,10 +144,7 @@
}
}
-extern "C"
+sw::FrameBuffer *createFrameBuffer(Display *display, Window window, int width, int height)
{
- sw::FrameBuffer *createFrameBuffer(void *display, Window window, int width, int height)
- {
- return new sw::FrameBufferX11((Display*)display, window, width, height);
- }
+ return new sw::FrameBufferX11(display, window, width, height);
}
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_
diff --git a/src/OpenGL/libGL/main.h b/src/OpenGL/libGL/main.h
index 63b6fb5..ceb90ee 100644
--- a/src/OpenGL/libGL/main.h
+++ b/src/OpenGL/libGL/main.h
@@ -67,6 +67,6 @@
return returnValue;
}
-extern "C" sw::FrameBuffer *createFrameBuffer(NativeDisplayType display, NativeWindowType window, int width, int height);
+extern sw::FrameBuffer *createFrameBuffer(NativeDisplayType display, NativeWindowType window, int width, int height);
#endif // LIBGL_MAIN_H_
diff --git a/src/OpenGL/libGLES_CM/Context.cpp b/src/OpenGL/libGLES_CM/Context.cpp
index 0ca4654..337b406 100644
--- a/src/OpenGL/libGLES_CM/Context.cpp
+++ b/src/OpenGL/libGLES_CM/Context.cpp
@@ -255,7 +255,7 @@
markAllStateDirty();
}
-int Context::getClientVersion()
+int Context::getClientVersion() const
{
return 1;
}
@@ -2807,11 +2807,8 @@
}
-// Exported functions for use by EGL
-extern "C"
+egl::Context *es1CreateContext(const egl::Config *config, const egl::Context *shareContext)
{
- es1::Context *glCreateContext(const egl::Config *config, const es1::Context *shareContext)
- {
- return new es1::Context(config, shareContext);
- }
+ ASSERT(!shareContext || shareContext->getClientVersion() == 1); // Should be checked by eglCreateContext
+ return new es1::Context(config, static_cast<const es1::Context*>(shareContext));
}
diff --git a/src/OpenGL/libGLES_CM/Context.h b/src/OpenGL/libGLES_CM/Context.h
index 9d6c074..387c527 100644
--- a/src/OpenGL/libGLES_CM/Context.h
+++ b/src/OpenGL/libGLES_CM/Context.h
@@ -25,6 +25,7 @@
#define GL_API
#include <GLES/gl.h>
+#define GL_GLEXT_PROTOTYPES
#include <GLES/glext.h>
#define EGLAPI
#include <EGL/egl.h>
@@ -263,7 +264,7 @@
Context(const egl::Config *config, const Context *shareContext);
virtual void makeCurrent(egl::Surface *surface);
- virtual int getClientVersion();
+ virtual int getClientVersion() const;
void markAllStateDirty();
diff --git a/src/OpenGL/libGLES_CM/Texture.cpp b/src/OpenGL/libGLES_CM/Texture.cpp
index 7b767e2..cd2c35b 100644
--- a/src/OpenGL/libGLES_CM/Texture.cpp
+++ b/src/OpenGL/libGLES_CM/Texture.cpp
@@ -758,60 +758,56 @@
}
-// Exported functions for use by EGL
-extern "C"
+egl::Image *createBackBuffer(int width, int height, const egl::Config *config)
{
- egl::Image *createBackBuffer(int width, int height, const egl::Config *config)
+ if(config)
{
- if(config)
- {
- return new es1::Image(0, width, height, config->mAlphaSize ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE);
- }
+ return new es1::Image(0, width, height, config->mAlphaSize ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE);
+ }
+ return 0;
+}
+
+egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard)
+{
+ if(width == 0 || height == 0 || height > OUTLINE_RESOLUTION)
+ {
+ ERR("Invalid parameters");
return 0;
}
- egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard)
+ bool lockable = true;
+
+ switch(format)
{
- if(width == 0 || height == 0 || height > OUTLINE_RESOLUTION)
- {
- ERR("Invalid parameters");
- return 0;
- }
-
- bool lockable = true;
-
- switch(format)
- {
- // case sw::FORMAT_D15S1:
- case sw::FORMAT_D24S8:
- case sw::FORMAT_D24X8:
- // case sw::FORMAT_D24X4S4:
- case sw::FORMAT_D24FS8:
- case sw::FORMAT_D32:
- case sw::FORMAT_D16:
- lockable = false;
- break;
- // case sw::FORMAT_S8_LOCKABLE:
- // case sw::FORMAT_D16_LOCKABLE:
- case sw::FORMAT_D32F_LOCKABLE:
- // case sw::FORMAT_D32_LOCKABLE:
- case sw::FORMAT_DF24S8:
- case sw::FORMAT_DF16S8:
- lockable = true;
- break;
- default:
- UNREACHABLE();
- }
-
- es1::Image *surface = new es1::Image(0, width, height, format, multiSampleDepth, lockable, true);
-
- if(!surface)
- {
- ERR("Out of memory");
- return 0;
- }
-
- return surface;
+// case sw::FORMAT_D15S1:
+ case sw::FORMAT_D24S8:
+ case sw::FORMAT_D24X8:
+// case sw::FORMAT_D24X4S4:
+ case sw::FORMAT_D24FS8:
+ case sw::FORMAT_D32:
+ case sw::FORMAT_D16:
+ lockable = false;
+ break;
+// case sw::FORMAT_S8_LOCKABLE:
+// case sw::FORMAT_D16_LOCKABLE:
+ case sw::FORMAT_D32F_LOCKABLE:
+// case sw::FORMAT_D32_LOCKABLE:
+ case sw::FORMAT_DF24S8:
+ case sw::FORMAT_DF16S8:
+ lockable = true;
+ break;
+ default:
+ UNREACHABLE();
}
+
+ es1::Image *surface = new es1::Image(0, width, height, format, multiSampleDepth, lockable, true);
+
+ if(!surface)
+ {
+ ERR("Out of memory");
+ return 0;
+ }
+
+ return surface;
}
diff --git a/src/OpenGL/libGLES_CM/exports.map b/src/OpenGL/libGLES_CM/exports.map
index 565d1bc..4f05484 100644
--- a/src/OpenGL/libGLES_CM/exports.map
+++ b/src/OpenGL/libGLES_CM/exports.map
@@ -205,13 +205,7 @@
glDrawTexfOES;
glDrawTexfvOES;
- # EGL dependencies
- glCreateContext;
- glGetProcAddress;
-
- createFrameBuffer;
- createBackBuffer;
- createDepthStencil;
+ libGLES_CMexports;
Register;
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.cbp b/src/OpenGL/libGLES_CM/libGLES_CM.cbp
index 7041a83..c0cbc51 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.cbp
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.cbp
@@ -286,6 +286,7 @@
<Unit filename="VertexDataManager.h" />
<Unit filename="exports.map" />
<Unit filename="libGLES_CM.cpp" />
+ <Unit filename="libGLES_CM.hpp" />
<Unit filename="main.cpp" />
<Unit filename="main.h" />
<Unit filename="mathutil.h" />
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.cpp b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
index 907030e..96323f0 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.cpp
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.cpp
@@ -34,6 +34,8 @@
#include <limits>
+using namespace es1;
+
static bool validImageSize(GLint level, GLsizei width, GLsizei height)
{
if(level < 0 || level >= es1::IMPLEMENTATION_MAX_TEXTURE_LEVELS || width < 0 || height < 0)
@@ -84,218 +86,182 @@
EGLint EGLAPIENTRY eglGetError(void)
{
- static auto eglGetError = (EGLint (EGLAPIENTRY*)(void))getProcAddress(libEGL, "eglGetError");
- return eglGetError();
+ return libEGL->eglGetError();
}
EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id)
{
- static auto eglGetDisplay = (EGLDisplay (EGLAPIENTRY*)(EGLNativeDisplayType display_id))getProcAddress(libEGL, "eglGetDisplay");
- return eglGetDisplay(display_id);
+ return libEGL->eglGetDisplay(display_id);
}
EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
{
- static auto eglInitialize = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy, EGLint *major, EGLint *minor))getProcAddress(libEGL, "eglInitialize");
- return eglInitialize(dpy, major, minor);
+ return libEGL->eglInitialize(dpy, major, minor);
}
EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy)
{
- static auto eglTerminate = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy))getProcAddress(libEGL, "eglTerminate");
- return eglTerminate(dpy);
+ return libEGL->eglTerminate(dpy);
}
const char *EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name)
{
- static auto eglQueryString = (const char *(EGLAPIENTRY*)(EGLDisplay dpy, EGLint name))getProcAddress(libEGL, "eglQueryString");
- return eglQueryString(dpy, name);
+ return libEGL->eglQueryString(dpy, name);
}
EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config)
{
- static auto eglGetConfigs = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config))getProcAddress(libEGL, "eglGetConfigs");
- return eglGetConfigs(dpy, configs, config_size, num_config);
+ return libEGL->eglGetConfigs(dpy, configs, config_size, num_config);
}
EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config)
{
- static auto eglChooseConfig = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config))getProcAddress(libEGL, "eglChooseConfig");
- return eglChooseConfig(dpy, attrib_list, configs, config_size, num_config);
+ return libEGL->eglChooseConfig(dpy, attrib_list, configs, config_size, num_config);
}
EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value)
{
- static auto eglGetConfigAttrib = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value))getProcAddress(libEGL, "eglGetConfigAttrib");
- return eglGetConfigAttrib(dpy, config, attribute, value);
+ return libEGL->eglGetConfigAttrib(dpy, config, attribute, value);
}
EGLSurface EGLAPIENTRY eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list)
{
- static auto eglCreateWindowSurface = (EGLSurface (EGLAPIENTRY*)(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType window, const EGLint *attrib_list))getProcAddress(libEGL, "eglCreateWindowSurface");
- return eglCreateWindowSurface(dpy, config, window, attrib_list);
+ return libEGL->eglCreateWindowSurface(dpy, config, window, attrib_list);
}
EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list)
{
- static auto eglCreatePbufferSurface = (EGLSurface (EGLAPIENTRY*)(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list))getProcAddress(libEGL, "eglCreatePbufferSurface");
- return eglCreatePbufferSurface(dpy, config, attrib_list);
+ return libEGL->eglCreatePbufferSurface(dpy, config, attrib_list);
}
EGLSurface EGLAPIENTRY eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list)
{
- static auto eglCreatePixmapSurface = (EGLSurface (EGLAPIENTRY*)(EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list))getProcAddress(libEGL, "eglCreatePixmapSurface");
- return eglCreatePixmapSurface(dpy, config, pixmap, attrib_list);
+ return libEGL->eglCreatePixmapSurface(dpy, config, pixmap, attrib_list);
}
EGLBoolean EGLAPIENTRY eglDestroySurface(EGLDisplay dpy, EGLSurface surface)
{
- static auto eglDestroySurface = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy, EGLSurface surface))getProcAddress(libEGL, "eglDestroySurface");
- return eglDestroySurface(dpy, surface);
+ return libEGL->eglDestroySurface(dpy, surface);
}
EGLBoolean EGLAPIENTRY eglQuerySurface(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value)
{
- static auto eglQuerySurface = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value))getProcAddress(libEGL, "eglQuerySurface");
- return eglQuerySurface(dpy, surface, attribute, value);
+ return libEGL->eglQuerySurface(dpy, surface, attribute, value);
}
EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api)
{
- static auto eglBindAPI = (EGLBoolean (EGLAPIENTRY*)(EGLenum api))getProcAddress(libEGL, "eglBindAPI");
- return eglBindAPI(api);
+ return libEGL->eglBindAPI(api);
}
EGLenum EGLAPIENTRY eglQueryAPI(void)
{
- static auto eglQueryAPI = (EGLenum (EGLAPIENTRY*)(void))getProcAddress(libEGL, "eglQueryAPI");
- return eglQueryAPI();
+ return libEGL->eglQueryAPI();
}
EGLBoolean EGLAPIENTRY eglWaitClient(void)
{
- static auto eglWaitClient = (EGLBoolean (EGLAPIENTRY*)(void))getProcAddress(libEGL, "eglWaitClient");
- return eglWaitClient();
+ return libEGL->eglWaitClient();
}
EGLBoolean EGLAPIENTRY eglReleaseThread(void)
{
- static auto eglReleaseThread = (EGLBoolean (EGLAPIENTRY*)(void))getProcAddress(libEGL, "eglReleaseThread");
- return eglReleaseThread();
+ return libEGL->eglReleaseThread();
}
EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list)
{
- static auto eglCreatePbufferFromClientBuffer = (EGLSurface (EGLAPIENTRY*)(EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list))getProcAddress(libEGL, "eglCreatePbufferFromClientBuffer");
- return eglCreatePbufferFromClientBuffer(dpy, buftype, buffer, config, attrib_list);
+ return libEGL->eglCreatePbufferFromClientBuffer(dpy, buftype, buffer, config, attrib_list);
}
EGLBoolean EGLAPIENTRY eglSurfaceAttrib(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value)
{
- static auto eglSurfaceAttrib = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value))getProcAddress(libEGL, "eglSurfaceAttrib");
- return eglSurfaceAttrib(dpy, surface, attribute, value);
+ return libEGL->eglSurfaceAttrib(dpy, surface, attribute, value);
}
EGLBoolean EGLAPIENTRY eglBindTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
{
- static auto eglBindTexImage = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy, EGLSurface surface, EGLint buffer))getProcAddress(libEGL, "eglBindTexImage");
- return eglBindTexImage(dpy, surface, buffer);
+ return libEGL->eglBindTexImage(dpy, surface, buffer);
}
EGLBoolean EGLAPIENTRY eglReleaseTexImage(EGLDisplay dpy, EGLSurface surface, EGLint buffer)
{
- static auto eglReleaseTexImage = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy, EGLSurface surface, EGLint buffer))getProcAddress(libEGL, "eglReleaseTexImage");
- return eglReleaseTexImage(dpy, surface, buffer);
+ return libEGL->eglReleaseTexImage(dpy, surface, buffer);
}
EGLBoolean EGLAPIENTRY eglSwapInterval(EGLDisplay dpy, EGLint interval)
{
- static auto eglSwapInterval = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy, EGLint interval))getProcAddress(libEGL, "eglSwapInterval");
- return eglSwapInterval(dpy, interval);
+ return libEGL->eglSwapInterval(dpy, interval);
}
EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list)
{
- static auto eglCreateContext = (EGLContext (EGLAPIENTRY*)(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list))getProcAddress(libEGL, "eglCreateContext");
- return eglCreateContext(dpy, config, share_context, attrib_list);
+ return libEGL->eglCreateContext(dpy, config, share_context, attrib_list);
}
EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
{
- static auto eglDestroyContext = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy, EGLContext ctx))getProcAddress(libEGL, "eglDestroyContext");
- return eglDestroyContext(dpy, ctx);
+ return libEGL->eglDestroyContext(dpy, ctx);
}
EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
{
- static auto eglMakeCurrent = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx))getProcAddress(libEGL, "eglMakeCurrent");
- return eglMakeCurrent(dpy, draw, read, ctx);
+ return libEGL->eglMakeCurrent(dpy, draw, read, ctx);
}
EGLContext EGLAPIENTRY eglGetCurrentContext(void)
{
- static auto eglGetCurrentContext = (EGLContext (EGLAPIENTRY*)(void))getProcAddress(libEGL, "eglGetCurrentContext");
- return eglGetCurrentContext();
+ return libEGL->eglGetCurrentContext();
}
EGLSurface EGLAPIENTRY eglGetCurrentSurface(EGLint readdraw)
{
- static auto eglGetCurrentSurface = (EGLSurface (EGLAPIENTRY*)(EGLint readdraw))getProcAddress(libEGL, "eglGetCurrentSurface");
- return eglGetCurrentSurface(readdraw);
+ return libEGL->eglGetCurrentSurface(readdraw);
}
EGLDisplay EGLAPIENTRY eglGetCurrentDisplay(void)
{
- static auto eglGetCurrentDisplay = (EGLDisplay (EGLAPIENTRY*)(void))getProcAddress(libEGL, "eglGetCurrentDisplay");
- return eglGetCurrentDisplay();
+ return libEGL->eglGetCurrentDisplay();
}
EGLBoolean EGLAPIENTRY eglQueryContext(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value)
{
- static auto eglQueryContext = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value))getProcAddress(libEGL, "eglQueryContext");
- return eglQueryContext(dpy, ctx, attribute, value);
+ return libEGL->eglQueryContext(dpy, ctx, attribute, value);
}
EGLBoolean EGLAPIENTRY eglWaitGL(void)
{
- static auto eglWaitGL = (EGLBoolean (EGLAPIENTRY*)(void))getProcAddress(libEGL, "eglWaitGL");
- return eglWaitGL();
+ return libEGL->eglWaitGL();
}
EGLBoolean EGLAPIENTRY eglWaitNative(EGLint engine)
{
- static auto eglWaitNative = (EGLBoolean (EGLAPIENTRY*)(EGLint engine))getProcAddress(libEGL, "eglWaitNative");
- return eglWaitNative(engine);
+ return libEGL->eglWaitNative(engine);
}
EGLBoolean EGLAPIENTRY eglSwapBuffers(EGLDisplay dpy, EGLSurface surface)
{
- static auto eglSwapBuffers = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy, EGLSurface surface))getProcAddress(libEGL, "eglSwapBuffers");
- return eglSwapBuffers(dpy, surface);
+ return libEGL->eglSwapBuffers(dpy, surface);
}
EGLBoolean EGLAPIENTRY eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target)
{
- static auto eglCopyBuffers = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target))getProcAddress(libEGL, "eglCopyBuffers");
- return eglCopyBuffers(dpy, surface, target);
+ return libEGL->eglCopyBuffers(dpy, surface, target);
}
EGLImageKHR EGLAPIENTRY eglCreateImageKHR(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list)
{
- static auto eglCreateImageKHR = (EGLImageKHR (EGLAPIENTRY*)(EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list))getProcAddress(libEGL, "eglCreateImageKHR");
- return eglCreateImageKHR(dpy, ctx, target, buffer, attrib_list);
+ return libEGL->eglCreateImageKHR(dpy, ctx, target, buffer, attrib_list);
}
EGLBoolean EGLAPIENTRY eglDestroyImageKHR(EGLDisplay dpy, EGLImageKHR image)
{
- static auto eglDestroyImageKHR = (EGLBoolean (EGLAPIENTRY*)(EGLDisplay dpy, EGLImageKHR image))getProcAddress(libEGL, "eglDestroyImageKHR");
- return eglDestroyImageKHR(dpy, image);
+ return libEGL->eglDestroyImageKHR(dpy, image);
}
__eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname)
{
- static auto eglGetProcAddress = (__eglMustCastToProperFunctionPointerType (EGLAPIENTRY*)(const char*))getProcAddress(libEGL, "eglGetProcAddress");
- return eglGetProcAddress(procname);
+ return libEGL->eglGetProcAddress(procname);
}
void GL_APIENTRY glActiveTexture(GLenum texture)
@@ -3898,7 +3864,7 @@
UNIMPLEMENTED();
}
-__eglMustCastToProperFunctionPointerType glGetProcAddress(const char *procname)
+__eglMustCastToProperFunctionPointerType es1GetProcAddress(const char *procname)
{
struct Extension
{
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.def b/src/OpenGL/libGLES_CM/libGLES_CM.def
index 6ab41db..3efec4d 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.def
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.def
@@ -205,12 +205,6 @@
glDrawTexfOES
glDrawTexfvOES
- ; EGL dependencies
- glCreateContext
- glGetProcAddress
-
- createFrameBuffer
- createBackBuffer
- createDepthStencil
+ libGLES_CMexports
Register
\ No newline at end of file
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.hpp b/src/OpenGL/libGLES_CM/libGLES_CM.hpp
new file mode 100644
index 0000000..dd2d23a
--- /dev/null
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.hpp
@@ -0,0 +1,95 @@
+#ifndef libGLES_CM_hpp
+#define libGLES_CM_hpp
+
+#define GL_API
+#include <GLES/gl.h>
+#define GL_GLEXT_PROTOTYPES
+#include <GLES/glext.h>
+#define EGLAPI
+#include <EGL/egl.h>
+
+#include "Common/SharedLibrary.hpp"
+
+namespace sw
+{
+class FrameBuffer;
+enum Format : unsigned char;
+}
+
+namespace egl
+{
+class Context;
+class Image;
+class Config;
+}
+
+class LibGLES_CMexports
+{
+public:
+ LibGLES_CMexports();
+
+ egl::Context *(*es1CreateContext)(const egl::Config *config, const egl::Context *shareContext);
+ __eglMustCastToProperFunctionPointerType (*es1GetProcAddress)(const char *procname);
+ egl::Image *(*createBackBuffer)(int width, int height, const egl::Config *config);
+ egl::Image *(*createDepthStencil)(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
+ sw::FrameBuffer *(*createFrameBuffer)(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);
+
+ void (GL_APIENTRY *glEGLImageTargetTexture2DOES)(GLenum target, GLeglImageOES image);
+};
+
+class LibGLES_CM
+{
+public:
+ LibGLES_CM()
+ {
+ libGLES_CM = nullptr;
+ libGLES_CMexports = nullptr;
+ }
+
+ ~LibGLES_CM()
+ {
+ freeLibrary(libGLES_CM);
+ }
+
+ operator bool()
+ {
+ return loadExports();
+ }
+
+ LibGLES_CMexports *operator->()
+ {
+ return loadExports();
+ }
+
+private:
+ LibGLES_CMexports *loadExports()
+ {
+ if(!libGLES_CM)
+ {
+ #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);
+
+ if(libGLES_CM)
+ {
+ auto libGLES_CMexportsProc = (LibGLES_CMexports *(*)())getProcAddress(libGLES_CM, "libGLES_CMexports");
+ libGLES_CMexports = libGLES_CMexportsProc();
+ }
+ }
+
+ return libGLES_CMexports;
+ }
+
+ void *libGLES_CM;
+ LibGLES_CMexports *libGLES_CMexports;
+};
+
+#endif libGLES_CM_hpp
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.vcxproj b/src/OpenGL/libGLES_CM/libGLES_CM.vcxproj
index c591b19..ce35b8d 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.vcxproj
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.vcxproj
@@ -351,6 +351,7 @@
<ClInclude Include="Framebuffer.h" />
<ClInclude Include="Image.hpp" />
<ClInclude Include="IndexDataManager.h" />
+ <ClInclude Include="libGLES_CM.hpp" />
<ClInclude Include="main.h" />
<ClInclude Include="mathutil.h" />
<ClInclude Include="Renderbuffer.h" />
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.vcxproj.filters b/src/OpenGL/libGLES_CM/libGLES_CM.vcxproj.filters
index 0ccb31a..47f9aaa 100644
--- a/src/OpenGL/libGLES_CM/libGLES_CM.vcxproj.filters
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.vcxproj.filters
@@ -130,6 +130,9 @@
<ClInclude Include="..\common\MatrixStack.hpp">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="libGLES_CM.hpp">
+ <Filter>Header Files</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="libGLES_CM.rc" />
diff --git a/src/OpenGL/libGLES_CM/main.cpp b/src/OpenGL/libGLES_CM/main.cpp
index 0927c65..0044dbf 100644
--- a/src/OpenGL/libGLES_CM/main.cpp
+++ b/src/OpenGL/libGLES_CM/main.cpp
@@ -13,12 +13,16 @@
#include "main.h"
+#include "libGLES_CM.hpp"
#include "Framebuffer.h"
#include "libEGL/Surface.h"
#include "Common/Thread.hpp"
#include "Common/SharedLibrary.hpp"
#include "common/debug.h"
+#define GL_GLEXT_PROTOTYPES
+#include <GLES/glext.h>
+
#if !defined(_MSC_VER)
#define CONSTRUCTOR __attribute__((constructor))
#define DESTRUCTOR __attribute__((destructor))
@@ -37,27 +41,11 @@
TRACE("()");
}
-CONSTRUCTOR static bool glAttachProcess()
+CONSTRUCTOR static void glAttachProcess()
{
TRACE("()");
glAttachThread();
-
- #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);
- egl::getCurrentContext = (egl::Context *(*)())getProcAddress(libEGL, "clientGetCurrentContext");
- egl::getCurrentDisplay = (egl::Display *(*)())getProcAddress(libEGL, "clientGetCurrentDisplay");
-
- return libEGL != 0;
}
DESTRUCTOR static void glDetachProcess()
@@ -65,7 +53,6 @@
TRACE("()");
glDetachThread();
- freeLibrary(libEGL);
}
#if defined(_WIN32)
@@ -74,7 +61,7 @@
switch(reason)
{
case DLL_PROCESS_ATTACH:
- return glAttachProcess();
+ glAttachProcess();
break;
case DLL_THREAD_ATTACH:
glAttachThread();
@@ -97,7 +84,7 @@
{
es1::Context *getContext()
{
- egl::Context *context = egl::getCurrentContext();
+ egl::Context *context = libEGL->clientGetCurrentContext();
if(context && context->getClientVersion() == 1)
{
@@ -109,7 +96,7 @@
egl::Display *getDisplay()
{
- return egl::getCurrentDisplay();
+ return libEGL->clientGetCurrentDisplay();
}
Device *getDevice()
@@ -118,7 +105,6 @@
return context ? context->getDevice() : 0;
}
-}
// Records an error code
void error(GLenum errorCode)
@@ -153,11 +139,28 @@
}
}
}
-
-namespace egl
-{
- egl::Context *(*getCurrentContext)() = 0;
- egl::Display *(*getCurrentDisplay)() = 0;
}
-void *libEGL = 0; // Handle to the libEGL module
+egl::Context *es1CreateContext(const egl::Config *config, const egl::Context *shareContext);
+extern "C" __eglMustCastToProperFunctionPointerType es1GetProcAddress(const char *procname);
+egl::Image *createBackBuffer(int width, int height, const egl::Config *config);
+egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
+sw::FrameBuffer *createFrameBuffer(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);
+
+LibGLES_CMexports::LibGLES_CMexports()
+{
+ this->es1CreateContext = ::es1CreateContext;
+ this->es1GetProcAddress = ::es1GetProcAddress;
+ this->createBackBuffer = ::createBackBuffer;
+ this->createDepthStencil = ::createDepthStencil;
+ this->createFrameBuffer = ::createFrameBuffer;
+ this->glEGLImageTargetTexture2DOES = ::glEGLImageTargetTexture2DOES;
+}
+
+extern "C" LibGLES_CMexports *libGLES_CMexports()
+{
+ static LibGLES_CMexports libGLES_CM;
+ return &libGLES_CM;
+}
+
+LibEGL libEGL;
\ No newline at end of file
diff --git a/src/OpenGL/libGLES_CM/main.h b/src/OpenGL/libGLES_CM/main.h
index 4b5648a..a5d1aad 100644
--- a/src/OpenGL/libGLES_CM/main.h
+++ b/src/OpenGL/libGLES_CM/main.h
@@ -17,6 +17,7 @@
#include "Context.h"
#include "Device.hpp"
#include "common/debug.h"
+#include "libEGL/libEGL.hpp"
#include "libEGL/Display.h"
#define GL_API
@@ -29,25 +30,18 @@
Context *getContext();
egl::Display *getDisplay();
Device *getDevice();
+
+ void error(GLenum errorCode);
+
+ template<class T>
+ const T &error(GLenum errorCode, const T &returnValue)
+ {
+ error(errorCode);
+
+ return returnValue;
+ }
}
-void error(GLenum errorCode);
-
-template<class T>
-const T &error(GLenum errorCode, const T &returnValue)
-{
- error(errorCode);
-
- return returnValue;
-}
-
-// libEGL dependencies
-namespace egl
-{
- extern egl::Context *(*getCurrentContext)();
- extern egl::Display *(*getCurrentDisplay)();
-}
-
-extern void *libEGL; // Handle to the libEGL module
+extern LibEGL libEGL;
#endif // LIBGLES_CM_MAIN_H_
diff --git a/src/OpenGL/libGLESv2/Context.cpp b/src/OpenGL/libGLESv2/Context.cpp
index 983914e..e5225ce 100644
--- a/src/OpenGL/libGLESv2/Context.cpp
+++ b/src/OpenGL/libGLESv2/Context.cpp
@@ -300,7 +300,7 @@
markAllStateDirty();
}
-EGLint Context::getClientVersion()
+EGLint Context::getClientVersion() const
{
return clientVersion;
}
@@ -4125,11 +4125,8 @@
}
-// Exported functions for use by EGL
-extern "C"
+egl::Context *es2CreateContext(const egl::Config *config, const egl::Context *shareContext, int clientVersion)
{
- es2::Context *glCreateContext(const egl::Config *config, const es2::Context *shareContext, int clientVersion)
- {
- return new es2::Context(config, shareContext, clientVersion);
- }
+ ASSERT(!shareContext || shareContext->getClientVersion() == clientVersion); // Should be checked by eglCreateContext
+ return new es2::Context(config, static_cast<const es2::Context*>(shareContext), clientVersion);
}
diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h
index 4da5a75..995015a 100644
--- a/src/OpenGL/libGLESv2/Context.h
+++ b/src/OpenGL/libGLESv2/Context.h
@@ -353,7 +353,7 @@
Context(const egl::Config *config, const Context *shareContext, EGLint clientVersion);
virtual void makeCurrent(egl::Surface *surface);
- virtual EGLint getClientVersion();
+ virtual EGLint getClientVersion() const;
void markAllStateDirty();
diff --git a/src/OpenGL/libGLESv2/Texture.cpp b/src/OpenGL/libGLESv2/Texture.cpp
index 3d84215..a9002a2 100644
--- a/src/OpenGL/libGLESv2/Texture.cpp
+++ b/src/OpenGL/libGLESv2/Texture.cpp
@@ -1797,60 +1797,57 @@
}
-// Exported functions for use by EGL
-extern "C"
+egl::Image *createBackBuffer(int width, int height, const egl::Config *config)
{
- egl::Image *createBackBuffer(int width, int height, const egl::Config *config)
+ if(config)
{
- if(config)
- {
- return new es2::Image(0, width, height, config->mAlphaSize ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE);
- }
+ return new es2::Image(0, width, height, config->mAlphaSize ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE);
+ }
+ return 0;
+}
+
+egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard)
+{
+ if(width == 0 || height == 0 || height > OUTLINE_RESOLUTION)
+ {
+ ERR("Invalid parameters");
+ return 0;
+ }
+
+ bool lockable = true;
+
+ switch(format)
+ {
+// case sw::FORMAT_D15S1:
+ case sw::FORMAT_D24S8:
+ case sw::FORMAT_D24X8:
+// case sw::FORMAT_D24X4S4:
+ case sw::FORMAT_D24FS8:
+ case sw::FORMAT_D32:
+ case sw::FORMAT_D16:
+ lockable = false;
+ break;
+// case sw::FORMAT_S8_LOCKABLE:
+// case sw::FORMAT_D16_LOCKABLE:
+ case sw::FORMAT_D32F_LOCKABLE:
+// case sw::FORMAT_D32_LOCKABLE:
+ case sw::FORMAT_DF24S8:
+ case sw::FORMAT_DF16S8:
+ lockable = true;
+ break;
+ default:
+ UNREACHABLE();
+ }
+
+ es2::Image *surface = new es2::Image(0, width, height, format, multiSampleDepth, lockable, true);
+
+ if(!surface)
+ {
+ ERR("Out of memory");
return 0;
}
- egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard)
- {
- if(width == 0 || height == 0 || height > OUTLINE_RESOLUTION)
- {
- ERR("Invalid parameters");
- return 0;
- }
-
- bool lockable = true;
-
- switch(format)
- {
- // case sw::FORMAT_D15S1:
- case sw::FORMAT_D24S8:
- case sw::FORMAT_D24X8:
- // case sw::FORMAT_D24X4S4:
- case sw::FORMAT_D24FS8:
- case sw::FORMAT_D32:
- case sw::FORMAT_D16:
- lockable = false;
- break;
- // case sw::FORMAT_S8_LOCKABLE:
- // case sw::FORMAT_D16_LOCKABLE:
- case sw::FORMAT_D32F_LOCKABLE:
- // case sw::FORMAT_D32_LOCKABLE:
- case sw::FORMAT_DF24S8:
- case sw::FORMAT_DF16S8:
- lockable = true;
- break;
- default:
- UNREACHABLE();
- }
-
- es2::Image *surface = new es2::Image(0, width, height, format, multiSampleDepth, lockable, true);
-
- if(!surface)
- {
- ERR("Out of memory");
- return 0;
- }
-
- return surface;
- }
+ return surface;
}
+
diff --git a/src/OpenGL/libGLESv2/exports.map b/src/OpenGL/libGLESv2/exports.map
index cab96a0..4670a61 100644
--- a/src/OpenGL/libGLESv2/exports.map
+++ b/src/OpenGL/libGLESv2/exports.map
@@ -168,13 +168,7 @@
glEGLImageTargetTexture2DOES;
glEGLImageTargetRenderbufferStorageOES;
- # EGL dependencies
- glCreateContext;
- glGetProcAddress;
-
- createFrameBuffer;
- createBackBuffer;
- createDepthStencil;
+ libGLESv2exports;
Register;
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cbp b/src/OpenGL/libGLESv2/libGLESv2.cbp
index 4615472..18b8ab6 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cbp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cbp
@@ -372,6 +372,7 @@
<Unit filename="VertexDataManager.h" />
<Unit filename="exports.map" />
<Unit filename="libGLESv2.cpp" />
+ <Unit filename="libGLESv2.hpp" />
<Unit filename="main.cpp" />
<Unit filename="main.h" />
<Unit filename="mathutil.h" />
diff --git a/src/OpenGL/libGLESv2/libGLESv2.cpp b/src/OpenGL/libGLESv2/libGLESv2.cpp
index 13f6f6d..3277120 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv2.cpp
@@ -37,6 +37,8 @@
#include <cutils/log.h>
#endif
+using namespace es2;
+
typedef std::pair<GLenum, GLenum> InternalFormatTypePair;
typedef std::map<InternalFormatTypePair, GLenum> FormatMap;
@@ -6690,8 +6692,7 @@
{
if(egl::getClientVersion() == 1)
{
- static auto glEGLImageTargetTexture2DOES = (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)es1::getProcAddress("glEGLImageTargetTexture2DOES");
- return glEGLImageTargetTexture2DOES(target, image);
+ return libGLES_CM->glEGLImageTargetTexture2DOES(target, image);
}
TRACE("(GLenum target = 0x%X, GLeglImageOES image = 0x%0.8p)", target, image);
@@ -6741,7 +6742,7 @@
UNIMPLEMENTED();
}
-__eglMustCastToProperFunctionPointerType glGetProcAddress(const char *procname)
+__eglMustCastToProperFunctionPointerType es2GetProcAddress(const char *procname)
{
struct Extension
{
diff --git a/src/OpenGL/libGLESv2/libGLESv2.def b/src/OpenGL/libGLESv2/libGLESv2.def
index 9b42766..0ce826c 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.def
+++ b/src/OpenGL/libGLESv2/libGLESv2.def
@@ -274,12 +274,6 @@
glTexStorage3D @304
glGetInternalformativ @308
- ; EGL dependencies
- glCreateContext
- glGetProcAddress
-
- createFrameBuffer
- createBackBuffer
- createDepthStencil
+ libGLESv2exports
Register
\ No newline at end of file
diff --git a/src/OpenGL/libGLESv2/libGLESv2.hpp b/src/OpenGL/libGLESv2/libGLESv2.hpp
new file mode 100644
index 0000000..15f6528
--- /dev/null
+++ b/src/OpenGL/libGLESv2/libGLESv2.hpp
@@ -0,0 +1,93 @@
+#ifndef libGLESv2_hpp
+#define libGLESv2_hpp
+
+#define GL_API
+#include <GLES/gl.h>
+#define GL_GLEXT_PROTOTYPES
+#include <GLES/glext.h>
+#define EGLAPI
+#include <EGL/egl.h>
+
+#include "Common/SharedLibrary.hpp"
+
+namespace sw
+{
+class FrameBuffer;
+enum Format : unsigned char;
+}
+
+namespace egl
+{
+class Context;
+class Image;
+class Config;
+}
+
+class LibGLESv2exports
+{
+public:
+ LibGLESv2exports();
+
+ egl::Context *(*es2CreateContext)(const egl::Config *config, const egl::Context *shareContext, int clientVersion);
+ __eglMustCastToProperFunctionPointerType (*es2GetProcAddress)(const char *procname);
+ egl::Image *(*createBackBuffer)(int width, int height, const egl::Config *config);
+ egl::Image *(*createDepthStencil)(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
+ sw::FrameBuffer *(*createFrameBuffer)(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);
+};
+
+class LibGLESv2
+{
+public:
+ LibGLESv2()
+ {
+ libGLESv2 = nullptr;
+ libGLESv2exports = nullptr;
+ }
+
+ ~LibGLESv2()
+ {
+ freeLibrary(libGLESv2);
+ }
+
+ operator bool()
+ {
+ return loadExports();
+ }
+
+ LibGLESv2exports *operator->()
+ {
+ return loadExports();
+ }
+
+private:
+ LibGLESv2exports *loadExports()
+ {
+ if(!libGLESv2)
+ {
+ #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);
+
+ if(libGLESv2)
+ {
+ auto libGLESv2exportsProc = (LibGLESv2exports *(*)())getProcAddress(libGLESv2, "libGLESv2exports");
+ libGLESv2exports = libGLESv2exportsProc();
+ }
+ }
+
+ return libGLESv2exports;
+ }
+
+ void *libGLESv2;
+ LibGLESv2exports *libGLESv2exports;
+};
+
+#endif // libGLESv2_hpp
diff --git a/src/OpenGL/libGLESv2/libGLESv2.vcxproj b/src/OpenGL/libGLESv2/libGLESv2.vcxproj
index f47b891..7bba1e6 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.vcxproj
+++ b/src/OpenGL/libGLESv2/libGLESv2.vcxproj
@@ -355,6 +355,7 @@
<ClInclude Include="Framebuffer.h" />
<ClInclude Include="Image.hpp" />
<ClInclude Include="IndexDataManager.h" />
+ <ClInclude Include="libGLESv2.hpp" />
<ClInclude Include="main.h" />
<ClInclude Include="mathutil.h" />
<ClInclude Include="Program.h" />
diff --git a/src/OpenGL/libGLESv2/libGLESv2.vcxproj.filters b/src/OpenGL/libGLESv2/libGLESv2.vcxproj.filters
index 683b67a..fa96948 100644
--- a/src/OpenGL/libGLESv2/libGLESv2.vcxproj.filters
+++ b/src/OpenGL/libGLESv2/libGLESv2.vcxproj.filters
@@ -160,6 +160,9 @@
<ClInclude Include="VertexArray.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="libGLESv2.hpp">
+ <Filter>Header Files</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="libGLESv2.rc" />
diff --git a/src/OpenGL/libGLESv2/libGLESv3.cpp b/src/OpenGL/libGLESv2/libGLESv3.cpp
index 469bbe4..05f2468 100644
--- a/src/OpenGL/libGLESv2/libGLESv3.cpp
+++ b/src/OpenGL/libGLESv2/libGLESv3.cpp
@@ -23,6 +23,8 @@
#include <GLES3/gl3.h>
#include <GLES2/gl2ext.h>
+using namespace es2;
+
typedef std::pair<GLenum, GLenum> InternalFormatTypePair;
typedef std::map<InternalFormatTypePair, GLenum> FormatMap;
diff --git a/src/OpenGL/libGLESv2/main.cpp b/src/OpenGL/libGLESv2/main.cpp
index f185bee..d77b784 100644
--- a/src/OpenGL/libGLESv2/main.cpp
+++ b/src/OpenGL/libGLESv2/main.cpp
@@ -13,7 +13,9 @@
#include "main.h"
+#include "libGLESv2.hpp"
#include "Framebuffer.h"
+#include "libEGL/main.h"
#include "libEGL/Surface.h"
#include "Common/Thread.hpp"
#include "Common/SharedLibrary.hpp"
@@ -37,40 +39,11 @@
TRACE("()");
}
-CONSTRUCTOR static bool glAttachProcess()
+CONSTRUCTOR static void glAttachProcess()
{
TRACE("()");
glAttachThread();
-
- #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);
- egl::getCurrentContext = (egl::Context *(*)())getProcAddress(libEGL, "clientGetCurrentContext");
- egl::getCurrentDisplay = (egl::Display *(*)())getProcAddress(libEGL, "clientGetCurrentDisplay");
-
- #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::getProcAddress = (__eglMustCastToProperFunctionPointerType (*)(const char*))getProcAddress(libGLES_CM, "glGetProcAddress");
-
- return libEGL != 0;
}
DESTRUCTOR static void glDetachProcess()
@@ -78,8 +51,6 @@
TRACE("()");
glDetachThread();
- freeLibrary(libEGL);
- freeLibrary(libGLES_CM);
}
#if defined(_WIN32)
@@ -88,7 +59,7 @@
switch(reason)
{
case DLL_PROCESS_ATTACH:
- return glAttachProcess();
+ glAttachProcess();
break;
case DLL_THREAD_ATTACH:
glAttachThread();
@@ -111,7 +82,7 @@
{
es2::Context *getContext()
{
- egl::Context *context = egl::getCurrentContext();
+ egl::Context *context = libEGL->clientGetCurrentContext();
if(context && (context->getClientVersion() == 2 ||
context->getClientVersion() == 3))
@@ -124,7 +95,7 @@
egl::Display *getDisplay()
{
- return egl::getCurrentDisplay();
+ return libEGL->clientGetCurrentDisplay();
}
Device *getDevice()
@@ -133,17 +104,6 @@
return context ? context->getDevice() : 0;
}
-}
-
-namespace egl
-{
-GLint getClientVersion()
-{
- Context *context = egl::getCurrentContext();
-
- return context ? context->getClientVersion() : 0;
-}
-}
// Records an error code
void error(GLenum errorCode)
@@ -178,17 +138,38 @@
}
}
}
+}
namespace egl
{
- egl::Context *(*getCurrentContext)() = 0;
- egl::Display *(*getCurrentDisplay)() = 0;
-}
-
-namespace es1
+GLint getClientVersion()
{
- __eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname) = 0;
+ Context *context = libEGL->clientGetCurrentContext();
+
+ return context ? context->getClientVersion() : 0;
+}
}
-void *libEGL = 0; // Handle to the libEGL module
-void *libGLES_CM = 0; // Handle to the libGLES_CM module
+egl::Context *es2CreateContext(const egl::Config *config, const egl::Context *shareContext, int clientVersion);
+extern "C" __eglMustCastToProperFunctionPointerType es2GetProcAddress(const char *procname);
+egl::Image *createBackBuffer(int width, int height, const egl::Config *config);
+egl::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
+sw::FrameBuffer *createFrameBuffer(EGLNativeDisplayType display, EGLNativeWindowType window, int width, int height);
+
+LibGLESv2exports::LibGLESv2exports()
+{
+ this->es2CreateContext = ::es2CreateContext;
+ this->es2GetProcAddress = ::es2GetProcAddress;
+ this->createBackBuffer = ::createBackBuffer;
+ this->createDepthStencil = ::createDepthStencil;
+ this->createFrameBuffer = ::createFrameBuffer;
+}
+
+extern "C" LibGLESv2exports *libGLESv2exports()
+{
+ static LibGLESv2exports libGLESv2;
+ return &libGLESv2;
+}
+
+LibEGL libEGL;
+LibGLES_CM libGLES_CM;
\ No newline at end of file
diff --git a/src/OpenGL/libGLESv2/main.h b/src/OpenGL/libGLESv2/main.h
index 09ffb88..de5a2c4 100644
--- a/src/OpenGL/libGLESv2/main.h
+++ b/src/OpenGL/libGLESv2/main.h
@@ -17,7 +17,9 @@
#include "Context.h"
#include "Device.hpp"
#include "common/debug.h"
+#include "libEGL/libEGL.hpp"
#include "libEGL/Display.h"
+#include "libGLES_CM/libGLES_CM.hpp"
#define GL_APICALL
#include <GLES2/gl2.h>
@@ -29,6 +31,16 @@
Context *getContext();
egl::Display *getDisplay();
Device *getDevice();
+
+ void error(GLenum errorCode);
+
+ template<class T>
+ const T &error(GLenum errorCode, const T &returnValue)
+ {
+ error(errorCode);
+
+ return returnValue;
+ }
}
namespace egl
@@ -36,30 +48,7 @@
GLint getClientVersion();
}
-void error(GLenum errorCode);
-
-template<class T>
-const T &error(GLenum errorCode, const T &returnValue)
-{
- error(errorCode);
-
- return returnValue;
-}
-
-// libEGL dependencies
-namespace egl
-{
- extern egl::Context *(*getCurrentContext)();
- extern egl::Display *(*getCurrentDisplay)();
-}
-
-// libGLES_CM dependencies
-namespace es1
-{
- extern __eglMustCastToProperFunctionPointerType (*getProcAddress)(const char *procname);
-}
-
-extern void *libEGL; // Handle to the libEGL module
-extern void *libGLES_CM; // Handle to the libGLES_CM module
+extern LibEGL libEGL;
+extern LibGLES_CM libGLES_CM;
#endif // LIBGLESV2_MAIN_H_
diff --git a/src/Radiance/libRAD/Surface.cpp b/src/Radiance/libRAD/Surface.cpp
index 9573183..2db50dd 100644
--- a/src/Radiance/libRAD/Surface.cpp
+++ b/src/Radiance/libRAD/Surface.cpp
@@ -33,12 +33,13 @@
{
es2::Image *createBackBuffer(int width, int height, const egl::Config *config);
es2::Image *createDepthStencil(unsigned int width, unsigned int height, sw::Format format, int multiSampleDepth, bool discard);
- #if defined(_WIN32)
- sw::FrameBuffer *createFrameBuffer(HDC display, HWND window, int width, int height);
- #else
- sw::FrameBuffer *createFrameBuffer(void *display, Window window, int width, int height);
- #endif
-}
+}
+
+#if defined(_WIN32)
+sw::FrameBuffer *createFrameBuffer(HDC display, HWND window, int width, int height);
+#else
+sw::FrameBuffer *createFrameBuffer(Display *display, Window window, int width, int height);
+#endif
namespace egl
{
diff --git a/src/Radiance/libRAD/libRAD.cbp b/src/Radiance/libRAD/libRAD.cbp
index 4017d4e..23f82a7 100644
--- a/src/Radiance/libRAD/libRAD.cbp
+++ b/src/Radiance/libRAD/libRAD.cbp
@@ -108,6 +108,7 @@
<Add directory="./../../Shader/" />
<Add directory="./../../Main/" />
<Add directory="./../../OpenGL/" />
+ <Add directory="./../../OpenGL/include" />
</Compiler>
<Linker>
<Add option="-Wl,--version-script=./exports.map" />