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/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