blob: e6ebe9a5f22e001fecc7422771d3eb931742706e [file] [log] [blame]
// 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[] = {"libswiftshader_libGLESv2.dll", "libGLESv2.dll", "lib64GLES_V2_translator.dll"};
#else
const char *libGLESv2_lib[] = {"libswiftshader_libGLESv2.dll", "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