33 using eglChooseConfig_func = EGLBoolean EGLAPIENTRY (*)(EGLDisplay dpy,
const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
34 using eglCreateContext_func = EGLContext EGLAPIENTRY (*)(EGLDisplay dpy, EGLConfig config, EGLContext share_context,
const EGLint *attrib_list);
37 using eglInitialize_func = EGLBoolean EGLAPIENTRY (*)(EGLDisplay dpy, EGLint *major, EGLint *minor);
38 using eglMakeCurrent_func = EGLBoolean EGLAPIENTRY (*)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx);
54 using glShaderSource_func =
void GL_APIENTRY (*)(GLuint shader, GLsizei count,
const GLchar *
const *string,
const GLint *length);
58 using glBufferData_func =
void GL_APIENTRY (*)(GLenum target, GLsizeiptr size,
const GLvoid *data, GLenum usage);
77 using glTexImage2D_func =
void GL_APIENTRY (*)(GLenum target, GLint
level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum
type,
78 const GLvoid *pixels);
89 void *egl_handle = dlopen(
"libEGL.so", RTLD_LAZY | RTLD_LOCAL);
90 void *glesv2_handle = dlopen(
"libGLESv2.so", RTLD_LAZY | RTLD_LOCAL);
91 void *glesv3_handle = dlopen(
"libGLESv3.so", RTLD_LAZY | RTLD_LOCAL);
92 if(egl_handle ==
nullptr)
94 std::cerr <<
"Can't load libEGL.so: " << dlerror() << std::endl;
99 #define EGL_ENTRY(_api) _api = reinterpret_cast<_api##_func>(dlsym(egl_handle, #_api)); 100 #include "./egl_entries.in" 106 #define EGL_ENTRY(_api) \ 107 if((_api) == nullptr) \ 108 (_api) = reinterpret_cast<_api##_func>(eglGetProcAddress(#_api)); 109 #include "./egl_entries.in" 113 #define GL_ENTRY(_api) _api = reinterpret_cast<_api##_func>(eglGetProcAddress(#_api)); 114 #include "./gl_entries.in" 118 std::vector<void *> handles = { glesv3_handle, glesv2_handle };
119 for(
auto &handle : handles)
121 if(handle !=
nullptr)
124 #define GL_ENTRY(_api) \ 125 if((_api) == nullptr) \ 126 (_api) = reinterpret_cast<_api##_func>(dlsym(handle, #_api)); 127 #include "./gl_entries.in" 135 bool _initialized =
false;
138 static GLESSymbols &
get()
140 static GLESSymbols symbols = GLESSymbols();
141 if(!symbols._initialized)
143 symbols._initialized =
true;
152 #define EGL_ENTRY(_api) _api##_func _api = nullptr; 153 #define GL_ENTRY(_api) EGL_ENTRY(_api) 154 #include "./egl_entries.in" 155 #include "./gl_entries.in" 162 return GLESSymbols::get().glDispatchCompute !=
nullptr;
167 auto func = GLESSymbols::get().eglGetProcAddress;
170 return func(procname);
180 auto func = GLESSymbols::get().eglBindAPI;
191 EGLBoolean EGLAPIENTRY
eglChooseConfig(EGLDisplay dpy,
const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config)
193 auto func = GLESSymbols::get().eglChooseConfig;
196 return func(dpy, attrib_list, configs, config_size, num_config);
204 EGLContext EGLAPIENTRY
eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context,
const EGLint *attrib_list)
206 auto func = GLESSymbols::get().eglCreateContext;
209 return func(dpy, config, share_context, attrib_list);
219 auto func = GLESSymbols::get().eglDestroyContext;
222 return func(dpy, ctx);
232 auto func = GLESSymbols::get().eglGetDisplay;
235 return func(display_id);
243 EGLBoolean EGLAPIENTRY
eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
245 auto func = GLESSymbols::get().eglInitialize;
248 return func(dpy, major, minor);
256 EGLBoolean EGLAPIENTRY
eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
258 auto func = GLESSymbols::get().eglMakeCurrent;
261 return func(dpy, draw, read, ctx);
271 auto func = GLESSymbols::get().eglTerminate;
284 auto func = GLESSymbols::get().eglGetError;
297 auto func = GLESSymbols::get().eglQueryString;
300 return func(dpy, name);
310 auto func = GLESSymbols::get().glAttachShader;
313 return func(program, shader);
323 auto func = GLESSymbols::get().glCompileShader;
336 auto func = GLESSymbols::get().glCreateProgram;
349 auto func = GLESSymbols::get().glCreateShader;
362 auto func = GLESSymbols::get().glDeleteProgram;
365 return func(program);
375 auto func = GLESSymbols::get().glDeleteShader;
388 auto func = GLESSymbols::get().glDetachShader;
391 return func(program, shader);
401 auto func = GLESSymbols::get().glGetProgramInfoLog;
404 return func(program, bufSize, length, infoLog);
414 auto func = GLESSymbols::get().glGetProgramiv;
417 return func(program, pname, params);
425 void GL_APIENTRY
glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
427 auto func = GLESSymbols::get().glGetShaderInfoLog;
430 return func(shader, bufSize, length, infoLog);
440 auto func = GLESSymbols::get().glGetShaderiv;
443 return func(shader, pname, params);
453 auto func = GLESSymbols::get().glLinkProgram;
456 return func(program);
464 void GL_APIENTRY
glShaderSource(GLuint shader, GLsizei count,
const GLchar *
const *
string,
const GLint *length)
466 auto func = GLESSymbols::get().glShaderSource;
469 return func(shader, count,
string, length);
479 auto func = GLESSymbols::get().glUseProgram;
482 return func(program);
492 auto func = GLESSymbols::get().glBindBuffer;
495 return func(target, buffer);
505 auto func = GLESSymbols::get().glBindBufferBase;
508 return func(target, index, buffer);
516 void GL_APIENTRY
glBufferData(GLenum target, GLsizeiptr size,
const GLvoid *data, GLenum usage)
518 auto func = GLESSymbols::get().glBufferData;
521 return func(target, size, data, usage);
531 auto func = GLESSymbols::get().glDeleteBuffers;
534 return func(n, buffers);
542 void GL_APIENTRY
glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
544 auto func = GLESSymbols::get().glDispatchCompute;
547 return func(num_groups_x, num_groups_y, num_groups_z);
557 auto func = GLESSymbols::get().glFlush;
570 auto func = GLESSymbols::get().glGenBuffers;
573 return func(n, buffers);
583 auto func = GLESSymbols::get().glGetProgramResourceIndex;
586 return func(program, programInterface, name);
590 return GL_INVALID_INDEX;
596 auto func = GLESSymbols::get().glGetUniformLocation;
599 return func(program, name);
609 auto func = GLESSymbols::get().glMapBufferRange;
612 return func(target, offset, length, access);
622 auto func = GLESSymbols::get().glMemoryBarrier;
625 return func(barriers);
635 auto func = GLESSymbols::get().glUniform1ui;
638 return func(location, v0);
648 auto func = GLESSymbols::get().glUnmapBuffer;
661 auto func = GLESSymbols::get().glGetError;
674 auto func = GLESSymbols::get().glGetString;
687 auto func = GLESSymbols::get().glGetActiveUniformBlockiv;
690 return func(program, uniformBlockIndex, pname, params);
700 auto func = GLESSymbols::get().glUniformBlockBinding;
703 return func(program, uniformBlockIndex, uniformBlockBinding);
713 auto func = GLESSymbols::get().glGetUniformBlockIndex;
716 return func(program, uniformBlockName);
720 return GL_INVALID_INDEX;
726 auto func = GLESSymbols::get().glGenTextures;
729 return func(n, textures);
739 auto func = GLESSymbols::get().glDeleteTextures;
742 return func(n, textures);
752 auto func = GLESSymbols::get().glBindTexture;
755 return func(target, texture);
763 void GL_APIENTRY
glTexImage2D(GLenum target, GLint
level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum
type,
const GLvoid *pixels)
765 auto func = GLESSymbols::get().glTexImage2D;
768 return func(target, level, internalformat, width, height, border, format, type, pixels);
778 auto func = GLESSymbols::get().glGenFramebuffers;
781 return func(n, framebuffers);
791 auto func = GLESSymbols::get().glDeleteFramebuffers;
794 return func(n, framebuffers);
804 auto func = GLESSymbols::get().glBindFramebuffer;
807 return func(target, framebuffer);
817 auto func = GLESSymbols::get().glFramebufferTexture2D;
820 return func(target, attachment, textarget, texture, level);
void GL_APIENTRY glGenTextures(GLsizei n, GLuint *textures)
__eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress(const char *procname)
__global uchar * offset(const Image *img, int x, int y)
Get the pointer position of a Image.
void GL_APIENTRY(*)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) glFramebufferTexture2D_func
EGLBoolean EGLAPIENTRY eglMakeCurrent(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx)
void GL_APIENTRY(*)(GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length) glShaderSource_func
void GL_APIENTRY glBindTexture(GLenum target, GLuint texture)
void GL_APIENTRY glDeleteTextures(GLsizei n, const GLuint *textures)
EGLBoolean EGLAPIENTRY(*)(EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) eglMakeCurrent_func
EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config)
EGLContext EGLAPIENTRY(*)(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list) eglCreateContext_func
void GL_APIENTRY glBindFramebuffer(GLenum target, GLuint framebuffer)
void GL_APIENTRY glDeleteBuffers(GLsizei n, const GLuint *buffers)
void GL_APIENTRY(*)(GLuint program, GLuint shader) glAttachShader_func
EGLDisplay EGLAPIENTRY(*)(EGLNativeDisplayType display_id) eglGetDisplay_func
__eglMustCastToProperFunctionPointerType EGLAPIENTRY(*)(const char *procname) eglGetProcAddress_func
void GL_APIENTRY(*)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) glUniformBlockBinding_func
void GL_APIENTRY(*)(GLsizei n, GLuint *framebuffers) glGenFramebuffers_func
void GL_APIENTRY glGetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog)
EGLContext EGLAPIENTRY eglCreateContext(EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list)
EGLint EGLAPIENTRY eglGetError()
void GL_APIENTRY glFlush(void)
EGLBoolean EGLAPIENTRY eglBindAPI(EGLenum api)
void GL_APIENTRY(*)(GLint location, GLuint v0) glUniform1ui_func
EGLint EGLAPIENTRY(*)() eglGetError_func
void GL_APIENTRY glCompileShader(GLuint shader)
char const *EGLAPIENTRY eglQueryString(EGLDisplay dpy, EGLint name)
GLboolean GL_APIENTRY glUnmapBuffer(GLenum target)
void GL_APIENTRY(*)(GLuint program, GLenum pname, GLint *params) glGetProgramiv_func
void GL_APIENTRY glGetShaderiv(GLuint shader, GLenum pname, GLint *params)
void GL_APIENTRY(*)(GLsizei n, const GLuint *textures) glDeleteTextures_func
GLenum GL_APIENTRY glGetError(void)
const GLubyte *GL_APIENTRY(*)(GLenum name) glGetString_func
GLenum GL_APIENTRY(*)() glGetError_func
bool opengles31_is_available()
Check if the OpenGL ES 3.1 API is available at runtime.
decltype(strategy::transforms) typedef type
GLint GL_APIENTRY(*)(GLuint program, const GLchar *name) glGetUniformLocation_func
void GL_APIENTRY(*)(GLbitfield barriers) glMemoryBarrier_func
void GL_APIENTRY(*)(GLenum target, GLuint framebuffer) glBindFramebuffer_func
void GL_APIENTRY glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding)
EGLBoolean EGLAPIENTRY eglDestroyContext(EGLDisplay dpy, EGLContext ctx)
void GL_APIENTRY(*)(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage) glBufferData_func
void GL_APIENTRY glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)
EGLBoolean EGLAPIENTRY(*)(EGLenum api) eglBindAPI_func
GLuint GL_APIENTRY(*)() glCreateProgram_func
void GL_APIENTRY(*)() glFlush_func
void GL_APIENTRY glBindBuffer(GLenum target, GLuint buffer)
void GL_APIENTRY glDeleteProgram(GLuint program)
void GL_APIENTRY glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
void GL_APIENTRY(*)(GLenum target, GLuint buffer) glBindBuffer_func
EGLBoolean EGLAPIENTRY eglInitialize(EGLDisplay dpy, EGLint *major, EGLint *minor)
GLuint GL_APIENTRY glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName)
void GL_APIENTRY(*)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params) glGetActiveUniformBlockiv_func
void GL_APIENTRY(*)(GLsizei n, GLuint *buffers) glGenBuffers_func
void GL_APIENTRY glUseProgram(GLuint program)
void GL_APIENTRY(*)(GLsizei n, GLuint *textures) glGenTextures_func
void *GL_APIENTRY glMapBufferRange(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access)
void GL_APIENTRY(*)(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z) glDispatchCompute_func
void GL_APIENTRY(*)(GLuint program, GLuint shader) glDetachShader_func
void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)
void GL_APIENTRY glShaderSource(GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length)
void GL_APIENTRY glUniform1ui(GLint location, GLuint v0)
void GL_APIENTRY glGenBuffers(GLsizei n, GLuint *buffers)
GLuint GL_APIENTRY glCreateShader(GLenum type)
void GL_APIENTRY(*)(GLenum target, GLuint index, GLuint buffer) glBindBufferBase_func
char const *EGLAPIENTRY(*)(EGLDisplay dpy, EGLint name) eglQueryString_func
void GL_APIENTRY(*)(GLuint shader, GLsizei bufsize, GLsizei *length, GLchar *infolog) glGetShaderInfoLog_func
void GL_APIENTRY glAttachShader(GLuint program, GLuint shader)
void GL_APIENTRY glDispatchCompute(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z)
void GL_APIENTRY glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
GLuint GL_APIENTRY glCreateProgram()
void GL_APIENTRY glGetProgramiv(GLuint program, GLenum pname, GLint *params)
EGLBoolean EGLAPIENTRY(*)(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config) eglChooseConfig_func
EGLBoolean EGLAPIENTRY(*)(EGLDisplay dpy, EGLContext ctx) eglDestroyContext_func
GLuint GL_APIENTRY(*)(GLenum type) glCreateShader_func
void GL_APIENTRY glMemoryBarrier(GLbitfield barriers)
void GL_APIENTRY(*)(GLuint program, GLsizei bufsize, GLsizei *length, GLchar *infolog) glGetProgramInfoLog_func
Wrapper to configure the Khronos EGL and OpenGL ES C header.
void GL_APIENTRY glGenFramebuffers(GLsizei n, GLuint *framebuffers)
EGLBoolean EGLAPIENTRY(*)(EGLDisplay dpy, EGLint *major, EGLint *minor) eglInitialize_func
void GL_APIENTRY(*)(GLuint program) glUseProgram_func
void GL_APIENTRY glLinkProgram(GLuint program)
void GL_APIENTRY(*)(GLenum target, GLuint texture) glBindTexture_func
void GL_APIENTRY(*)(GLsizei n, const GLuint *framebuffers) glDeleteFramebuffers_func
EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id)
void GL_APIENTRY glDetachShader(GLuint program, GLuint shader)
EGLBoolean EGLAPIENTRY(*)(EGLDisplay dpy) eglTerminate_func
EGLBoolean EGLAPIENTRY eglTerminate(EGLDisplay dpy)
void GL_APIENTRY(*)(GLuint shader, GLenum pname, GLint *params) glGetShaderiv_func
void GL_APIENTRY glDeleteShader(GLuint shader)
GLint GL_APIENTRY glGetUniformLocation(GLuint program, const GLchar *name)
void *GL_APIENTRY(*)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) glMapBufferRange_func
const GLubyte *GL_APIENTRY glGetString(GLenum name)
void GL_APIENTRY(*)(GLuint program) glLinkProgram_func
GLuint GL_APIENTRY glGetProgramResourceIndex(GLuint program, GLenum programInterface, const GLchar *name)
void GL_APIENTRY glGetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params)
void GL_APIENTRY(*)(GLuint shader) glCompileShader_func
void GL_APIENTRY(*)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels) glTexImage2D_func
void GL_APIENTRY(*)(GLsizei n, const GLuint *buffers) glDeleteBuffers_func
void GL_APIENTRY(*)(GLuint program) glDeleteProgram_func
GLuint GL_APIENTRY(*)(GLuint program, GLenum programInterface, const GLchar *name) glGetProgramResourceIndex_func
GLuint GL_APIENTRY(*)(GLuint program, const GLchar *uniformBlockName) glGetUniformBlockIndex_func
void GL_APIENTRY(*)(GLuint shader) glDeleteShader_func
void GL_APIENTRY glBufferData(GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)
GLboolean GL_APIENTRY(*)(GLenum target) glUnmapBuffer_func
void GL_APIENTRY glGetShaderInfoLog(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog)