1 /* 2 * Copyright (c) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #if RENDER_HAS_GLES_BACKEND 17 18 #ifndef declare 19 // clang-format off 20 #include <GLES3/gl3.h> 21 #include <GLES3/gl31.h> 22 #include <GLES3/gl32.h> 23 #include <GLES2/gl2ext.h> 24 // clang-format on 25 #define declare(a, b) extern a b; 26 #endif 27 28 #if defined(_WIN32) 29 // The following are gles 3.2 core, but need to be fetched with eglGetProcAddress on PowerVR and MALI simulators. 30 declare(PFNGLDRAWELEMENTSBASEVERTEXPROC, glDrawElementsBaseVertex); 31 declare(PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC, glDrawElementsInstancedBaseVertex); 32 declare(PFNGLDEBUGMESSAGECALLBACKPROC, glDebugMessageCallback); 33 declare(PFNGLDEBUGMESSAGECONTROLPROC, glDebugMessageControl); 34 declare(PFNGLPUSHDEBUGGROUPPROC, glPushDebugGroup); 35 declare(PFNGLPOPDEBUGGROUPPROC, glPopDebugGroup); 36 declare(PFNGLCOLORMASKIPROC, glColorMaski); 37 declare(PFNGLENABLEIPROC, glEnablei); 38 declare(PFNGLDISABLEIPROC, glDisablei); 39 declare(PFNGLBLENDFUNCSEPARATEIPROC, glBlendFuncSeparatei); 40 declare(PFNGLBLENDEQUATIONSEPARATEIPROC, glBlendEquationSeparatei); 41 declare(PFNGLREADNPIXELSPROC, glReadnPixels) 42 #endif 43 44 declare(PFNGLBUFFERSTORAGEEXTPROC, glBufferStorageEXT); 45 46 declare(PFNGLEGLIMAGETARGETTEXTURE2DOESPROC, glEGLImageTargetTexture2DOES); 47 48 #ifndef GL_EXT_multisampled_render_to_texture 49 #define GL_EXT_multisampled_render_to_texture 50 const unsigned int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT = 0x8D6C; 51 const unsigned int GL_RENDERBUFFER_SAMPLES_EXT = 0x8CAB; 52 const unsigned int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT = 0x8D56; 53 const unsigned int GL_MAX_SAMPLES_EXT 0x8D57; 54 using PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC = void(GL_APIENTRYP)( 55 GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); 56 using PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC = void(GL_APIENTRYP)( 57 GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); 58 #endif /* GL_EXT_multisampled_render_to_texture */ 59 60 declare(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, glRenderbufferStorageMultisampleEXT); 61 declare(PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC, glFramebufferTexture2DMultisampleEXT); 62 63 declare(PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC, glFramebufferTextureMultiviewOVR); 64 65 declare(PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC, glFramebufferTextureMultisampleMultiviewOVR); 66 67 declare(PFNGLGETQUERYOBJECTUI64VEXTPROC, glGetQueryObjectui64vEXT); 68 #elif RENDER_HAS_GL_BACKEND 69 70 #ifndef declare 71 #include <gl/glcorearb.h> 72 #include <gl/glext.h> 73 #define declare(a, b) extern a b; 74 #endif 75 76 declare(PFNGLDRAWBUFFERSPROC, glDrawBuffers); 77 declare(PFNGLPUSHDEBUGGROUPPROC, glPushDebugGroup); 78 declare(PFNGLPOPDEBUGGROUPPROC, glPopDebugGroup); 79 declare(PFNGLACTIVETEXTUREPROC, glActiveTexture); 80 declare(PFNGLATTACHSHADERPROC, glAttachShader); 81 declare(PFNGLBINDBUFFERPROC, glBindBuffer); 82 declare(PFNGLBINDBUFFERRANGEPROC, glBindBufferRange); 83 declare(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer); 84 declare(PFNGLBINDIMAGETEXTUREPROC, glBindImageTexture); 85 declare(PFNGLBINDSAMPLERPROC, glBindSampler); 86 declare(PFNGLBINDTEXTUREPROC, glBindTexture); 87 declare(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray); 88 declare(PFNGLBINDVERTEXBUFFERPROC, glBindVertexBuffer); 89 declare(PFNGLVERTEXBINDINGDIVISORPROC, glVertexBindingDivisor); 90 declare(PFNGLBLENDCOLORPROC, glBlendColor); 91 declare(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate); 92 declare(PFNGLBLENDEQUATIONSEPARATEIPROC, glBlendEquationSeparatei); 93 declare(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate); 94 declare(PFNGLBLENDFUNCSEPARATEIPROC, glBlendFuncSeparatei); 95 declare(PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer); 96 declare(PFNGLBUFFERDATAPROC, glBufferData); 97 declare(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus); 98 declare(PFNGLCLEARBUFFERFIPROC, glClearBufferfi); 99 declare(PFNGLCLEARBUFFERFVPROC, glClearBufferfv); 100 declare(PFNGLCLEARBUFFERIVPROC, glClearBufferiv); 101 declare(PFNGLCLEARTEXIMAGEPROC, glClearTexImage); 102 declare(PFNGLCOLORMASKPROC, glColorMask); 103 declare(PFNGLCOLORMASKIPROC, glColorMaski); 104 declare(PFNGLCOMPILESHADERPROC, glCompileShader); 105 declare(PFNGLREADPIXELSPROC, glReadPixels); 106 declare(PFNGLREADNPIXELSPROC, glReadnPixels); 107 declare(PFNGLCOPYBUFFERSUBDATAPROC, glCopyBufferSubData); 108 declare(PFNGLCREATEPROGRAMPROC, glCreateProgram); 109 declare(PFNGLCREATESHADERPROC, glCreateShader); 110 declare(PFNGLPROGRAMUNIFORM1IPROC, glProgramUniform1i); 111 declare(PFNGLPROGRAMUNIFORM1IVPROC, glProgramUniform1iv); 112 declare(PFNGLPROGRAMUNIFORM1UIVPROC, glProgramUniform1uiv); 113 declare(PFNGLPROGRAMUNIFORM4UIVPROC, glProgramUniform4uiv); 114 declare(PFNGLPROGRAMUNIFORM1FVPROC, glProgramUniform1fv); 115 declare(PFNGLPROGRAMUNIFORM2FVPROC, glProgramUniform2fv); 116 declare(PFNGLPROGRAMUNIFORM4FVPROC, glProgramUniform4fv); 117 declare(PFNGLPROGRAMUNIFORMMATRIX4FVPROC, glProgramUniformMatrix4fv); 118 declare(PFNGLCULLFACEPROC, glCullFace); 119 declare(PFNGLDEBUGMESSAGECALLBACKPROC, glDebugMessageCallback); 120 declare(PFNGLDEBUGMESSAGECONTROLPROC, glDebugMessageControl); 121 declare(PFNGLDELETEBUFFERSPROC, glDeleteBuffers); 122 declare(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers); 123 declare(PFNGLDELETEPROGRAMPROC, glDeleteProgram); 124 declare(PFNGLDELETESAMPLERSPROC, glDeleteSamplers); 125 declare(PFNGLDELETESHADERPROC, glDeleteShader); 126 declare(PFNGLDELETETEXTURESPROC, glDeleteTextures); 127 declare(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays); 128 declare(PFNGLDEPTHFUNCPROC, glDepthFunc); 129 declare(PFNGLDEPTHMASKPROC, glDepthMask); 130 declare(PFNGLDEPTHRANGEFPROC, glDepthRangef); 131 declare(PFNGLDISABLEPROC, glDisable); 132 declare(PFNGLDISABLEIPROC, glDisablei); 133 declare(PFNGLDISPATCHCOMPUTEPROC, glDispatchCompute); 134 declare(PFNGLDISPATCHCOMPUTEINDIRECTPROC, glDispatchComputeIndirect); 135 declare(PFNGLDRAWARRAYSINSTANCEDPROC, glDrawArraysInstanced); 136 declare(PFNGLDRAWARRAYSINDIRECTPROC, glDrawArraysIndirect); 137 declare(PFNGLDRAWARRAYSPROC, glDrawArrays); 138 declare(PFNGLDRAWELEMENTSBASEVERTEXPROC, glDrawElementsBaseVertex); 139 declare(PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC, glDrawElementsInstancedBaseVertex); 140 declare(PFNGLDRAWELEMENTSINSTANCEDPROC, glDrawElementsInstanced); 141 declare(PFNGLDRAWELEMENTSINDIRECTPROC, glDrawElementsIndirect); 142 declare(PFNGLDRAWELEMENTSPROC, glDrawElements); 143 declare(PFNGLENABLEPROC, glEnable); 144 declare(PFNGLENABLEIPROC, glEnablei); 145 declare(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray); 146 declare(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray); 147 declare(PFNGLFRAMEBUFFERTEXTURELAYERPROC, glFramebufferTextureLayer); 148 declare(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D); 149 declare(PFNGLFRONTFACEPROC, glFrontFace); 150 declare(PFNGLGENBUFFERSPROC, glGenBuffers); 151 declare(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers); 152 declare(PFNGLGENSAMPLERSPROC, glGenSamplers); 153 declare(PFNGLGENTEXTURESPROC, glGenTextures); 154 declare(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays); 155 declare(PFNGLGETSTRINGPROC, glGetString); 156 declare(PFNGLGETSTRINGIPROC, glGetStringi); 157 declare(PFNGLGETFLOATVPROC, glGetFloatv); 158 declare(PFNGLGETFLOATI_VPROC, glGetFloati_v); 159 declare(PFNGLGETINTEGERVPROC, glGetIntegerv); 160 declare(PFNGLGETINTEGER64VPROC, glGetInteger64v); 161 declare(PFNGLGETINTEGERI_VPROC, glGetIntegeri_v); 162 declare(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog); 163 declare(PFNGLGETPROGRAMIVPROC, glGetProgramiv); 164 declare(PFNGLGETACTIVEUNIFORMBLOCKIVPROC, glGetActiveUniformBlockiv); 165 declare(PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC, glGetActiveUniformBlockName); 166 declare(PFNGLUNIFORMBLOCKBINDINGPROC, glUniformBlockBinding); 167 declare(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog); 168 declare(PFNGLGETSHADERIVPROC, glGetShaderiv); 169 declare(PFNGLGETUNIFORMIVPROC, glGetUniformiv); 170 declare(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation); 171 declare(PFNGLGETACTIVEUNIFORMPROC, glGetActiveUniform); 172 declare(PFNGLGETPROGRAMINTERFACEIVPROC, glGetProgramInterfaceiv); 173 declare(PFNGLGETPROGRAMRESOURCENAMEPROC, glGetProgramResourceName); 174 declare(PFNGLGETPROGRAMRESOURCEINDEXPROC, glGetProgramResourceIndex); 175 declare(PFNGLGETPROGRAMRESOURCEIVPROC, glGetProgramResourceiv); 176 declare(PFNGLLINEWIDTHPROC, glLineWidth); 177 declare(PFNGLLINKPROGRAMPROC, glLinkProgram); 178 declare(PFNGLMAPBUFFERRANGEPROC, glMapBufferRange); 179 declare(PFNGLMEMORYBARRIERPROC, glMemoryBarrier); 180 declare(PFNGLMEMORYBARRIERBYREGIONPROC, glMemoryBarrierByRegion); 181 declare(PFNGLPIXELSTOREIPROC, glPixelStorei); 182 declare(PFNGLPOLYGONMODEPROC, glPolygonMode); 183 declare(PFNGLPOLYGONOFFSETPROC, glPolygonOffset); 184 declare(PFNGLSAMPLERPARAMETERFPROC, glSamplerParameterf); 185 declare(PFNGLSAMPLERPARAMETERFVPROC, glSamplerParameterfv); 186 declare(PFNGLSAMPLERPARAMETERIPROC, glSamplerParameteri); 187 declare(PFNGLSCISSORPROC, glScissor); 188 declare(PFNGLSHADERSOURCEPROC, glShaderSource); 189 declare(PFNGLSTENCILFUNCSEPARATEPROC, glStencilFuncSeparate); 190 declare(PFNGLSTENCILMASKSEPARATEPROC, glStencilMaskSeparate); 191 declare(PFNGLSTENCILOPSEPARATEPROC, glStencilOpSeparate); 192 declare(PFNGLTEXPARAMETERIPROC, glTexParameteri); 193 declare(PFNGLTEXSTORAGE2DPROC, glTexStorage2D); 194 declare(PFNGLTEXSTORAGE3DPROC, glTexStorage3D); 195 declare(PFNGLTEXSUBIMAGE2DPROC, glTexSubImage2D); 196 declare(PFNGLTEXSUBIMAGE3DPROC, glTexSubImage3D); 197 declare(PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC, glCompressedTexSubImage2D); 198 declare(PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC, glCompressedTexSubImage3D); 199 declare(PFNGLUNMAPBUFFERPROC, glUnmapBuffer); 200 declare(PFNGLUSEPROGRAMPROC, glUseProgram); 201 declare(PFNGLVERTEXATTRIBBINDINGPROC, glVertexAttribBinding); 202 declare(PFNGLVERTEXATTRIBFORMATPROC, glVertexAttribFormat); 203 declare(PFNGLVERTEXATTRIBIFORMATPROC, glVertexAttribIFormat); 204 declare(PFNGLVIEWPORTPROC, glViewport); 205 declare(PFNGLCLIENTWAITSYNCPROC, glClientWaitSync); 206 declare(PFNGLDELETESYNCPROC, glDeleteSync); 207 declare(PFNGLFENCESYNCPROC, glFenceSync); 208 declare(PFNGLBUFFERSTORAGEPROC, glBufferStorage); 209 declare(PFNGLCOPYIMAGESUBDATAPROC, glCopyImageSubData); 210 211 declare(PFNGLTEXSTORAGE2DMULTISAMPLEPROC, glTexStorage2DMultisample); 212 213 declare(PFNGLGENQUERIESPROC, glGenQueries); 214 declare(PFNGLDELETEQUERIESPROC, glDeleteQueries); 215 declare(PFNGLBEGINQUERYPROC, glBeginQuery); 216 declare(PFNGLENDQUERYPROC, glEndQuery); 217 declare(PFNGLGETQUERYOBJECTUIVPROC, glGetQueryObjectuiv); 218 declare(PFNGLGETQUERYOBJECTUI64VPROC, glGetQueryObjectui64v); 219 220 declare(PFNGLINVALIDATEFRAMEBUFFERPROC, glInvalidateFramebuffer); 221 declare(PFNGLINVALIDATESUBFRAMEBUFFERPROC, glInvalidateSubFramebuffer); 222 declare(PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC, glGetFramebufferAttachmentParameteriv); 223 224 declare(PFNGLFINISHPROC, glFinish); 225 declare(PFNGLFLUSHPROC, glFlush); 226 227 declare(PFNGLGENPROGRAMPIPELINESPROC, glGenProgramPipelines); 228 declare(PFNGLBINDPROGRAMPIPELINEPROC, glBindProgramPipeline); 229 declare(PFNGLUSEPROGRAMSTAGESPROC, glUseProgramStages); 230 declare(PFNGLDELETEPROGRAMPIPELINESPROC, glDeleteProgramPipelines); 231 declare(PFNGLPROGRAMPARAMETERIPROC, glProgramParameteri); 232 declare(PFNGLCREATESHADERPROGRAMVPROC, glCreateShaderProgramv); 233 234 declare(PFNGLGETBUFFERPARAMETERIVPROC, glGetBufferParameteriv); 235 declare(PFNGLGETBUFFERPARAMETERI64VPROC, glGetBufferParameteri64v); 236 declare(PFNGLGETBUFFERPOINTERVPROC, glGetBufferPointerv); 237 238 declare(PFNGLOBJECTLABELPROC, glObjectLabel); 239 240 // Define the EXT versions, to match GLES. 241 #define glBufferStorageEXT glBufferStorage 242 #define GL_MAP_PERSISTENT_BIT_EXT GL_MAP_PERSISTENT_BIT 243 #define GL_MAP_COHERENT_BIT_EXT GL_MAP_COHERENT_BIT 244 #define GL_DYNAMIC_STORAGE_BIT_EXT GL_DYNAMIC_STORAGE_BIT 245 #define GL_CLIENT_STORAGE_BIT_EXT GL_CLIENT_STORAGE_BIT 246 247 #ifndef GL_EXT_timer_query 248 // GL_GPU_DISJOINT_EXT does not exist and is ignored. 249 #define GL_TIME_ELAPSED_EXT GL_TIME_ELAPSED 250 #endif 251 252 declare(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer); 253 declare(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers); 254 declare(PFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer); 255 declare(PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage); 256 declare(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample); 257 declare(PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers); 258 259 declare(PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC, glFramebufferTextureMultiviewOVR); 260 #else 261 #pragma(error, "Neither GL or GLES is enabled in GLFunctions.h") 262 #endif 263 #undef declare