mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-08 04:08:32 +09:00
1059 lines
40 KiB
C++
1059 lines
40 KiB
C++
//
|
|
// Created by BZLZHH on 2025/4/26.
|
|
//
|
|
|
|
#include "../../../Includes.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 |