1 // Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #ifndef libGLES_CM_hpp 16 #define libGLES_CM_hpp 17 18 #include <GLES/gl.h> 19 #include <GLES/glext.h> 20 #include <EGL/egl.h> 21 22 #include "Common/SharedLibrary.hpp" 23 24 namespace sw 25 { 26 class FrameBuffer; 27 enum Format : unsigned char; 28 } 29 30 namespace egl 31 { 32 class Display; 33 class Context; 34 class Image; 35 class Config; 36 } 37 38 class LibGLES_CMexports 39 { 40 public: 41 LibGLES_CMexports(); 42 43 void (*glActiveTexture)(GLenum texture); 44 void (*glAlphaFunc)(GLenum func, GLclampf ref); 45 void (*glAlphaFuncx)(GLenum func, GLclampx ref); 46 void (*glBindBuffer)(GLenum target, GLuint buffer); 47 void (*glBindFramebuffer)(GLenum target, GLuint framebuffer); 48 void (*glBindFramebufferOES)(GLenum target, GLuint framebuffer); 49 void (*glBindRenderbufferOES)(GLenum target, GLuint renderbuffer); 50 void (*glBindTexture)(GLenum target, GLuint texture); 51 void (*glBlendEquationOES)(GLenum mode); 52 void (*glBlendEquationSeparateOES)(GLenum modeRGB, GLenum modeAlpha); 53 void (*glBlendFunc)(GLenum sfactor, GLenum dfactor); 54 void (*glBlendFuncSeparateOES)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); 55 void (*glBufferData)(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage); 56 void (*glBufferSubData)(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data); 57 GLenum (*glCheckFramebufferStatusOES)(GLenum target); 58 void (*glClear)(GLbitfield mask); 59 void (*glClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); 60 void (*glClearColorx)(GLclampx red, GLclampx green, GLclampx blue, GLclampx alpha); 61 void (*glClearDepthf)(GLclampf depth); 62 void (*glClearDepthx)(GLclampx depth); 63 void (*glClearStencil)(GLint s); 64 void (*glClientActiveTexture)(GLenum texture); 65 void (*glClipPlanef)(GLenum plane, const GLfloat *equation); 66 void (*glClipPlanex)(GLenum plane, const GLfixed *equation); 67 void (*glColor4f)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); 68 void (*glColor4ub)(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); 69 void (*glColor4x)(GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); 70 void (*glColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); 71 void (*glColorPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); 72 void (*glCompressedTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, 73 GLint border, GLsizei imageSize, const GLvoid* data); 74 void (*glCompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 75 GLenum format, GLsizei imageSize, const GLvoid* data); 76 void (*glCopyTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); 77 void (*glCopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); 78 void (*glCullFace)(GLenum mode); 79 void (*glDeleteBuffers)(GLsizei n, const GLuint* buffers); 80 void (*glDeleteFramebuffersOES)(GLsizei n, const GLuint* framebuffers); 81 void (*glDeleteRenderbuffersOES)(GLsizei n, const GLuint* renderbuffers); 82 void (*glDeleteTextures)(GLsizei n, const GLuint* textures); 83 void (*glDepthFunc)(GLenum func); 84 void (*glDepthMask)(GLboolean flag); 85 void (*glDepthRangex)(GLclampx zNear, GLclampx zFar); 86 void (*glDepthRangef)(GLclampf zNear, GLclampf zFar); 87 void (*glDisable)(GLenum cap); 88 void (*glDisableClientState)(GLenum array); 89 void (*glDrawArrays)(GLenum mode, GLint first, GLsizei count); 90 void (*glDrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices); 91 void (*glEnable)(GLenum cap); 92 void (*glEnableClientState)(GLenum array); 93 void (*glFinish)(void); 94 void (*glFlush)(void); 95 void (*glFramebufferRenderbufferOES)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); 96 void (*glFramebufferTexture2DOES)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); 97 void (*glFogf)(GLenum pname, GLfloat param); 98 void (*glFogfv)(GLenum pname, const GLfloat *params); 99 void (*glFogx)(GLenum pname, GLfixed param); 100 void (*glFogxv)(GLenum pname, const GLfixed *params); 101 void (*glFrontFace)(GLenum mode); 102 void (*glFrustumf)(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); 103 void (*glFrustumx)(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); 104 void (*glGenerateMipmapOES)(GLenum target); 105 void (*glGenBuffers)(GLsizei n, GLuint* buffers); 106 void (*glGenFramebuffersOES)(GLsizei n, GLuint* framebuffers); 107 void (*glGenRenderbuffersOES)(GLsizei n, GLuint* renderbuffers); 108 void (*glGenTextures)(GLsizei n, GLuint* textures); 109 void (*glGetRenderbufferParameterivOES)(GLenum target, GLenum pname, GLint* params); 110 void (*glGetBooleanv)(GLenum pname, GLboolean* params); 111 void (*glGetBufferParameteriv)(GLenum target, GLenum pname, GLint* params); 112 void (*glGetClipPlanef)(GLenum pname, GLfloat eqn[4]); 113 void (*glGetClipPlanex)(GLenum pname, GLfixed eqn[4]); 114 GLenum (*glGetError)(void); 115 void (*glGetFixedv)(GLenum pname, GLfixed *params); 116 void (*glGetFloatv)(GLenum pname, GLfloat* params); 117 void (*glGetFramebufferAttachmentParameterivOES)(GLenum target, GLenum attachment, GLenum pname, GLint* params); 118 void (*glGetIntegerv)(GLenum pname, GLint* params); 119 void (*glGetLightfv)(GLenum light, GLenum pname, GLfloat *params); 120 void (*glGetLightxv)(GLenum light, GLenum pname, GLfixed *params); 121 void (*glGetMaterialfv)(GLenum face, GLenum pname, GLfloat *params); 122 void (*glGetMaterialxv)(GLenum face, GLenum pname, GLfixed *params); 123 void (*glGetPointerv)(GLenum pname, GLvoid **params); 124 const GLubyte* (*glGetString)(GLenum name); 125 void (*glGetTexParameterfv)(GLenum target, GLenum pname, GLfloat* params); 126 void (*glGetTexParameteriv)(GLenum target, GLenum pname, GLint* params); 127 void (*glGetTexEnvfv)(GLenum env, GLenum pname, GLfloat *params); 128 void (*glGetTexEnviv)(GLenum env, GLenum pname, GLint *params); 129 void (*glGetTexEnvxv)(GLenum env, GLenum pname, GLfixed *params); 130 void (*glGetTexParameterxv)(GLenum target, GLenum pname, GLfixed *params); 131 void (*glHint)(GLenum target, GLenum mode); 132 GLboolean (*glIsBuffer)(GLuint buffer); 133 GLboolean (*glIsEnabled)(GLenum cap); 134 GLboolean (*glIsFramebufferOES)(GLuint framebuffer); 135 GLboolean (*glIsTexture)(GLuint texture); 136 GLboolean (*glIsRenderbufferOES)(GLuint renderbuffer); 137 void (*glLightModelf)(GLenum pname, GLfloat param); 138 void (*glLightModelfv)(GLenum pname, const GLfloat *params); 139 void (*glLightModelx)(GLenum pname, GLfixed param); 140 void (*glLightModelxv)(GLenum pname, const GLfixed *params); 141 void (*glLightf)(GLenum light, GLenum pname, GLfloat param); 142 void (*glLightfv)(GLenum light, GLenum pname, const GLfloat *params); 143 void (*glLightx)(GLenum light, GLenum pname, GLfixed param); 144 void (*glLightxv)(GLenum light, GLenum pname, const GLfixed *params); 145 void (*glLineWidth)(GLfloat width); 146 void (*glLineWidthx)(GLfixed width); 147 void (*glLoadIdentity)(void); 148 void (*glLoadMatrixf)(const GLfloat *m); 149 void (*glLoadMatrixx)(const GLfixed *m); 150 void (*glLogicOp)(GLenum opcode); 151 void (*glMaterialf)(GLenum face, GLenum pname, GLfloat param); 152 void (*glMaterialfv)(GLenum face, GLenum pname, const GLfloat *params); 153 void (*glMaterialx)(GLenum face, GLenum pname, GLfixed param); 154 void (*glMaterialxv)(GLenum face, GLenum pname, const GLfixed *params); 155 void (*glMatrixMode)(GLenum mode); 156 void (*glMultMatrixf)(const GLfloat *m); 157 void (*glMultMatrixx)(const GLfixed *m); 158 void (*glMultiTexCoord4f)(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); 159 void (*glMultiTexCoord4x)(GLenum target, GLfixed s, GLfixed t, GLfixed r, GLfixed q); 160 void (*glNormal3f)(GLfloat nx, GLfloat ny, GLfloat nz); 161 void (*glNormal3x)(GLfixed nx, GLfixed ny, GLfixed nz); 162 void (*glNormalPointer)(GLenum type, GLsizei stride, const GLvoid *pointer); 163 void (*glOrthof)(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat zNear, GLfloat zFar); 164 void (*glOrthox)(GLfixed left, GLfixed right, GLfixed bottom, GLfixed top, GLfixed zNear, GLfixed zFar); 165 void (*glPixelStorei)(GLenum pname, GLint param); 166 void (*glPointParameterf)(GLenum pname, GLfloat param); 167 void (*glPointParameterfv)(GLenum pname, const GLfloat *params); 168 void (*glPointParameterx)(GLenum pname, GLfixed param); 169 void (*glPointParameterxv)(GLenum pname, const GLfixed *params); 170 void (*glPointSize)(GLfloat size); 171 void (*glPointSizePointerOES)(GLenum type, GLsizei stride, const GLvoid *pointer); 172 void (*glPointSizex)(GLfixed size); 173 void (*glPolygonOffset)(GLfloat factor, GLfloat units); 174 void (*glPolygonOffsetx)(GLfixed factor, GLfixed units); 175 void (*glPopMatrix)(void); 176 void (*glPushMatrix)(void); 177 void (*glReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels); 178 void (*glRenderbufferStorageOES)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); 179 void (*glRotatef)(GLfloat angle, GLfloat x, GLfloat y, GLfloat z); 180 void (*glRotatex)(GLfixed angle, GLfixed x, GLfixed y, GLfixed z); 181 void (*glSampleCoverage)(GLclampf value, GLboolean invert); 182 void (*glSampleCoveragex)(GLclampx value, GLboolean invert); 183 void (*glScalef)(GLfloat x, GLfloat y, GLfloat z); 184 void (*glScalex)(GLfixed x, GLfixed y, GLfixed z); 185 void (*glScissor)(GLint x, GLint y, GLsizei width, GLsizei height); 186 void (*glShadeModel)(GLenum mode); 187 void (*glStencilFunc)(GLenum func, GLint ref, GLuint mask); 188 void (*glStencilMask)(GLuint mask); 189 void (*glStencilOp)(GLenum fail, GLenum zfail, GLenum zpass); 190 void (*glTexCoordPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); 191 void (*glTexEnvf)(GLenum target, GLenum pname, GLfloat param); 192 void (*glTexEnvfv)(GLenum target, GLenum pname, const GLfloat *params); 193 void (*glTexEnvi)(GLenum target, GLenum pname, GLint param); 194 void (*glTexEnvx)(GLenum target, GLenum pname, GLfixed param); 195 void (*glTexEnviv)(GLenum target, GLenum pname, const GLint *params); 196 void (*glTexEnvxv)(GLenum target, GLenum pname, const GLfixed *params); 197 void (*glTexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, 198 GLint border, GLenum format, GLenum type, const GLvoid* pixels); 199 void (*glTexParameterf)(GLenum target, GLenum pname, GLfloat param); 200 void (*glTexParameterfv)(GLenum target, GLenum pname, const GLfloat* params); 201 void (*glTexParameteri)(GLenum target, GLenum pname, GLint param); 202 void (*glTexParameteriv)(GLenum target, GLenum pname, const GLint* params); 203 void (*glTexParameterx)(GLenum target, GLenum pname, GLfixed param); 204 void (*glTexParameterxv)(GLenum target, GLenum pname, const GLfixed *params); 205 void (*glTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, 206 GLenum format, GLenum type, const GLvoid* pixels); 207 void (*glTranslatef)(GLfloat x, GLfloat y, GLfloat z); 208 void (*glTranslatex)(GLfixed x, GLfixed y, GLfixed z); 209 void (*glVertexPointer)(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); 210 void (*glViewport)(GLint x, GLint y, GLsizei width, GLsizei height); 211 void (*glEGLImageTargetTexture2DOES)(GLenum target, GLeglImageOES image); 212 void (*glEGLImageTargetRenderbufferStorageOES)(GLenum target, GLeglImageOES image); 213 void (*glDrawTexsOES)(GLshort x, GLshort y, GLshort z, GLshort width, GLshort height); 214 void (*glDrawTexiOES)(GLint x, GLint y, GLint z, GLint width, GLint height); 215 void (*glDrawTexxOES)(GLfixed x, GLfixed y, GLfixed z, GLfixed width, GLfixed height); 216 void (*glDrawTexsvOES)(const GLshort *coords); 217 void (*glDrawTexivOES)(const GLint *coords); 218 void (*glDrawTexxvOES)(const GLfixed *coords); 219 void (*glDrawTexfOES)(GLfloat x, GLfloat y, GLfloat z, GLfloat width, GLfloat height); 220 void (*glDrawTexfvOES)(const GLfloat *coords); 221 222 egl::Context *(*es1CreateContext)(egl::Display *display, const egl::Context *shareContext, const egl::Config *config); 223 __eglMustCastToProperFunctionPointerType (*es1GetProcAddress)(const char *procname); 224 egl::Image *(*createBackBuffer)(int width, int height, sw::Format format, int multiSampleDepth); 225 egl::Image *(*createDepthStencil)(int width, int height, sw::Format format, int multiSampleDepth); 226 sw::FrameBuffer *(*createFrameBuffer)(void *nativeDisplay, EGLNativeWindowType window, int width, int height); 227 }; 228 229 class LibGLES_CM 230 { 231 public: 232 LibGLES_CM() 233 { 234 } 235 236 ~LibGLES_CM() 237 { 238 freeLibrary(libGLES_CM); 239 } 240 241 operator bool() 242 { 243 return loadExports() != nullptr; 244 } 245 246 LibGLES_CMexports *operator->() 247 { 248 return loadExports(); 249 } 250 251 private: 252 LibGLES_CMexports *loadExports() 253 { 254 if(!loadLibraryAttempted && !libGLES_CM) 255 { 256 #if defined(_WIN32) 257 #if defined(__LP64__) 258 const char *libGLES_CM_lib[] = {"libGLES_CM.dll", "lib64GLES_CM_translator.dll"}; 259 #else 260 const char *libGLES_CM_lib[] = {"libGLES_CM.dll", "libGLES_CM_translator.dll"}; 261 #endif 262 #elif defined(__ANDROID__) 263 const char *libGLES_CM_lib[] = {"libGLESv1_CM_swiftshader.so", "libGLESv1_CM_swiftshader.so"}; 264 #elif defined(__linux__) 265 #if defined(__LP64__) 266 const char *libGLES_CM_lib[] = {"lib64GLES_CM_translator.so", "libGLES_CM.so.1", "libGLES_CM.so"}; 267 #else 268 const char *libGLES_CM_lib[] = {"libGLES_CM_translator.so", "libGLES_CM.so.1", "libGLES_CM.so"}; 269 #endif 270 #elif defined(__APPLE__) 271 #if defined(__LP64__) 272 const char *libGLES_CM_lib[] = {"lib64GLES_CM_translator.dylib", "libGLES_CM.dylib"}; 273 #else 274 const char *libGLES_CM_lib[] = {"libGLES_CM_translator.dylib", "libGLES_CM.dylib"}; 275 #endif 276 #elif defined(__Fuchsia__) 277 const char *libGLES_CM_lib[] = {"libGLES_CM.so"}; 278 #else 279 #error "libGLES_CM::loadExports unimplemented for this platform" 280 #endif 281 282 std::string directory = getModuleDirectory(); 283 libGLES_CM = loadLibrary(directory, libGLES_CM_lib, "libGLES_CM_swiftshader"); 284 285 if(libGLES_CM) 286 { 287 auto libGLES_CM_swiftshader = (LibGLES_CMexports *(*)())getProcAddress(libGLES_CM, "libGLES_CM_swiftshader"); 288 libGLES_CMexports = libGLES_CM_swiftshader(); 289 } 290 291 loadLibraryAttempted = true; 292 } 293 294 return libGLES_CMexports; 295 } 296 297 void *libGLES_CM = nullptr; 298 LibGLES_CMexports *libGLES_CMexports = nullptr; 299 bool loadLibraryAttempted = false; 300 }; 301 302 #endif // libGLES_CM_hpp 303