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