mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-08 04:08:32 +09:00
540 lines
24 KiB
C++
540 lines
24 KiB
C++
// MobileGL - MobileGL/MG_Util/BackendLoaders/OpenGL/Loader.cpp
|
|
// Copyright (c) 2025-2026 MobileGL-Dev
|
|
// Licensed under the GNU Lesser General Public License v3.0:
|
|
// https://www.gnu.org/licenses/gpl-3.0.txt
|
|
// https://www.gnu.org/licenses/lgpl-3.0.txt
|
|
// SPDX-License-Identifier: LGPL-3.0-only
|
|
// End of Source File Header
|
|
|
|
#include "Loader.h"
|
|
#include "MG_Util/Types.h"
|
|
|
|
namespace MobileGL::MG_Util::BackendLoader {
|
|
static void* OpenLib(const Vector<String>& names) {
|
|
#if !defined(__WIN32) && !defined(_WIN32) && !defined(__APPLE__)
|
|
static const String LibPathPrefixes[] = {
|
|
"/opt/vc/lib/", "/usr/local/lib/", "/usr/lib/", "/usr/lib/x86_64-linux-gnu/",
|
|
"" // We should put this to the end of the list to avoid breaking `LD_LIBRARY_PATH` usage
|
|
};
|
|
|
|
void* lib = nullptr;
|
|
|
|
Int flags = RTLD_LOCAL | RTLD_NOW;
|
|
for (const auto& prefix : LibPathPrefixes) {
|
|
for (const auto& name : names) {
|
|
String path_name = prefix + name;
|
|
if ((lib = dlopen(path_name.c_str(), flags))) {
|
|
return lib;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
return nullptr;
|
|
}
|
|
|
|
inline void* ProcAddress(void* lib, const char* name) {
|
|
#if !defined(__WIN32) && !defined(_WIN32) && !defined(__APPLE__)
|
|
return dlsym(lib, name);
|
|
#else
|
|
return nullptrptr;
|
|
#endif
|
|
}
|
|
|
|
Bool AcquireGLESFunctions(MG_External::GLESFunctionsTable& funcs,
|
|
MG_External::EGL::eglGetProcAddress_PTR procAddress) {
|
|
if (!procAddress) {
|
|
MGLOG_E("eglGetProcAddress is nullptr, cannot load GLES functions");
|
|
return false;
|
|
}
|
|
|
|
#define INIT_GLES_FUNC(name) \
|
|
do { \
|
|
funcs.name = (MG_External::GLES::name##_PTR)procAddress(#name); \
|
|
if (!funcs.name) { \
|
|
MGLOG_E("Failed to load GLES function: %s", #name); \
|
|
} \
|
|
} while (0);
|
|
|
|
{
|
|
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)
|
|
}
|
|
return true;
|
|
}
|
|
|
|
Bool AcquireEGLFunctions(MG_External::EGLFunctionsTable& funcs) {
|
|
static const Vector<String> EGLLibNames = {"libEGL.so"};
|
|
void* eglLib = OpenLib(EGLLibNames);
|
|
if (!eglLib) {
|
|
MGLOG_E("Failed to open libEGL.so");
|
|
return false;
|
|
}
|
|
#define INIT_EGL_FUNC(name) \
|
|
do { \
|
|
funcs.name = (MG_External::EGL::name##_PTR)ProcAddress(eglLib, #name); \
|
|
if (!funcs.name) { \
|
|
MGLOG_E("Failed to load EGL function: %s", #name); \
|
|
} \
|
|
} while (0);
|
|
|
|
{
|
|
INIT_EGL_FUNC(eglBindAPI)
|
|
INIT_EGL_FUNC(eglBindTexImage)
|
|
INIT_EGL_FUNC(eglChooseConfig)
|
|
INIT_EGL_FUNC(eglCopyBuffers)
|
|
INIT_EGL_FUNC(eglCreateContext)
|
|
INIT_EGL_FUNC(eglCreatePbufferFromClientBuffer)
|
|
INIT_EGL_FUNC(eglCreatePbufferSurface)
|
|
INIT_EGL_FUNC(eglCreatePixmapSurface)
|
|
INIT_EGL_FUNC(eglCreatePlatformPixmapSurface)
|
|
INIT_EGL_FUNC(eglCreatePlatformWindowSurface)
|
|
INIT_EGL_FUNC(eglCreateWindowSurface)
|
|
INIT_EGL_FUNC(eglDestroyContext)
|
|
INIT_EGL_FUNC(eglDestroySurface)
|
|
INIT_EGL_FUNC(eglGetConfigAttrib)
|
|
INIT_EGL_FUNC(eglGetConfigs)
|
|
INIT_EGL_FUNC(eglGetCurrentContext)
|
|
INIT_EGL_FUNC(eglGetCurrentDisplay)
|
|
INIT_EGL_FUNC(eglGetCurrentSurface)
|
|
INIT_EGL_FUNC(eglGetDisplay)
|
|
INIT_EGL_FUNC(eglGetPlatformDisplay)
|
|
INIT_EGL_FUNC(eglGetError)
|
|
INIT_EGL_FUNC(eglGetProcAddress)
|
|
INIT_EGL_FUNC(eglInitialize)
|
|
INIT_EGL_FUNC(eglMakeCurrent)
|
|
INIT_EGL_FUNC(eglQueryAPI)
|
|
INIT_EGL_FUNC(eglQueryContext)
|
|
INIT_EGL_FUNC(eglQueryString)
|
|
INIT_EGL_FUNC(eglQuerySurface)
|
|
INIT_EGL_FUNC(eglReleaseTexImage)
|
|
INIT_EGL_FUNC(eglReleaseThread)
|
|
INIT_EGL_FUNC(eglSurfaceAttrib)
|
|
INIT_EGL_FUNC(eglSwapBuffers)
|
|
INIT_EGL_FUNC(eglSwapBuffersWithDamageEXT)
|
|
INIT_EGL_FUNC(eglSwapInterval)
|
|
INIT_EGL_FUNC(eglTerminate)
|
|
INIT_EGL_FUNC(eglUnlockSurfaceKHR)
|
|
INIT_EGL_FUNC(eglWaitClient)
|
|
INIT_EGL_FUNC(eglWaitGL)
|
|
INIT_EGL_FUNC(eglWaitNative)
|
|
INIT_EGL_FUNC(eglCreateSync)
|
|
INIT_EGL_FUNC(eglDestroySync)
|
|
INIT_EGL_FUNC(eglClientWaitSync)
|
|
INIT_EGL_FUNC(eglGetSyncAttrib)
|
|
INIT_EGL_FUNC(eglCreateImage)
|
|
INIT_EGL_FUNC(eglDestroyImage)
|
|
INIT_EGL_FUNC(eglGetPlatformDisplay)
|
|
INIT_EGL_FUNC(eglWaitSync)
|
|
}
|
|
return true;
|
|
}
|
|
|
|
Bool FillInGLESCapabilities(MG_External::GLESCapabilities& caps, const MG_External::GLESFunctionsTable& glesFuncs) {
|
|
if (!glesFuncs.glGetString || !glesFuncs.glGetIntegerv) {
|
|
MGLOG_E("Required GLES functions are not loaded, cannot query capabilities");
|
|
return false;
|
|
}
|
|
|
|
auto* vendorName = glesFuncs.glGetString(GL_VENDOR);
|
|
MGLOG_I("GL_VENDOR: %s", vendorName);
|
|
auto* gpuName = glesFuncs.glGetString(GL_RENDERER);
|
|
MGLOG_I("GL_RENDERER: %s", gpuName);
|
|
glesFuncs.glGetIntegerv(GL_MAJOR_VERSION, &caps.GLESVersion.Major);
|
|
glesFuncs.glGetIntegerv(GL_MINOR_VERSION, &caps.GLESVersion.Minor);
|
|
|
|
caps.GLESVersionString = String((char*)glesFuncs.glGetString(GL_VERSION));
|
|
caps.GLESRendererString = String((char*)gpuName);
|
|
caps.GLESVendorString = String((char*)vendorName);
|
|
caps.GLESShadingLanguageVersionString = String((char*)glesFuncs.glGetString(GL_SHADING_LANGUAGE_VERSION));
|
|
|
|
GLint extCount = 0;
|
|
glesFuncs.glGetIntegerv(GL_NUM_EXTENSIONS, &extCount);
|
|
MGLOG_I("Detected %d OpenGL ES extensions:", extCount);
|
|
for (GLint i = 0; i < extCount; ++i) {
|
|
const char* extension = (const char*)glesFuncs.glGetStringi(GL_EXTENSIONS, i);
|
|
if (extension) {
|
|
MGLOG_I(" %s", extension);
|
|
if (std::strcmp(extension, "GL_EXT_buffer_storage") == 0) {
|
|
caps.SupportsPersistentMapping = true;
|
|
}
|
|
if (std::strcmp(extension, "GL_EXT_texture_norm16") == 0) {
|
|
caps.SupportsNorm16Texture = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
MGLOG_I("OpenGL ES capabilities:");
|
|
glesFuncs.glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &caps.UniformBufferOffsetAlignment);
|
|
MGLOG_I(" GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: %d", caps.UniformBufferOffsetAlignment);
|
|
|
|
return true;
|
|
}
|
|
} // namespace MobileGL::MG_Util::BackendLoader
|