Files

1059 lines
40 KiB
C++

//
// Created by BZLZHH on 2025/4/26.
//
#include "Loader.h"
#if BACKEND_TYPE == BACKEND_GLES
// TODO: Take this code file apart into multiple files.
#define GL_FUNC_DECL(name) \
name##_PTR name;
namespace GLES {
GL_FUNC_DECL(glActiveTexture)
GL_FUNC_DECL(glAttachShader)
GL_FUNC_DECL(glBindAttribLocation)
GL_FUNC_DECL(glBindBuffer)
GL_FUNC_DECL(glBindFramebuffer)
GL_FUNC_DECL(glBindRenderbuffer)
GL_FUNC_DECL(glBindTexture)
GL_FUNC_DECL(glBlendColor)
GL_FUNC_DECL(glBlendEquation)
GL_FUNC_DECL(glBlendEquationSeparate)
GL_FUNC_DECL(glBlendFunc)
GL_FUNC_DECL(glBlendFuncSeparate)
GL_FUNC_DECL(glBufferData)
GL_FUNC_DECL(glBufferSubData)
GL_FUNC_DECL(glCheckFramebufferStatus)
GL_FUNC_DECL(glClear)
GL_FUNC_DECL(glClearColor)
GL_FUNC_DECL(glClearDepthf)
GL_FUNC_DECL(glClearStencil)
GL_FUNC_DECL(glColorMask)
GL_FUNC_DECL(glCompileShader)
GL_FUNC_DECL(glCompressedTexImage2D)
GL_FUNC_DECL(glCompressedTexSubImage2D)
GL_FUNC_DECL(glCopyTexImage2D)
GL_FUNC_DECL(glCopyTexSubImage2D)
GL_FUNC_DECL(glCreateProgram)
GL_FUNC_DECL(glCreateShader)
GL_FUNC_DECL(glCullFace)
GL_FUNC_DECL(glDeleteBuffers)
GL_FUNC_DECL(glDeleteFramebuffers)
GL_FUNC_DECL(glDeleteProgram)
GL_FUNC_DECL(glDeleteRenderbuffers)
GL_FUNC_DECL(glDeleteShader)
GL_FUNC_DECL(glDeleteTextures)
GL_FUNC_DECL(glDepthFunc)
GL_FUNC_DECL(glDepthMask)
GL_FUNC_DECL(glDepthRangef)
GL_FUNC_DECL(glDetachShader)
GL_FUNC_DECL(glDisable)
GL_FUNC_DECL(glDisableVertexAttribArray)
GL_FUNC_DECL(glDrawArrays)
GL_FUNC_DECL(glDrawElements)
GL_FUNC_DECL(glEnable)
GL_FUNC_DECL(glEnableVertexAttribArray)
GL_FUNC_DECL(glFinish)
GL_FUNC_DECL(glFlush)
GL_FUNC_DECL(glFramebufferRenderbuffer)
GL_FUNC_DECL(glFramebufferTexture2D)
GL_FUNC_DECL(glFrontFace)
GL_FUNC_DECL(glGenBuffers)
GL_FUNC_DECL(glGenerateMipmap)
GL_FUNC_DECL(glGenFramebuffers)
GL_FUNC_DECL(glGenRenderbuffers)
GL_FUNC_DECL(glGenTextures)
GL_FUNC_DECL(glGetActiveAttrib)
GL_FUNC_DECL(glGetActiveUniform)
GL_FUNC_DECL(glGetAttachedShaders)
GL_FUNC_DECL(glGetAttribLocation)
GL_FUNC_DECL(glGetBooleanv)
GL_FUNC_DECL(glGetBufferParameteriv)
GL_FUNC_DECL(glGetError)
GL_FUNC_DECL(glGetString)
GL_FUNC_DECL(glGetStringi)
GL_FUNC_DECL(glGetFloatv)
GL_FUNC_DECL(glGetFramebufferAttachmentParameteriv)
GL_FUNC_DECL(glGetIntegerv)
GL_FUNC_DECL(glGetProgramiv)
GL_FUNC_DECL(glGetProgramInfoLog)
GL_FUNC_DECL(glGetRenderbufferParameteriv)
GL_FUNC_DECL(glGetShaderiv)
GL_FUNC_DECL(glGetShaderInfoLog)
GL_FUNC_DECL(glGetShaderPrecisionFormat)
GL_FUNC_DECL(glGetShaderSource)
GL_FUNC_DECL(glGetTexParameterfv)
GL_FUNC_DECL(glGetTexParameteriv)
GL_FUNC_DECL(glGetUniformfv)
GL_FUNC_DECL(glGetUniformiv)
GL_FUNC_DECL(glGetUniformLocation)
GL_FUNC_DECL(glGetVertexAttribfv)
GL_FUNC_DECL(glGetVertexAttribiv)
GL_FUNC_DECL(glGetVertexAttribPointerv)
GL_FUNC_DECL(glHint)
GL_FUNC_DECL(glIsBuffer)
GL_FUNC_DECL(glIsEnabled)
GL_FUNC_DECL(glIsFramebuffer)
GL_FUNC_DECL(glIsProgram)
GL_FUNC_DECL(glIsRenderbuffer)
GL_FUNC_DECL(glIsShader)
GL_FUNC_DECL(glIsTexture)
GL_FUNC_DECL(glLineWidth)
GL_FUNC_DECL(glLinkProgram)
GL_FUNC_DECL(glPixelStorei)
GL_FUNC_DECL(glPolygonOffset)
GL_FUNC_DECL(glReadPixels)
GL_FUNC_DECL(glReleaseShaderCompiler)
GL_FUNC_DECL(glRenderbufferStorage)
GL_FUNC_DECL(glSampleCoverage)
GL_FUNC_DECL(glScissor)
GL_FUNC_DECL(glShaderBinary)
GL_FUNC_DECL(glShaderSource)
GL_FUNC_DECL(glStencilFunc)
GL_FUNC_DECL(glStencilFuncSeparate)
GL_FUNC_DECL(glStencilMask)
GL_FUNC_DECL(glStencilMaskSeparate)
GL_FUNC_DECL(glStencilOp)
GL_FUNC_DECL(glStencilOpSeparate)
GL_FUNC_DECL(glTexImage2D)
GL_FUNC_DECL(glTexParameterf)
GL_FUNC_DECL(glTexParameterfv)
GL_FUNC_DECL(glTexParameteri)
GL_FUNC_DECL(glTexParameteriv)
GL_FUNC_DECL(glTexSubImage2D)
GL_FUNC_DECL(glUniform1f)
GL_FUNC_DECL(glUniform1fv)
GL_FUNC_DECL(glUniform1i)
GL_FUNC_DECL(glUniform1iv)
GL_FUNC_DECL(glUniform2f)
GL_FUNC_DECL(glUniform2fv)
GL_FUNC_DECL(glUniform2i)
GL_FUNC_DECL(glUniform2iv)
GL_FUNC_DECL(glUniform3f)
GL_FUNC_DECL(glUniform3fv)
GL_FUNC_DECL(glUniform3i)
GL_FUNC_DECL(glUniform3iv)
GL_FUNC_DECL(glUniform4f)
GL_FUNC_DECL(glUniform4fv)
GL_FUNC_DECL(glUniform4i)
GL_FUNC_DECL(glUniform4iv)
GL_FUNC_DECL(glUniformMatrix2fv)
GL_FUNC_DECL(glUniformMatrix3fv)
GL_FUNC_DECL(glUniformMatrix4fv)
GL_FUNC_DECL(glUseProgram)
GL_FUNC_DECL(glValidateProgram)
GL_FUNC_DECL(glVertexAttrib1f)
GL_FUNC_DECL(glVertexAttrib1fv)
GL_FUNC_DECL(glVertexAttrib2f)
GL_FUNC_DECL(glVertexAttrib2fv)
GL_FUNC_DECL(glVertexAttrib3f)
GL_FUNC_DECL(glVertexAttrib3fv)
GL_FUNC_DECL(glVertexAttrib4f)
GL_FUNC_DECL(glVertexAttrib4fv)
GL_FUNC_DECL(glVertexAttribPointer)
GL_FUNC_DECL(glViewport)
GL_FUNC_DECL(glReadBuffer)
GL_FUNC_DECL(glDrawRangeElements)
GL_FUNC_DECL(glTexImage3D)
GL_FUNC_DECL(glTexSubImage3D)
GL_FUNC_DECL(glCopyTexSubImage3D)
GL_FUNC_DECL(glCompressedTexImage3D)
GL_FUNC_DECL(glCompressedTexSubImage3D)
GL_FUNC_DECL(glGenQueries)
GL_FUNC_DECL(glDeleteQueries)
GL_FUNC_DECL(glIsQuery)
GL_FUNC_DECL(glBeginQuery)
GL_FUNC_DECL(glEndQuery)
GL_FUNC_DECL(glGetQueryiv)
GL_FUNC_DECL(glGetQueryObjectuiv)
GL_FUNC_DECL(glUnmapBuffer)
GL_FUNC_DECL(glGetBufferPointerv)
GL_FUNC_DECL(glDrawBuffers)
GL_FUNC_DECL(glUniformMatrix2x3fv)
GL_FUNC_DECL(glUniformMatrix3x2fv)
GL_FUNC_DECL(glUniformMatrix2x4fv)
GL_FUNC_DECL(glUniformMatrix4x2fv)
GL_FUNC_DECL(glUniformMatrix3x4fv)
GL_FUNC_DECL(glUniformMatrix4x3fv)
GL_FUNC_DECL(glBlitFramebuffer)
GL_FUNC_DECL(glRenderbufferStorageMultisample)
GL_FUNC_DECL(glFramebufferTextureLayer)
GL_FUNC_DECL(glFlushMappedBufferRange)
GL_FUNC_DECL(glBindVertexArray)
GL_FUNC_DECL(glDeleteVertexArrays)
GL_FUNC_DECL(glGenVertexArrays)
GL_FUNC_DECL(glIsVertexArray)
GL_FUNC_DECL(glGetIntegeri_v)
GL_FUNC_DECL(glBeginTransformFeedback)
GL_FUNC_DECL(glEndTransformFeedback)
GL_FUNC_DECL(glBindBufferRange)
GL_FUNC_DECL(glBindBufferBase)
GL_FUNC_DECL(glTransformFeedbackVaryings)
GL_FUNC_DECL(glGetTransformFeedbackVarying)
GL_FUNC_DECL(glVertexAttribIPointer)
GL_FUNC_DECL(glGetVertexAttribIiv)
GL_FUNC_DECL(glGetVertexAttribIuiv)
GL_FUNC_DECL(glVertexAttribI4i)
GL_FUNC_DECL(glVertexAttribI4ui)
GL_FUNC_DECL(glVertexAttribI4iv)
GL_FUNC_DECL(glVertexAttribI4uiv)
GL_FUNC_DECL(glGetUniformuiv)
GL_FUNC_DECL(glGetFragDataLocation)
GL_FUNC_DECL(glUniform1ui)
GL_FUNC_DECL(glUniform2ui)
GL_FUNC_DECL(glUniform3ui)
GL_FUNC_DECL(glUniform4ui)
GL_FUNC_DECL(glUniform1uiv)
GL_FUNC_DECL(glUniform2uiv)
GL_FUNC_DECL(glUniform3uiv)
GL_FUNC_DECL(glUniform4uiv)
GL_FUNC_DECL(glClearBufferiv)
GL_FUNC_DECL(glClearBufferuiv)
GL_FUNC_DECL(glClearBufferfv)
GL_FUNC_DECL(glClearBufferfi)
GL_FUNC_DECL(glCopyBufferSubData)
GL_FUNC_DECL(glGetUniformIndices)
GL_FUNC_DECL(glGetActiveUniformsiv)
GL_FUNC_DECL(glGetUniformBlockIndex)
GL_FUNC_DECL(glGetActiveUniformBlockiv)
GL_FUNC_DECL(glGetActiveUniformBlockName)
GL_FUNC_DECL(glUniformBlockBinding)
GL_FUNC_DECL(glDrawArraysInstanced)
GL_FUNC_DECL(glDrawElementsInstanced)
GL_FUNC_DECL(glFenceSync)
GL_FUNC_DECL(glIsSync)
GL_FUNC_DECL(glDeleteSync)
GL_FUNC_DECL(glClientWaitSync)
GL_FUNC_DECL(glWaitSync)
GL_FUNC_DECL(glGetInteger64v)
GL_FUNC_DECL(glGetSynciv)
GL_FUNC_DECL(glGetInteger64i_v)
GL_FUNC_DECL(glGetBufferParameteri64v)
GL_FUNC_DECL(glGenSamplers)
GL_FUNC_DECL(glDeleteSamplers)
GL_FUNC_DECL(glIsSampler)
GL_FUNC_DECL(glBindSampler)
GL_FUNC_DECL(glSamplerParameteri)
GL_FUNC_DECL(glSamplerParameteriv)
GL_FUNC_DECL(glSamplerParameterf)
GL_FUNC_DECL(glSamplerParameterfv)
GL_FUNC_DECL(glGetSamplerParameteriv)
GL_FUNC_DECL(glGetSamplerParameterfv)
GL_FUNC_DECL(glVertexAttribDivisor)
GL_FUNC_DECL(glBindTransformFeedback)
GL_FUNC_DECL(glDeleteTransformFeedbacks)
GL_FUNC_DECL(glGenTransformFeedbacks)
GL_FUNC_DECL(glIsTransformFeedback)
GL_FUNC_DECL(glPauseTransformFeedback)
GL_FUNC_DECL(glResumeTransformFeedback)
GL_FUNC_DECL(glGetProgramBinary)
GL_FUNC_DECL(glProgramBinary)
GL_FUNC_DECL(glProgramParameteri)
GL_FUNC_DECL(glInvalidateFramebuffer)
GL_FUNC_DECL(glInvalidateSubFramebuffer)
GL_FUNC_DECL(glTexStorage2D)
GL_FUNC_DECL(glTexStorage3D)
GL_FUNC_DECL(glGetInternalformativ)
GL_FUNC_DECL(glDispatchCompute)
GL_FUNC_DECL(glDispatchComputeIndirect)
GL_FUNC_DECL(glDrawArraysIndirect)
GL_FUNC_DECL(glDrawElementsIndirect)
GL_FUNC_DECL(glFramebufferParameteri)
GL_FUNC_DECL(glGetFramebufferParameteriv)
GL_FUNC_DECL(glGetProgramInterfaceiv)
GL_FUNC_DECL(glGetProgramResourceIndex)
GL_FUNC_DECL(glGetProgramResourceName)
GL_FUNC_DECL(glGetProgramResourceiv)
GL_FUNC_DECL(glGetProgramResourceLocation)
GL_FUNC_DECL(glUseProgramStages)
GL_FUNC_DECL(glActiveShaderProgram)
GL_FUNC_DECL(glCreateShaderProgramv)
GL_FUNC_DECL(glBindProgramPipeline)
GL_FUNC_DECL(glDeleteProgramPipelines)
GL_FUNC_DECL(glGenProgramPipelines)
GL_FUNC_DECL(glIsProgramPipeline)
GL_FUNC_DECL(glGetProgramPipelineiv)
GL_FUNC_DECL(glProgramUniform1i)
GL_FUNC_DECL(glProgramUniform2i)
GL_FUNC_DECL(glProgramUniform3i)
GL_FUNC_DECL(glProgramUniform4i)
GL_FUNC_DECL(glProgramUniform1ui)
GL_FUNC_DECL(glProgramUniform2ui)
GL_FUNC_DECL(glProgramUniform3ui)
GL_FUNC_DECL(glProgramUniform4ui)
GL_FUNC_DECL(glProgramUniform1f)
GL_FUNC_DECL(glProgramUniform2f)
GL_FUNC_DECL(glProgramUniform3f)
GL_FUNC_DECL(glProgramUniform4f)
GL_FUNC_DECL(glProgramUniform1iv)
GL_FUNC_DECL(glProgramUniform2iv)
GL_FUNC_DECL(glProgramUniform3iv)
GL_FUNC_DECL(glProgramUniform4iv)
GL_FUNC_DECL(glProgramUniform1uiv)
GL_FUNC_DECL(glProgramUniform2uiv)
GL_FUNC_DECL(glProgramUniform3uiv)
GL_FUNC_DECL(glProgramUniform4uiv)
GL_FUNC_DECL(glProgramUniform1fv)
GL_FUNC_DECL(glProgramUniform2fv)
GL_FUNC_DECL(glProgramUniform3fv)
GL_FUNC_DECL(glProgramUniform4fv)
GL_FUNC_DECL(glProgramUniformMatrix2fv)
GL_FUNC_DECL(glProgramUniformMatrix3fv)
GL_FUNC_DECL(glProgramUniformMatrix4fv)
GL_FUNC_DECL(glProgramUniformMatrix2x3fv)
GL_FUNC_DECL(glProgramUniformMatrix3x2fv)
GL_FUNC_DECL(glProgramUniformMatrix2x4fv)
GL_FUNC_DECL(glProgramUniformMatrix4x2fv)
GL_FUNC_DECL(glProgramUniformMatrix3x4fv)
GL_FUNC_DECL(glProgramUniformMatrix4x3fv)
GL_FUNC_DECL(glValidateProgramPipeline)
GL_FUNC_DECL(glGetProgramPipelineInfoLog)
GL_FUNC_DECL(glBindImageTexture)
GL_FUNC_DECL(glGetBooleani_v)
GL_FUNC_DECL(glMemoryBarrier)
GL_FUNC_DECL(glMemoryBarrierByRegion)
GL_FUNC_DECL(glTexStorage2DMultisample)
GL_FUNC_DECL(glGetMultisamplefv)
GL_FUNC_DECL(glSampleMaski)
GL_FUNC_DECL(glGetTexLevelParameteriv)
GL_FUNC_DECL(glGetTexLevelParameterfv)
GL_FUNC_DECL(glBindVertexBuffer)
GL_FUNC_DECL(glVertexAttribFormat)
GL_FUNC_DECL(glVertexAttribIFormat)
GL_FUNC_DECL(glVertexAttribBinding)
GL_FUNC_DECL(glVertexBindingDivisor)
GL_FUNC_DECL(glBlendBarrier)
GL_FUNC_DECL(glCopyImageSubData)
GL_FUNC_DECL(glDebugMessageControl)
GL_FUNC_DECL(glDebugMessageInsert)
GL_FUNC_DECL(glDebugMessageCallback)
GL_FUNC_DECL(glGetDebugMessageLog)
GL_FUNC_DECL(glPushDebugGroup)
GL_FUNC_DECL(glPopDebugGroup)
GL_FUNC_DECL(glObjectLabel)
GL_FUNC_DECL(glGetObjectLabel)
GL_FUNC_DECL(glObjectPtrLabel)
GL_FUNC_DECL(glGetObjectPtrLabel)
GL_FUNC_DECL(glGetPointerv)
GL_FUNC_DECL(glEnablei)
GL_FUNC_DECL(glDisablei)
GL_FUNC_DECL(glBlendEquationi)
GL_FUNC_DECL(glBlendEquationSeparatei)
GL_FUNC_DECL(glBlendFunci)
GL_FUNC_DECL(glBlendFuncSeparatei)
GL_FUNC_DECL(glColorMaski)
GL_FUNC_DECL(glIsEnabledi)
GL_FUNC_DECL(glDrawElementsBaseVertex)
GL_FUNC_DECL(glDrawRangeElementsBaseVertex)
GL_FUNC_DECL(glDrawElementsInstancedBaseVertex)
GL_FUNC_DECL(glFramebufferTexture)
GL_FUNC_DECL(glPrimitiveBoundingBox)
GL_FUNC_DECL(glGetGraphicsResetStatus)
GL_FUNC_DECL(glReadnPixels)
GL_FUNC_DECL(glGetnUniformfv)
GL_FUNC_DECL(glGetnUniformiv)
GL_FUNC_DECL(glGetnUniformuiv)
GL_FUNC_DECL(glMinSampleShading)
GL_FUNC_DECL(glPatchParameteri)
GL_FUNC_DECL(glTexParameterIiv)
GL_FUNC_DECL(glTexParameterIuiv)
GL_FUNC_DECL(glGetTexParameterIiv)
GL_FUNC_DECL(glGetTexParameterIuiv)
GL_FUNC_DECL(glSamplerParameterIiv)
GL_FUNC_DECL(glSamplerParameterIuiv)
GL_FUNC_DECL(glGetSamplerParameterIiv)
GL_FUNC_DECL(glGetSamplerParameterIuiv)
GL_FUNC_DECL(glTexBuffer)
GL_FUNC_DECL(glTexBufferRange)
GL_FUNC_DECL(glTexStorage3DMultisample)
GL_FUNC_DECL(glMapBufferRange)
GL_FUNC_DECL(glBufferStorageEXT)
GL_FUNC_DECL(glGetQueryObjectivEXT)
GL_FUNC_DECL(glGetQueryObjecti64vEXT)
GL_FUNC_DECL(glBindFragDataLocationEXT)
GL_FUNC_DECL(glMapBufferOES)
GL_FUNC_DECL(glMultiDrawArraysIndirectEXT)
GL_FUNC_DECL(glMultiDrawElementsIndirectEXT)
GL_FUNC_DECL(glMultiDrawElementsBaseVertexEXT)
GL_FUNC_DECL(glBruh)
}
#undef GL_FUNC_DECL
namespace MG_GL::BackendLoader {
void Init() {
GLESBackend::LoadLibs();
GLESBackend::InitEGL();
GLESBackend::InitGLES();
GLESBackend::DestroyTempEGLCtx();
}
}
namespace MG_GL::BackendLoader::GLESBackend {
void *libGLES = nullptr, *libEGL = nullptr;
static const char *LibPathPrefixes[] = {
"",
"/opt/vc/lib/",
"/usr/local/lib/",
"/usr/lib/",
nullptr
};
static const char *LibExts[] = {
"so",
"so.1",
"so.2",
"dylib",
"dll",
nullptr
};
static const char *GLES3Libs[] = {
"libGLESv3_CM",
"libGLESv3",
nullptr
};
static const char *EGLLibs[] = {
"libEGL",
nullptr
};
void *OpenLib(const char **names, const char *override) {
void *lib = nullptr;
char path_name[PATH_MAX + 1];
int flags = RTLD_LOCAL | RTLD_NOW;
if (override) {
if ((lib = dlopen(override, flags))) {
strncpy(path_name, override, PATH_MAX);
return lib;
} else {
MG_Util::Debug::LogE("LIBGL_GLES override failed: %s\n", dlerror());
}
}
for (int p = 0; LibPathPrefixes[p]; p++) {
for (int i = 0; names[i]; i++) {
for (int e = 0; LibExts[e]; e++) {
snprintf(path_name, PATH_MAX, "%s%s.%s", LibPathPrefixes[p], names[i], LibExts[e]);
if ((lib = dlopen(path_name, flags))) {
return lib;
}
}
}
}
return lib;
}
void LoadLibs() {
static int first = 1;
if (!first) return;
first = 0;
// TODO: Add ANGLE override?
libGLES = OpenLib(GLES3Libs, nullptr);
libEGL = OpenLib(EGLLibs, nullptr);
}
void *ProcAddress(void *lib, const char *name) {
return dlsym(lib, name);
}
void LogOpenGLExtensions() {
const GLubyte *raw_extensions = glGetString(GL_EXTENSIONS);
MG_Util::Debug::LogD("Extensions list using glGetString:\n%s",
raw_extensions ? (const char *) raw_extensions : "(nullptr)");
GLint num_extensions = 0;
glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions);
MG_Util::Debug::LogD("Extensions list using glGetStringi:\n");
for (GLint i = 0; i < num_extensions; ++i) {
const GLubyte *extension = glGetStringi(GL_EXTENSIONS, i);
if (extension) {
MG_Util::Debug::LogD("%s", (const char *) extension);
} else {
MG_Util::Debug::LogD("(nullptr)");
}
}
}
void InitGLESCapabilities() {
GLES::glGetIntegerv(GL_MAJOR_VERSION, &GLES::Caps::Version::Major);
GLES::glGetIntegerv(GL_MINOR_VERSION, &GLES::Caps::Version::Minor);
GLint num_es_extensions = 0;
GLES::glGetIntegerv(GL_NUM_EXTENSIONS, &num_es_extensions);
MG_Util::Debug::LogD("Detected %d OpenGL ES extensions.", num_es_extensions);
for (GLint i = 0; i < num_es_extensions; ++i) {
const char *extension = (const char *) GLES::glGetStringi(GL_EXTENSIONS, i);
if (extension) {
MG_Util::Debug::LogD("%s", (const char *) extension);
if (strcmp(extension, "GL_EXT_buffer_storage") == 0) {
GLES::Caps::Exts::GL_EXT_buffer_storage = 1;
} else if (strcmp(extension, "GL_EXT_disjoint_timer_query") == 0) {
GLES::Caps::Exts::GL_EXT_disjoint_timer_query = 1;
} else if (strcmp(extension, "GL_QCOM_texture_lod_bias") == 0) {
GLES::Caps::Exts::GL_QCOM_texture_lod_bias = 1;
} else if (strcmp(extension, "GL_EXT_blend_func_extended") == 0) {
GLES::Caps::Exts::GL_EXT_blend_func_extended = 1;
} else if (strcmp(extension, "GL_EXT_texture_format_BGRA8888") == 0) {
GLES::Caps::Exts::GL_EXT_texture_format_BGRA8888 = 1;
} else if (strcmp(extension, "GL_EXT_read_format_bgra") == 0) {
GLES::Caps::Exts::GL_EXT_read_format_bgra = 1;
} else if (strcmp(extension, "GL_OES_mapbuffer") == 0) {
GLES::Caps::Exts::GL_OES_mapbuffer = 1;
} else if (strcmp(extension, "GL_EXT_multi_draw_indirect") == 0) {
GLES::Caps::Exts::GL_EXT_multi_draw_indirect = 1;
} else if (strcmp(extension, "GL_OES_draw_elements_base_vertex") == 0) {
GLES::Caps::Exts::GL_OES_draw_elements_base_vertex = 1;
} else if (strcmp(extension, "GL_OES_depth_texture") == 0) {
GLES::Caps::Exts::GL_OES_depth_texture = 1;
} else if (strcmp(extension, "GL_OES_depth24") == 0) {
GLES::Caps::Exts::GL_OES_depth24 = 1;
} else if (strcmp(extension, "GL_OES_depth_texture_float") == 0) {
GLES::Caps::Exts::GL_OES_depth_texture_float = 1;
} else if (strcmp(extension, "GL_EXT_texture_norm16") == 0) {
GLES::Caps::Exts::GL_EXT_texture_norm16 = 1;
} else if (strcmp(extension, "GL_EXT_texture_rg") == 0) {
GLES::Caps::Exts::GL_EXT_texture_rg = 1;
}
} else {
MG_Util::Debug::LogD("(nullptr)");
}
}
MG_Util::Debug::LogD("Detected GL_QCOM_texture_lod_bias!");
if (GLES::Caps::Exts::GL_EXT_buffer_storage) {
// TODO: Complete AppendExtension.
//AppendExtension("GL_ARB_buffer_storage");
}
if (GLES::Caps::Exts::GL_EXT_disjoint_timer_query) {
// TODO: Complete AppendExtension.
//AppendExtension("GL_ARB_timer_query");
// TODO: Complete AppendExtension.
//AppendExtension("GL_EXT_timer_query");
}
}
void InitGLES() {
INIT_GLES_FUNC(glActiveTexture)
INIT_GLES_FUNC(glAttachShader)
INIT_GLES_FUNC(glBindAttribLocation)
INIT_GLES_FUNC(glBindBuffer)
INIT_GLES_FUNC(glBindFramebuffer)
INIT_GLES_FUNC(glBindRenderbuffer)
INIT_GLES_FUNC(glBindTexture)
INIT_GLES_FUNC(glBlendColor)
INIT_GLES_FUNC(glBlendEquation)
INIT_GLES_FUNC(glBlendEquationSeparate)
INIT_GLES_FUNC(glBlendFunc)
INIT_GLES_FUNC(glBlendFuncSeparate)
INIT_GLES_FUNC(glBufferData)
INIT_GLES_FUNC(glBufferSubData)
INIT_GLES_FUNC(glCheckFramebufferStatus)
INIT_GLES_FUNC(glClear)
INIT_GLES_FUNC(glClearColor)
INIT_GLES_FUNC(glClearDepthf)
INIT_GLES_FUNC(glClearStencil)
INIT_GLES_FUNC(glColorMask)
INIT_GLES_FUNC(glCompileShader)
INIT_GLES_FUNC(glCompressedTexImage2D)
INIT_GLES_FUNC(glCompressedTexSubImage2D)
// INIT_GLES_FUNC(glCopyTexImage1D)
INIT_GLES_FUNC(glCopyTexImage2D)
INIT_GLES_FUNC(glCopyTexSubImage2D)
INIT_GLES_FUNC(glCreateProgram)
INIT_GLES_FUNC(glCreateShader)
INIT_GLES_FUNC(glCullFace)
INIT_GLES_FUNC(glDeleteBuffers)
INIT_GLES_FUNC(glDeleteFramebuffers)
INIT_GLES_FUNC(glDeleteProgram)
INIT_GLES_FUNC(glDeleteRenderbuffers)
INIT_GLES_FUNC(glDeleteShader)
INIT_GLES_FUNC(glDeleteTextures)
INIT_GLES_FUNC(glDepthFunc)
INIT_GLES_FUNC(glDepthMask)
INIT_GLES_FUNC(glDepthRangef)
INIT_GLES_FUNC(glDetachShader)
INIT_GLES_FUNC(glDisable)
INIT_GLES_FUNC(glDisableVertexAttribArray)
INIT_GLES_FUNC(glDrawArrays)
INIT_GLES_FUNC(glDrawElements)
INIT_GLES_FUNC(glEnable)
INIT_GLES_FUNC(glEnableVertexAttribArray)
INIT_GLES_FUNC(glFinish)
INIT_GLES_FUNC(glFlush)
INIT_GLES_FUNC(glFramebufferRenderbuffer)
INIT_GLES_FUNC(glFramebufferTexture2D)
INIT_GLES_FUNC(glFrontFace)
INIT_GLES_FUNC(glGenBuffers)
INIT_GLES_FUNC(glGenerateMipmap)
INIT_GLES_FUNC(glGenFramebuffers)
INIT_GLES_FUNC(glGenRenderbuffers)
INIT_GLES_FUNC(glGenTextures)
INIT_GLES_FUNC(glGetActiveAttrib)
INIT_GLES_FUNC(glGetActiveUniform)
INIT_GLES_FUNC(glGetAttachedShaders)
INIT_GLES_FUNC(glGetAttribLocation)
INIT_GLES_FUNC(glGetBooleanv)
INIT_GLES_FUNC(glGetBufferParameteriv)
INIT_GLES_FUNC(glGetError)
INIT_GLES_FUNC(glGetString)
INIT_GLES_FUNC(glGetStringi)
INIT_GLES_FUNC(glGetFloatv)
INIT_GLES_FUNC(glGetFramebufferAttachmentParameteriv)
INIT_GLES_FUNC(glGetIntegerv)
INIT_GLES_FUNC(glGetProgramiv)
INIT_GLES_FUNC(glGetProgramInfoLog)
INIT_GLES_FUNC(glGetRenderbufferParameteriv)
INIT_GLES_FUNC(glGetShaderiv)
INIT_GLES_FUNC(glGetShaderInfoLog)
INIT_GLES_FUNC(glGetShaderPrecisionFormat)
INIT_GLES_FUNC(glGetShaderSource)
INIT_GLES_FUNC(glGetTexParameterfv)
INIT_GLES_FUNC(glGetTexParameteriv)
INIT_GLES_FUNC(glGetUniformfv)
INIT_GLES_FUNC(glGetUniformiv)
INIT_GLES_FUNC(glGetUniformLocation)
INIT_GLES_FUNC(glGetVertexAttribfv)
INIT_GLES_FUNC(glGetVertexAttribiv)
INIT_GLES_FUNC(glGetVertexAttribPointerv)
INIT_GLES_FUNC(glHint)
INIT_GLES_FUNC(glIsBuffer)
INIT_GLES_FUNC(glIsEnabled)
INIT_GLES_FUNC(glIsFramebuffer)
INIT_GLES_FUNC(glIsProgram)
INIT_GLES_FUNC(glIsRenderbuffer)
INIT_GLES_FUNC(glIsShader)
INIT_GLES_FUNC(glIsTexture)
INIT_GLES_FUNC(glLineWidth)
INIT_GLES_FUNC(glLinkProgram)
INIT_GLES_FUNC(glPixelStorei)
INIT_GLES_FUNC(glPolygonOffset)
INIT_GLES_FUNC(glReadPixels)
INIT_GLES_FUNC(glReleaseShaderCompiler)
INIT_GLES_FUNC(glRenderbufferStorage)
INIT_GLES_FUNC(glSampleCoverage)
INIT_GLES_FUNC(glScissor)
INIT_GLES_FUNC(glShaderBinary)
INIT_GLES_FUNC(glShaderSource)
INIT_GLES_FUNC(glStencilFunc)
INIT_GLES_FUNC(glStencilFuncSeparate)
INIT_GLES_FUNC(glStencilMask)
INIT_GLES_FUNC(glStencilMaskSeparate)
INIT_GLES_FUNC(glStencilOp)
INIT_GLES_FUNC(glStencilOpSeparate)
// INIT_GLES_FUNC(glTexImage1D)
INIT_GLES_FUNC(glTexImage2D)
// INIT_GLES_FUNC(glTexStorage1D)
INIT_GLES_FUNC(glTexParameterf)
INIT_GLES_FUNC(glTexParameterfv)
INIT_GLES_FUNC(glTexParameteri)
INIT_GLES_FUNC(glTexParameteriv)
INIT_GLES_FUNC(glTexSubImage2D)
INIT_GLES_FUNC(glUniform1f)
INIT_GLES_FUNC(glUniform1fv)
INIT_GLES_FUNC(glUniform1i)
INIT_GLES_FUNC(glUniform1iv)
INIT_GLES_FUNC(glUniform2f)
INIT_GLES_FUNC(glUniform2fv)
INIT_GLES_FUNC(glUniform2i)
INIT_GLES_FUNC(glUniform2iv)
INIT_GLES_FUNC(glUniform3f)
INIT_GLES_FUNC(glUniform3fv)
INIT_GLES_FUNC(glUniform3i)
INIT_GLES_FUNC(glUniform3iv)
INIT_GLES_FUNC(glUniform4f)
INIT_GLES_FUNC(glUniform4fv)
INIT_GLES_FUNC(glUniform4i)
INIT_GLES_FUNC(glUniform4iv)
INIT_GLES_FUNC(glUniformMatrix2fv)
INIT_GLES_FUNC(glUniformMatrix3fv)
INIT_GLES_FUNC(glUniformMatrix4fv)
INIT_GLES_FUNC(glUseProgram)
INIT_GLES_FUNC(glValidateProgram)
INIT_GLES_FUNC(glVertexAttrib1f)
INIT_GLES_FUNC(glVertexAttrib1fv)
INIT_GLES_FUNC(glVertexAttrib2f)
INIT_GLES_FUNC(glVertexAttrib2fv)
INIT_GLES_FUNC(glVertexAttrib3f)
INIT_GLES_FUNC(glVertexAttrib3fv)
INIT_GLES_FUNC(glVertexAttrib4f)
INIT_GLES_FUNC(glVertexAttrib4fv)
INIT_GLES_FUNC(glVertexAttribPointer)
INIT_GLES_FUNC(glViewport)
INIT_GLES_FUNC(glReadBuffer)
INIT_GLES_FUNC(glDrawRangeElements)
INIT_GLES_FUNC(glTexImage3D)
INIT_GLES_FUNC(glTexSubImage3D)
INIT_GLES_FUNC(glCopyTexSubImage3D)
INIT_GLES_FUNC(glCompressedTexImage3D)
INIT_GLES_FUNC(glCompressedTexSubImage3D)
INIT_GLES_FUNC(glGenQueries)
INIT_GLES_FUNC(glDeleteQueries)
INIT_GLES_FUNC(glIsQuery)
INIT_GLES_FUNC(glBeginQuery)
INIT_GLES_FUNC(glEndQuery)
INIT_GLES_FUNC(glGetQueryiv)
INIT_GLES_FUNC(glGetQueryObjectuiv)
INIT_GLES_FUNC(glUnmapBuffer)
INIT_GLES_FUNC(glGetBufferPointerv)
INIT_GLES_FUNC(glDrawBuffers)
INIT_GLES_FUNC(glUniformMatrix2x3fv)
INIT_GLES_FUNC(glUniformMatrix3x2fv)
INIT_GLES_FUNC(glUniformMatrix2x4fv)
INIT_GLES_FUNC(glUniformMatrix4x2fv)
INIT_GLES_FUNC(glUniformMatrix3x4fv)
INIT_GLES_FUNC(glUniformMatrix4x3fv)
INIT_GLES_FUNC(glBlitFramebuffer)
INIT_GLES_FUNC(glRenderbufferStorageMultisample)
INIT_GLES_FUNC(glFramebufferTextureLayer)
INIT_GLES_FUNC(glFlushMappedBufferRange)
INIT_GLES_FUNC(glBindVertexArray)
INIT_GLES_FUNC(glDeleteVertexArrays)
INIT_GLES_FUNC(glGenVertexArrays)
INIT_GLES_FUNC(glIsVertexArray)
INIT_GLES_FUNC(glGetIntegeri_v)
INIT_GLES_FUNC(glBeginTransformFeedback)
INIT_GLES_FUNC(glEndTransformFeedback)
INIT_GLES_FUNC(glBindBufferRange)
INIT_GLES_FUNC(glBindBufferBase)
INIT_GLES_FUNC(glTransformFeedbackVaryings)
INIT_GLES_FUNC(glGetTransformFeedbackVarying)
INIT_GLES_FUNC(glVertexAttribIPointer)
INIT_GLES_FUNC(glGetVertexAttribIiv)
INIT_GLES_FUNC(glGetVertexAttribIuiv)
INIT_GLES_FUNC(glVertexAttribI4i)
INIT_GLES_FUNC(glVertexAttribI4ui)
INIT_GLES_FUNC(glVertexAttribI4iv)
INIT_GLES_FUNC(glVertexAttribI4uiv)
INIT_GLES_FUNC(glGetUniformuiv)
INIT_GLES_FUNC(glGetFragDataLocation)
INIT_GLES_FUNC(glUniform1ui)
INIT_GLES_FUNC(glUniform2ui)
INIT_GLES_FUNC(glUniform3ui)
INIT_GLES_FUNC(glUniform4ui)
INIT_GLES_FUNC(glUniform1uiv)
INIT_GLES_FUNC(glUniform2uiv)
INIT_GLES_FUNC(glUniform3uiv)
INIT_GLES_FUNC(glUniform4uiv)
INIT_GLES_FUNC(glClearBufferiv)
INIT_GLES_FUNC(glClearBufferuiv)
INIT_GLES_FUNC(glClearBufferfv)
INIT_GLES_FUNC(glClearBufferfi)
INIT_GLES_FUNC(glCopyBufferSubData)
INIT_GLES_FUNC(glGetUniformIndices)
INIT_GLES_FUNC(glGetActiveUniformsiv)
INIT_GLES_FUNC(glGetUniformBlockIndex)
INIT_GLES_FUNC(glGetActiveUniformBlockiv)
INIT_GLES_FUNC(glGetActiveUniformBlockName)
INIT_GLES_FUNC(glUniformBlockBinding)
INIT_GLES_FUNC(glDrawArraysInstanced)
INIT_GLES_FUNC(glDrawElementsInstanced)
INIT_GLES_FUNC(glFenceSync)
INIT_GLES_FUNC(glIsSync)
INIT_GLES_FUNC(glDeleteSync)
INIT_GLES_FUNC(glClientWaitSync)
INIT_GLES_FUNC(glWaitSync)
INIT_GLES_FUNC(glGetInteger64v)
INIT_GLES_FUNC(glGetSynciv)
INIT_GLES_FUNC(glGetInteger64i_v)
INIT_GLES_FUNC(glGetBufferParameteri64v)
INIT_GLES_FUNC(glGenSamplers)
INIT_GLES_FUNC(glDeleteSamplers)
INIT_GLES_FUNC(glIsSampler)
INIT_GLES_FUNC(glBindSampler)
INIT_GLES_FUNC(glSamplerParameteri)
INIT_GLES_FUNC(glSamplerParameteriv)
INIT_GLES_FUNC(glSamplerParameterf)
INIT_GLES_FUNC(glSamplerParameterfv)
INIT_GLES_FUNC(glGetSamplerParameteriv)
INIT_GLES_FUNC(glGetSamplerParameterfv)
INIT_GLES_FUNC(glVertexAttribDivisor)
INIT_GLES_FUNC(glBindTransformFeedback)
INIT_GLES_FUNC(glDeleteTransformFeedbacks)
INIT_GLES_FUNC(glGenTransformFeedbacks)
INIT_GLES_FUNC(glIsTransformFeedback)
INIT_GLES_FUNC(glPauseTransformFeedback)
INIT_GLES_FUNC(glResumeTransformFeedback)
INIT_GLES_FUNC(glGetProgramBinary)
INIT_GLES_FUNC(glProgramBinary)
INIT_GLES_FUNC(glProgramParameteri)
INIT_GLES_FUNC(glInvalidateFramebuffer)
INIT_GLES_FUNC(glInvalidateSubFramebuffer)
INIT_GLES_FUNC(glTexStorage2D)
INIT_GLES_FUNC(glTexStorage3D)
INIT_GLES_FUNC(glGetInternalformativ)
INIT_GLES_FUNC(glDispatchCompute)
INIT_GLES_FUNC(glDispatchComputeIndirect)
INIT_GLES_FUNC(glDrawArraysIndirect)
INIT_GLES_FUNC(glDrawElementsIndirect)
INIT_GLES_FUNC(glFramebufferParameteri)
INIT_GLES_FUNC(glGetFramebufferParameteriv)
INIT_GLES_FUNC(glGetProgramInterfaceiv)
INIT_GLES_FUNC(glGetProgramResourceIndex)
INIT_GLES_FUNC(glGetProgramResourceName)
INIT_GLES_FUNC(glGetProgramResourceiv)
INIT_GLES_FUNC(glGetProgramResourceLocation)
INIT_GLES_FUNC(glUseProgramStages)
INIT_GLES_FUNC(glActiveShaderProgram)
INIT_GLES_FUNC(glCreateShaderProgramv)
INIT_GLES_FUNC(glBindProgramPipeline)
INIT_GLES_FUNC(glDeleteProgramPipelines)
INIT_GLES_FUNC(glGenProgramPipelines)
INIT_GLES_FUNC(glIsProgramPipeline)
INIT_GLES_FUNC(glGetProgramPipelineiv)
INIT_GLES_FUNC(glProgramUniform1i)
INIT_GLES_FUNC(glProgramUniform2i)
INIT_GLES_FUNC(glProgramUniform3i)
INIT_GLES_FUNC(glProgramUniform4i)
INIT_GLES_FUNC(glProgramUniform1ui)
INIT_GLES_FUNC(glProgramUniform2ui)
INIT_GLES_FUNC(glProgramUniform3ui)
INIT_GLES_FUNC(glProgramUniform4ui)
INIT_GLES_FUNC(glProgramUniform1f)
INIT_GLES_FUNC(glProgramUniform2f)
INIT_GLES_FUNC(glProgramUniform3f)
INIT_GLES_FUNC(glProgramUniform4f)
INIT_GLES_FUNC(glProgramUniform1iv)
INIT_GLES_FUNC(glProgramUniform2iv)
INIT_GLES_FUNC(glProgramUniform3iv)
INIT_GLES_FUNC(glProgramUniform4iv)
INIT_GLES_FUNC(glProgramUniform1uiv)
INIT_GLES_FUNC(glProgramUniform2uiv)
INIT_GLES_FUNC(glProgramUniform3uiv)
INIT_GLES_FUNC(glProgramUniform4uiv)
INIT_GLES_FUNC(glProgramUniform1fv)
INIT_GLES_FUNC(glProgramUniform2fv)
INIT_GLES_FUNC(glProgramUniform3fv)
INIT_GLES_FUNC(glProgramUniform4fv)
INIT_GLES_FUNC(glProgramUniformMatrix2fv)
INIT_GLES_FUNC(glProgramUniformMatrix3fv)
INIT_GLES_FUNC(glProgramUniformMatrix4fv)
INIT_GLES_FUNC(glProgramUniformMatrix2x3fv)
INIT_GLES_FUNC(glProgramUniformMatrix3x2fv)
INIT_GLES_FUNC(glProgramUniformMatrix2x4fv)
INIT_GLES_FUNC(glProgramUniformMatrix4x2fv)
INIT_GLES_FUNC(glProgramUniformMatrix3x4fv)
INIT_GLES_FUNC(glProgramUniformMatrix4x3fv)
INIT_GLES_FUNC(glValidateProgramPipeline)
INIT_GLES_FUNC(glGetProgramPipelineInfoLog)
INIT_GLES_FUNC(glBindImageTexture)
INIT_GLES_FUNC(glGetBooleani_v)
INIT_GLES_FUNC(glMemoryBarrier)
INIT_GLES_FUNC(glMemoryBarrierByRegion)
INIT_GLES_FUNC(glTexStorage2DMultisample)
INIT_GLES_FUNC(glGetMultisamplefv)
INIT_GLES_FUNC(glSampleMaski)
INIT_GLES_FUNC(glGetTexLevelParameteriv)
INIT_GLES_FUNC(glGetTexLevelParameterfv)
INIT_GLES_FUNC(glBindVertexBuffer)
INIT_GLES_FUNC(glVertexAttribFormat)
INIT_GLES_FUNC(glVertexAttribIFormat)
INIT_GLES_FUNC(glVertexAttribBinding)
INIT_GLES_FUNC(glVertexBindingDivisor)
INIT_GLES_FUNC(glBlendBarrier)
INIT_GLES_FUNC(glCopyImageSubData)
INIT_GLES_FUNC(glDebugMessageControl)
INIT_GLES_FUNC(glDebugMessageInsert)
INIT_GLES_FUNC(glDebugMessageCallback)
INIT_GLES_FUNC(glGetDebugMessageLog)
INIT_GLES_FUNC(glPushDebugGroup)
INIT_GLES_FUNC(glPopDebugGroup)
INIT_GLES_FUNC(glObjectLabel)
INIT_GLES_FUNC(glGetObjectLabel)
INIT_GLES_FUNC(glObjectPtrLabel)
INIT_GLES_FUNC(glGetObjectPtrLabel)
INIT_GLES_FUNC(glGetPointerv)
INIT_GLES_FUNC(glEnablei)
INIT_GLES_FUNC(glDisablei)
INIT_GLES_FUNC(glBlendEquationi)
INIT_GLES_FUNC(glBlendEquationSeparatei)
INIT_GLES_FUNC(glBlendFunci)
INIT_GLES_FUNC(glBlendFuncSeparatei)
INIT_GLES_FUNC(glColorMaski)
INIT_GLES_FUNC(glIsEnabledi)
INIT_GLES_FUNC(glDrawElementsBaseVertex)
INIT_GLES_FUNC(glDrawRangeElementsBaseVertex)
INIT_GLES_FUNC(glDrawElementsInstancedBaseVertex)
INIT_GLES_FUNC(glFramebufferTexture)
INIT_GLES_FUNC(glPrimitiveBoundingBox)
INIT_GLES_FUNC(glGetGraphicsResetStatus)
INIT_GLES_FUNC(glReadnPixels)
INIT_GLES_FUNC(glGetnUniformfv)
INIT_GLES_FUNC(glGetnUniformiv)
INIT_GLES_FUNC(glGetnUniformuiv)
INIT_GLES_FUNC(glMinSampleShading)
INIT_GLES_FUNC(glPatchParameteri)
INIT_GLES_FUNC(glTexParameterIiv)
INIT_GLES_FUNC(glTexParameterIuiv)
INIT_GLES_FUNC(glGetTexParameterIiv)
INIT_GLES_FUNC(glGetTexParameterIuiv)
INIT_GLES_FUNC(glSamplerParameterIiv)
INIT_GLES_FUNC(glSamplerParameterIuiv)
INIT_GLES_FUNC(glGetSamplerParameterIiv)
INIT_GLES_FUNC(glGetSamplerParameterIuiv)
INIT_GLES_FUNC(glTexBuffer)
INIT_GLES_FUNC(glTexBufferRange)
INIT_GLES_FUNC(glTexStorage3DMultisample)
INIT_GLES_FUNC(glMapBufferRange)
INIT_GLES_FUNC(glBufferStorageEXT)
INIT_GLES_FUNC(glGetQueryObjectivEXT)
INIT_GLES_FUNC(glGetQueryObjecti64vEXT)
INIT_GLES_FUNC(glBindFragDataLocationEXT)
INIT_GLES_FUNC(glMapBufferOES)
INIT_GLES_FUNC(glMultiDrawArraysIndirectEXT)
INIT_GLES_FUNC(glMultiDrawElementsIndirectEXT)
INIT_GLES_FUNC(glMultiDrawElementsBaseVertexEXT)
MG_Util::Debug::LogD("glMultiDrawArraysIndirectEXT() @ 0x%x", GLES::glMultiDrawArraysIndirectEXT);
MG_Util::Debug::LogD("glMultiDrawElementsIndirectEXT() @ 0x%x", GLES::glMultiDrawElementsIndirectEXT);
MG_Util::Debug::LogD("glMultiDrawElementsBaseVertexEXT() @ 0x%x", GLES::glMultiDrawElementsBaseVertexEXT);
InitGLESCapabilities();
LogOpenGLExtensions();
}
static EGLDisplay eglDisplay = EGL_NO_DISPLAY;
static EGLSurface eglSurface = EGL_NO_SURFACE;
static EGLContext eglContext = EGL_NO_CONTEXT;
#define LOAD_EGL(name) \
static EGL::name##_PTR egl_##name = NULL; \
{ \
static bool first = true; \
if (first) { \
first = false; \
if (libEGL != NULL) { \
egl_##name = (EGL::name##_PTR)ProcAddress(libEGL, #name); \
} \
} \
}
void InitEGL() {
LOAD_EGL(eglGetProcAddress)
LOAD_EGL(eglBindAPI)
LOAD_EGL(eglInitialize)
LOAD_EGL(eglGetDisplay)
LOAD_EGL(eglCreatePbufferSurface)
LOAD_EGL(eglDestroySurface)
LOAD_EGL(eglDestroyContext)
LOAD_EGL(eglMakeCurrent)
LOAD_EGL(eglChooseConfig)
LOAD_EGL(eglCreateContext)
LOAD_EGL(eglQueryString)
LOAD_EGL(eglTerminate)
LOAD_EGL(eglGetError)
EGLint configAttribs[] = {
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_ALPHA_SIZE, 8,
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_NONE
};
EGLint ctxAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
EGLint pbAttribs[] = { EGL_WIDTH, 32, EGL_HEIGHT, 32, EGL_NONE };
EGLConfig pbufConfig;
EGLint configsFound = 0;
eglDisplay = egl_eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (eglDisplay == EGL_NO_DISPLAY) {
MG_Util::Debug::LogE("eglGetDisplay failed (0x%x)", egl_eglGetError());
goto cleanup;
}
if (egl_eglInitialize(eglDisplay, NULL, NULL) != EGL_TRUE) {
MG_Util::Debug::LogE("eglInitialize failed (0x%x)", egl_eglGetError());
goto cleanup;
}
if (egl_eglBindAPI(EGL_OPENGL_ES_API) != EGL_TRUE) {
MG_Util::Debug::LogE("eglBindAPI failed (0x%x)", egl_eglGetError());
goto cleanup;
}
if (egl_eglChooseConfig(eglDisplay, configAttribs, &pbufConfig, 1, &configsFound) != EGL_TRUE) {
MG_Util::Debug::LogE("eglChooseConfig failed (0x%x)", egl_eglGetError());
goto cleanup;
}
if (configsFound == 0) {
configAttribs[6] = 0;
if (egl_eglChooseConfig(eglDisplay, configAttribs, &pbufConfig, 1, &configsFound) != EGL_TRUE) {
MG_Util::Debug::LogE("Retry eglChooseConfig failed (0x%x)", egl_eglGetError());
goto cleanup;
}
if (configsFound) {
MG_Util::Debug::LogD("Using config without alpha channel");
} else {
MG_Util::Debug::LogE("No valid EGL config found");
goto cleanup;
}
}
eglContext = egl_eglCreateContext(eglDisplay, pbufConfig, EGL_NO_CONTEXT, ctxAttribs);
if (eglContext == EGL_NO_CONTEXT) {
MG_Util::Debug::LogE("eglCreateContext failed (0x%x)", egl_eglGetError());
goto cleanup;
}
eglSurface = egl_eglCreatePbufferSurface(eglDisplay, pbufConfig, pbAttribs);
if (eglSurface == EGL_NO_SURFACE) {
MG_Util::Debug::LogE("eglCreatePbufferSurface failed (0x%x)", egl_eglGetError());
goto cleanup;
}
if (egl_eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext) != EGL_TRUE) {
MG_Util::Debug::LogE("eglMakeCurrent failed (0x%x)", egl_eglGetError());
goto cleanup;
}
MG_Util::Debug::LogD("EGL initialized successfully");
return;
cleanup:
if (eglSurface != EGL_NO_SURFACE) {
egl_eglDestroySurface(eglDisplay, eglSurface);
}
if (eglContext != EGL_NO_CONTEXT) {
egl_eglDestroyContext(eglDisplay, eglContext);
}
if (eglDisplay != EGL_NO_DISPLAY) {
egl_eglTerminate(eglDisplay);
}
MG_Util::Debug::LogE("EGL initialization failed");
}
void DestroyTempEGLCtx() {
LOAD_EGL(eglDestroySurface)
LOAD_EGL(eglDestroyContext)
LOAD_EGL(eglMakeCurrent)
LOAD_EGL(eglTerminate)
egl_eglMakeCurrent(eglDisplay, 0, 0, EGL_NO_CONTEXT);
egl_eglDestroySurface(eglDisplay, eglSurface);
egl_eglDestroyContext(eglDisplay, eglContext);
egl_eglTerminate(eglDisplay);
}
#undef LOAD_EGL
}
#endif