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_