| // Copyright 2016 The SwiftShader Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef libGLESv2_hpp |
| #define libGLESv2_hpp |
| |
| #include <GLES/gl.h> |
| #include <GLES/glext.h> |
| #include <EGL/egl.h> |
| |
| #include "Common/SharedLibrary.hpp" |
| |
| namespace sw |
| { |
| class FrameBuffer; |
| enum Format : unsigned char; |
| } |
| |
| namespace egl |
| { |
| class Display; |
| class Context; |
| class Image; |
| class Config; |
| class ClientBuffer; |
| } |
| |
| class LibGLESv2exports |
| { |
| public: |
| LibGLESv2exports(); |
| |
| void (*glActiveTexture)(GLenum texture); |
| void (*glAttachShader)(GLuint program, GLuint shader); |
| void (*glBeginQueryEXT)(GLenum target, GLuint name); |
| void (*glBindAttribLocation)(GLuint program, GLuint index, const GLchar* name); |
| void (*glBindBuffer)(GLenum target, GLuint buffer); |
| void (*glBindFramebuffer)(GLenum target, GLuint framebuffer); |
| void (*glBindRenderbuffer)(GLenum target, GLuint renderbuffer); |
| void (*glBindTexture)(GLenum target, GLuint texture); |
| void (*glBlendColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); |
| void (*glBlendEquation)(GLenum mode); |
| void (*glBlendEquationSeparate)(GLenum modeRGB, GLenum modeAlpha); |
| void (*glBlendFunc)(GLenum sfactor, GLenum dfactor); |
| void (*glBlendFuncSeparate)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); |
| void (*glBufferData)(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage); |
| void (*glBufferSubData)(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data); |
| GLenum (*glCheckFramebufferStatus)(GLenum target); |
| void (*glClear)(GLbitfield mask); |
| void (*glClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); |
| void (*glClearDepthf)(GLclampf depth); |
| void (*glClearStencil)(GLint s); |
| void (*glColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); |
| void (*glCompileShader)(GLuint shader); |
| void (*glCompressedTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, |
| GLint border, GLsizei imageSize, const GLvoid* data); |
| void (*glCompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, |
| GLenum format, GLsizei imageSize, const GLvoid* data); |
| void (*glCopyTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); |
| void (*glCopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); |
| GLuint (*glCreateProgram)(void); |
| GLuint (*glCreateShader)(GLenum type); |
| void (*glCullFace)(GLenum mode); |
| void (*glDeleteBuffers)(GLsizei n, const GLuint* buffers); |
| void (*glDeleteFencesNV)(GLsizei n, const GLuint* fences); |
| void (*glDeleteFramebuffers)(GLsizei n, const GLuint* framebuffers); |
| void (*glDeleteProgram)(GLuint program); |
| void (*glDeleteQueriesEXT)(GLsizei n, const GLuint *ids); |
| void (*glDeleteRenderbuffers)(GLsizei n, const GLuint* renderbuffers); |
| void (*glDeleteShader)(GLuint shader); |
| void (*glDeleteTextures)(GLsizei n, const GLuint* textures); |
| void (*glDepthFunc)(GLenum func); |
| void (*glDepthMask)(GLboolean flag); |
| void (*glDepthRangef)(GLclampf zNear, GLclampf zFar); |
| void (*glDetachShader)(GLuint program, GLuint shader); |
| void (*glDisable)(GLenum cap); |
| void (*glDisableVertexAttribArray)(GLuint index); |
| void (*glDrawArrays)(GLenum mode, GLint first, GLsizei count); |
| void (*glDrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices); |
| void (*glDrawArraysInstancedEXT)(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount); |
| void (*glDrawElementsInstancedEXT)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instanceCount); |
| void (*glVertexAttribDivisorEXT)(GLuint index, GLuint divisor); |
| void (*glDrawArraysInstancedANGLE)(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount); |
| void (*glDrawElementsInstancedANGLE)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instanceCount); |
| void (*glVertexAttribDivisorANGLE)(GLuint index, GLuint divisor); |
| void (*glEnable)(GLenum cap); |
| void (*glEnableVertexAttribArray)(GLuint index); |
| void (*glEndQueryEXT)(GLenum target); |
| void (*glFinishFenceNV)(GLuint fence); |
| void (*glFinish)(void); |
| void (*glFlush)(void); |
| void (*glFramebufferRenderbuffer)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); |
| void (*glFramebufferTexture2D)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); |
| void (*glFrontFace)(GLenum mode); |
| void (*glGenBuffers)(GLsizei n, GLuint* buffers); |
| void (*glGenerateMipmap)(GLenum target); |
| void (*glGenFencesNV)(GLsizei n, GLuint* fences); |
| void (*glGenFramebuffers)(GLsizei n, GLuint* framebuffers); |
| void (*glGenQueriesEXT)(GLsizei n, GLuint* ids); |
| void (*glGenRenderbuffers)(GLsizei n, GLuint* renderbuffers); |
| void (*glGenTextures)(GLsizei n, GLuint* textures); |
| void (*glGetActiveAttrib)(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); |
| void (*glGetActiveUniform)(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name); |
| void (*glGetAttachedShaders)(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders); |
| int (*glGetAttribLocation)(GLuint program, const GLchar* name); |
| void (*glGetBooleanv)(GLenum pname, GLboolean* params); |
| void (*glGetBufferParameteriv)(GLenum target, GLenum pname, GLint* params); |
| GLenum (*glGetError)(void); |
| void (*glGetFenceivNV)(GLuint fence, GLenum pname, GLint *params); |
| void (*glGetFloatv)(GLenum pname, GLfloat* params); |
| void (*glGetFramebufferAttachmentParameteriv)(GLenum target, GLenum attachment, GLenum pname, GLint* params); |
| GLenum (*glGetGraphicsResetStatusEXT)(void); |
| void (*glGetIntegerv)(GLenum pname, GLint* params); |
| void (*glGetProgramiv)(GLuint program, GLenum pname, GLint* params); |
| void (*glGetProgramInfoLog)(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog); |
| void (*glGetQueryivEXT)(GLenum target, GLenum pname, GLint *params); |
| void (*glGetQueryObjectuivEXT)(GLuint name, GLenum pname, GLuint *params); |
| void (*glGetRenderbufferParameteriv)(GLenum target, GLenum pname, GLint* params); |
| void (*glGetShaderiv)(GLuint shader, GLenum pname, GLint* params); |
| void (*glGetShaderInfoLog)(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog); |
| void (*glGetShaderPrecisionFormat)(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision); |
| void (*glGetShaderSource)(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source); |
| const GLubyte* (*glGetString)(GLenum name); |
| void (*glGetTexParameterfv)(GLenum target, GLenum pname, GLfloat* params); |
| void (*glGetTexParameteriv)(GLenum target, GLenum pname, GLint* params); |
| void (*glGetnUniformfvEXT)(GLuint program, GLint location, GLsizei bufSize, GLfloat* params); |
| void (*glGetUniformfv)(GLuint program, GLint location, GLfloat* params); |
| void (*glGetnUniformivEXT)(GLuint program, GLint location, GLsizei bufSize, GLint* params); |
| void (*glGetUniformiv)(GLuint program, GLint location, GLint* params); |
| int (*glGetUniformLocation)(GLuint program, const GLchar* name); |
| void (*glGetVertexAttribfv)(GLuint index, GLenum pname, GLfloat* params); |
| void (*glGetVertexAttribiv)(GLuint index, GLenum pname, GLint* params); |
| void (*glGetVertexAttribPointerv)(GLuint index, GLenum pname, GLvoid** pointer); |
| void (*glHint)(GLenum target, GLenum mode); |
| GLboolean (*glIsBuffer)(GLuint buffer); |
| GLboolean (*glIsEnabled)(GLenum cap); |
| GLboolean (*glIsFenceNV)(GLuint fence); |
| GLboolean (*glIsFramebuffer)(GLuint framebuffer); |
| GLboolean (*glIsProgram)(GLuint program); |
| GLboolean (*glIsQueryEXT)(GLuint name); |
| GLboolean (*glIsRenderbuffer)(GLuint renderbuffer); |
| GLboolean (*glIsShader)(GLuint shader); |
| GLboolean (*glIsTexture)(GLuint texture); |
| void (*glLineWidth)(GLfloat width); |
| void (*glLinkProgram)(GLuint program); |
| void (*glPixelStorei)(GLenum pname, GLint param); |
| void (*glPolygonOffset)(GLfloat factor, GLfloat units); |
| void (*glReadnPixelsEXT)(GLint x, GLint y, GLsizei width, GLsizei height, |
| GLenum format, GLenum type, GLsizei bufSize, GLvoid *data); |
| void (*glReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels); |
| void (*glReleaseShaderCompiler)(void); |
| void (*glRenderbufferStorageMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); |
| void (*glRenderbufferStorageMultisampleANGLE)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); |
| void (*glRenderbufferStorage)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); |
| void (*glSampleCoverage)(GLclampf value, GLboolean invert); |
| void (*glSetFenceNV)(GLuint fence, GLenum condition); |
| void (*glScissor)(GLint x, GLint y, GLsizei width, GLsizei height); |
| void (*glShaderBinary)(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length); |
| void (*glShaderSource)(GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length); |
| void (*glStencilFunc)(GLenum func, GLint ref, GLuint mask); |
| void (*glStencilFuncSeparate)(GLenum face, GLenum func, GLint ref, GLuint mask); |
| void (*glStencilMask)(GLuint mask); |
| void (*glStencilMaskSeparate)(GLenum face, GLuint mask); |
| void (*glStencilOp)(GLenum fail, GLenum zfail, GLenum zpass); |
| void (*glStencilOpSeparate)(GLenum face, GLenum fail, GLenum zfail, GLenum zpass); |
| GLboolean (*glTestFenceNV)(GLuint fence); |
| void (*glTexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, |
| GLint border, GLenum format, GLenum type, const GLvoid* pixels); |
| void (*glTexParameterf)(GLenum target, GLenum pname, GLfloat param); |
| void (*glTexParameterfv)(GLenum target, GLenum pname, const GLfloat* params); |
| void (*glTexParameteri)(GLenum target, GLenum pname, GLint param); |
| void (*glTexParameteriv)(GLenum target, GLenum pname, const GLint* params); |
| void (*glTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, |
| GLenum format, GLenum type, const GLvoid* pixels); |
| void (*glUniform1f)(GLint location, GLfloat x); |
| void (*glUniform1fv)(GLint location, GLsizei count, const GLfloat* v); |
| void (*glUniform1i)(GLint location, GLint x); |
| void (*glUniform1iv)(GLint location, GLsizei count, const GLint* v); |
| void (*glUniform2f)(GLint location, GLfloat x, GLfloat y); |
| void (*glUniform2fv)(GLint location, GLsizei count, const GLfloat* v); |
| void (*glUniform2i)(GLint location, GLint x, GLint y); |
| void (*glUniform2iv)(GLint location, GLsizei count, const GLint* v); |
| void (*glUniform3f)(GLint location, GLfloat x, GLfloat y, GLfloat z); |
| void (*glUniform3fv)(GLint location, GLsizei count, const GLfloat* v); |
| void (*glUniform3i)(GLint location, GLint x, GLint y, GLint z); |
| void (*glUniform3iv)(GLint location, GLsizei count, const GLint* v); |
| void (*glUniform4f)(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); |
| void (*glUniform4fv)(GLint location, GLsizei count, const GLfloat* v); |
| void (*glUniform4i)(GLint location, GLint x, GLint y, GLint z, GLint w); |
| void (*glUniform4iv)(GLint location, GLsizei count, const GLint* v); |
| void (*glUniformMatrix2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); |
| void (*glUniformMatrix3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); |
| void (*glUniformMatrix4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); |
| void (*glUseProgram)(GLuint program); |
| void (*glValidateProgram)(GLuint program); |
| void (*glVertexAttrib1f)(GLuint index, GLfloat x); |
| void (*glVertexAttrib1fv)(GLuint index, const GLfloat* values); |
| void (*glVertexAttrib2f)(GLuint index, GLfloat x, GLfloat y); |
| void (*glVertexAttrib2fv)(GLuint index, const GLfloat* values); |
| void (*glVertexAttrib3f)(GLuint index, GLfloat x, GLfloat y, GLfloat z); |
| void (*glVertexAttrib3fv)(GLuint index, const GLfloat* values); |
| void (*glVertexAttrib4f)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); |
| void (*glVertexAttrib4fv)(GLuint index, const GLfloat* values); |
| void (*glVertexAttribPointer)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr); |
| void (*glViewport)(GLint x, GLint y, GLsizei width, GLsizei height); |
| void (*glBlitFramebufferNV)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); |
| void (*glBlitFramebufferANGLE)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, |
| GLbitfield mask, GLenum filter); |
| void (*glTexImage3DOES)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, |
| GLint border, GLenum format, GLenum type, const GLvoid* pixels); |
| void (*glTexSubImage3DOES)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); |
| void (*glCopyTexSubImage3DOES)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); |
| void (*glCompressedTexImage3DOES)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); |
| void (*glCompressedTexSubImage3DOES)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); |
| void (*glFramebufferTexture3DOES)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); |
| void (*glEGLImageTargetTexture2DOES)(GLenum target, GLeglImageOES image); |
| void (*glEGLImageTargetRenderbufferStorageOES)(GLenum target, GLeglImageOES image); |
| GLboolean (*glIsRenderbufferOES)(GLuint renderbuffer); |
| void (*glBindRenderbufferOES)(GLenum target, GLuint renderbuffer); |
| void (*glDeleteRenderbuffersOES)(GLsizei n, const GLuint* renderbuffers); |
| void (*glGenRenderbuffersOES)(GLsizei n, GLuint* renderbuffers); |
| void (*glRenderbufferStorageOES)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); |
| void (*glGetRenderbufferParameterivOES)(GLenum target, GLenum pname, GLint* params); |
| GLboolean (*glIsFramebufferOES)(GLuint framebuffer); |
| void (*glBindFramebufferOES)(GLenum target, GLuint framebuffer); |
| void (*glDeleteFramebuffersOES)(GLsizei n, const GLuint* framebuffers); |
| void (*glGenFramebuffersOES)(GLsizei n, GLuint* framebuffers); |
| GLenum (*glCheckFramebufferStatusOES)(GLenum target); |
| void (*glFramebufferRenderbufferOES)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); |
| void (*glFramebufferTexture2DOES)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); |
| void (*glGetFramebufferAttachmentParameterivOES)(GLenum target, GLenum attachment, GLenum pname, GLint* params); |
| void (*glGenerateMipmapOES)(GLenum target); |
| void (*glDrawBuffersEXT)(GLsizei n, const GLenum *bufs); |
| |
| egl::Context *(*es2CreateContext)(egl::Display *display, const egl::Context *shareContext, const egl::Config *config); |
| __eglMustCastToProperFunctionPointerType (*es2GetProcAddress)(const char *procname); |
| egl::Image *(*createBackBuffer)(int width, int height, sw::Format format, int multiSampleDepth); |
| egl::Image *(*createBackBufferFromClientBuffer)(const egl::ClientBuffer& clientBuffer); |
| egl::Image *(*createDepthStencil)(int width, int height, sw::Format format, int multiSampleDepth); |
| sw::FrameBuffer *(*createFrameBuffer)(void *nativeDisplay, EGLNativeWindowType window, int width, int height); |
| }; |
| |
| class LibGLESv2 |
| { |
| public: |
| LibGLESv2() |
| { |
| } |
| |
| ~LibGLESv2() |
| { |
| freeLibrary(libGLESv2); |
| } |
| |
| operator bool() |
| { |
| return loadExports() != nullptr; |
| } |
| |
| LibGLESv2exports *operator->() |
| { |
| return loadExports(); |
| } |
| |
| private: |
| LibGLESv2exports *loadExports() |
| { |
| if(!loadLibraryAttempted && !libGLESv2) |
| { |
| #if defined(_WIN32) |
| #if defined(__LP64__) |
| const char *libGLESv2_lib[] = {"libGLESv2.dll", "lib64GLES_V2_translator.dll"}; |
| #else |
| const char *libGLESv2_lib[] = {"libGLESv2.dll", "libGLES_V2_translator.dll"}; |
| #endif |
| #elif defined(__ANDROID__) |
| const char *libGLESv2_lib[] = {"libGLESv2_swiftshader.so", "libGLESv2_swiftshader.so"}; |
| #elif defined(__linux__) |
| #if 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 |
| #elif defined(__APPLE__) |
| #if defined(__LP64__) |
| const char *libGLESv2_lib[] = {"libswiftshader_libGLESv2.dylib", "lib64GLES_V2_translator.dylib", "libGLESv2.dylib"}; |
| #else |
| const char *libGLESv2_lib[] = {"libswiftshader_libGLESv2.dylib", "libGLES_V2_translator.dylib", "libGLESv2.dylib"}; |
| #endif |
| #elif defined(__Fuchsia__) |
| const char *libGLESv2_lib[] = {"libswiftshader_libGLESv2.so", "libGLESv2.so"}; |
| #else |
| #error "libGLESv2::loadExports unimplemented for this platform" |
| #endif |
| |
| std::string directory = getModuleDirectory(); |
| libGLESv2 = loadLibrary(directory, libGLESv2_lib, "libGLESv2_swiftshader"); |
| |
| if(libGLESv2) |
| { |
| auto libGLESv2_swiftshader = (LibGLESv2exports *(*)())getProcAddress(libGLESv2, "libGLESv2_swiftshader"); |
| libGLESv2exports = libGLESv2_swiftshader(); |
| } |
| |
| loadLibraryAttempted = true; |
| } |
| |
| return libGLESv2exports; |
| } |
| |
| void *libGLESv2 = nullptr; |
| LibGLESv2exports *libGLESv2exports = nullptr; |
| bool loadLibraryAttempted = false; |
| }; |
| |
| #endif // libGLESv2_hpp |