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