1 /* 2 * Copyright (C) 2023 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 // define GL_EXT_buffer_storage if not defined in gl headers. 45 #ifndef GL_EXT_buffer_storage 46 #define GL_EXT_buffer_storage 1 47 #ifndef GL_MAP_READ_BIT 48 const unsigned int GL_MAP_READ_BIT = 0x0001; 49 #endif 50 #ifndef GL_MAP_WRITE_BIT 51 const unsigned int GL_MAP_WRITE_BIT = 0x0002; 52 #endif 53 const unsigned int GL_MAP_PERSISTENT_BIT_EXT = 0x0040; 54 const unsigned int GL_MAP_COHERENT_BIT_EXT = 0x0080; 55 const unsigned int GL_DYNAMIC_STORAGE_BIT_EXT = 0x0100; 56 const unsigned int GL_CLIENT_STORAGE_BIT_EXT = 0x0200; 57 const unsigned int GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT = 0x00004000; 58 const unsigned int GL_BUFFER_IMMUTABLE_STORAGE_EXT = 0x821F; 59 const unsigned int GL_BUFFER_STORAGE_FLAGS_EXT = 0x8220; 60 typedef void(GL_APIENTRYP PFNGLBUFFERSTORAGEEXTPROC)( 61 GLenum target, GLsizeiptr size, const void* data, GLbitfield flags); 62 #endif 63 64 // We hope to use GL_EXT_buffer_storage 65 declare(PFNGLBUFFERSTORAGEEXTPROC, glBufferStorageEXT); 66 67 // define GL_OES_EGL_image if not defined in gl headers. 68 #ifndef GL_OES_EGL_image 69 #define GL_OES_EGL_image 70 using GLeglImageOES = void*; 71 using PFNGLEGLIMAGETARGETTEXTURE2DOESPROC = void(GL_APIENTRYP*)(GLenum target, GLeglImageOES image); 72 #endif /* GL_OES_EGL_image */ 73 74 declare(PFNGLEGLIMAGETARGETTEXTURE2DOESPROC, glEGLImageTargetTexture2DOES); 75 76 #ifndef GL_EXT_multisampled_render_to_texture 77 #define GL_EXT_multisampled_render_to_texture 78 const unsigned int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT = 0x8D6C; 79 const unsigned int GL_RENDERBUFFER_SAMPLES_EXT = 0x8CAB; 80 const unsigned int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT = 0x8D56; 81 const unsigned int GL_MAX_SAMPLES_EXT 0x8D57; 82 using PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC = void(GL_APIENTRYP)( 83 GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); 84 using PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC = void(GL_APIENTRYP )( 85 GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); 86 #endif /* GL_EXT_multisampled_render_to_texture */ 87 88 declare(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, glRenderbufferStorageMultisampleEXT); 89 declare(PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC, glFramebufferTexture2DMultisampleEXT); 90 91 #ifndef GL_EXT_disjoint_timer_query 92 #define GL_EXT_disjoint_timer_query 1 93 #define GL_QUERY_COUNTER_BITS_EXT 0x8864 94 #define GL_CURRENT_QUERY_EXT 0x8865 95 #define GL_QUERY_RESULT_EXT 0x8866 96 #define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 97 #define GL_TIME_ELAPSED_EXT 0x88BF 98 #define GL_TIMESTAMP_EXT 0x8E28 99 #define GL_GPU_DISJOINT_EXT 0x8FBB 100 101 using PFNGLGETQUERYOBJECTUI64VEXTPROC = void(GL_APIENTRYP)(GLuint id, GLenum pname, GLuint64* params); 102 #endif /* GL_EXT_disjoint_timer_query */ 103 104 declare(PFNGLGETQUERYOBJECTUI64VEXTPROC, glGetQueryObjectui64vEXT); 105 #elif RENDER_HAS_GL_BACKEND 106 107 #ifndef declare 108 #include <gl/glcorearb.h> 109 #include <gl/glext.h> 110 #define declare(a, b) extern a b; 111 #endif 112 113 declare(PFNGLDRAWBUFFERSPROC, glDrawBuffers); 114 declare(PFNGLPUSHDEBUGGROUPPROC, glPushDebugGroup); 115 declare(PFNGLPOPDEBUGGROUPPROC, glPopDebugGroup); 116 declare(PFNGLACTIVETEXTUREPROC, glActiveTexture); 117 declare(PFNGLATTACHSHADERPROC, glAttachShader); 118 declare(PFNGLBINDBUFFERPROC, glBindBuffer); 119 declare(PFNGLBINDBUFFERRANGEPROC, glBindBufferRange); 120 declare(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer); 121 declare(PFNGLBINDIMAGETEXTUREPROC, glBindImageTexture); 122 declare(PFNGLBINDSAMPLERPROC, glBindSampler); 123 declare(PFNGLBINDTEXTUREPROC, glBindTexture); 124 declare(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray); 125 declare(PFNGLBINDVERTEXBUFFERPROC, glBindVertexBuffer); 126 declare(PFNGLVERTEXBINDINGDIVISORPROC, glVertexBindingDivisor); 127 declare(PFNGLBLENDCOLORPROC, glBlendColor); 128 declare(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate); 129 declare(PFNGLBLENDEQUATIONSEPARATEIPROC, glBlendEquationSeparatei); 130 declare(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate); 131 declare(PFNGLBLENDFUNCSEPARATEIPROC, glBlendFuncSeparatei); 132 declare(PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer); 133 declare(PFNGLBUFFERDATAPROC, glBufferData); 134 declare(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus); 135 declare(PFNGLCLEARBUFFERFIPROC, glClearBufferfi); 136 declare(PFNGLCLEARBUFFERFVPROC, glClearBufferfv); 137 declare(PFNGLCLEARBUFFERIVPROC, glClearBufferiv); 138 declare(PFNGLCOLORMASKPROC, glColorMask); 139 declare(PFNGLCOLORMASKIPROC, glColorMaski); 140 declare(PFNGLCOMPILESHADERPROC, glCompileShader); 141 declare(PFNGLREADPIXELSPROC, glReadPixels); 142 declare(PFNGLREADNPIXELSPROC, glReadnPixels); 143 declare(PFNGLCOPYBUFFERSUBDATAPROC, glCopyBufferSubData); 144 declare(PFNGLCREATEPROGRAMPROC, glCreateProgram); 145 declare(PFNGLCREATESHADERPROC, glCreateShader); 146 declare(PFNGLPROGRAMUNIFORM1IPROC, glProgramUniform1i); 147 declare(PFNGLPROGRAMUNIFORM1IVPROC, glProgramUniform1iv); 148 declare(PFNGLPROGRAMUNIFORM1UIVPROC, glProgramUniform1uiv); 149 declare(PFNGLPROGRAMUNIFORM4UIVPROC, glProgramUniform4uiv); 150 declare(PFNGLPROGRAMUNIFORM1FVPROC, glProgramUniform1fv); 151 declare(PFNGLPROGRAMUNIFORM2FVPROC, glProgramUniform2fv); 152 declare(PFNGLPROGRAMUNIFORM4FVPROC, glProgramUniform4fv); 153 declare(PFNGLPROGRAMUNIFORMMATRIX4FVPROC, glProgramUniformMatrix4fv); 154 declare(PFNGLCULLFACEPROC, glCullFace); 155 declare(PFNGLDEBUGMESSAGECALLBACKPROC, glDebugMessageCallback); 156 declare(PFNGLDEBUGMESSAGECONTROLPROC, glDebugMessageControl); 157 declare(PFNGLDELETEBUFFERSPROC, glDeleteBuffers); 158 declare(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers); 159 declare(PFNGLDELETEPROGRAMPROC, glDeleteProgram); 160 declare(PFNGLDELETESAMPLERSPROC, glDeleteSamplers); 161 declare(PFNGLDELETESHADERPROC, glDeleteShader); 162 declare(PFNGLDELETETEXTURESPROC, glDeleteTextures); 163 declare(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays); 164 declare(PFNGLDEPTHFUNCPROC, glDepthFunc); 165 declare(PFNGLDEPTHMASKPROC, glDepthMask); 166 declare(PFNGLDEPTHRANGEFPROC, glDepthRangef); 167 declare(PFNGLDISABLEPROC, glDisable); 168 declare(PFNGLDISABLEIPROC, glDisablei); 169 declare(PFNGLDISPATCHCOMPUTEPROC, glDispatchCompute); 170 declare(PFNGLDISPATCHCOMPUTEINDIRECTPROC, glDispatchComputeIndirect); 171 declare(PFNGLDRAWARRAYSINSTANCEDPROC, glDrawArraysInstanced); 172 declare(PFNGLDRAWARRAYSINDIRECTPROC, glDrawArraysIndirect); 173 declare(PFNGLDRAWARRAYSPROC, glDrawArrays); 174 declare(PFNGLDRAWELEMENTSBASEVERTEXPROC, glDrawElementsBaseVertex); 175 declare(PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC, glDrawElementsInstancedBaseVertex); 176 declare(PFNGLDRAWELEMENTSINSTANCEDPROC, glDrawElementsInstanced); 177 declare(PFNGLDRAWELEMENTSINDIRECTPROC, glDrawElementsIndirect); 178 declare(PFNGLDRAWELEMENTSPROC, glDrawElements); 179 declare(PFNGLENABLEPROC, glEnable); 180 declare(PFNGLENABLEIPROC, glEnablei); 181 declare(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray); 182 declare(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray); 183 declare(PFNGLFRAMEBUFFERTEXTURELAYERPROC, glFramebufferTextureLayer); 184 declare(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D); 185 declare(PFNGLFRONTFACEPROC, glFrontFace); 186 declare(PFNGLGENBUFFERSPROC, glGenBuffers); 187 declare(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers); 188 declare(PFNGLGENSAMPLERSPROC, glGenSamplers); 189 declare(PFNGLGENTEXTURESPROC, glGenTextures); 190 declare(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays); 191 declare(PFNGLGETSTRINGPROC, glGetString); 192 declare(PFNGLGETSTRINGIPROC, glGetStringi); 193 declare(PFNGLGETFLOATVPROC, glGetFloatv); 194 declare(PFNGLGETINTEGERVPROC, glGetIntegerv); 195 declare(PFNGLGETINTEGERI_VPROC, glGetIntegeri_v); 196 declare(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog); 197 declare(PFNGLGETPROGRAMIVPROC, glGetProgramiv); 198 declare(PFNGLGETACTIVEUNIFORMBLOCKIVPROC, glGetActiveUniformBlockiv); 199 declare(PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC, glGetActiveUniformBlockName); 200 declare(PFNGLUNIFORMBLOCKBINDINGPROC, glUniformBlockBinding); 201 declare(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog); 202 declare(PFNGLGETSHADERIVPROC, glGetShaderiv); 203 declare(PFNGLGETUNIFORMIVPROC, glGetUniformiv); 204 declare(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation); 205 declare(PFNGLGETACTIVEUNIFORMPROC, glGetActiveUniform); 206 declare(PFNGLGETPROGRAMINTERFACEIVPROC, glGetProgramInterfaceiv); 207 declare(PFNGLGETPROGRAMRESOURCENAMEPROC, glGetProgramResourceName); 208 declare(PFNGLGETPROGRAMRESOURCEINDEXPROC, glGetProgramResourceIndex); 209 declare(PFNGLGETPROGRAMRESOURCEIVPROC, glGetProgramResourceiv); 210 declare(PFNGLLINEWIDTHPROC, glLineWidth); 211 declare(PFNGLLINKPROGRAMPROC, glLinkProgram); 212 declare(PFNGLMAPBUFFERRANGEPROC, glMapBufferRange); 213 declare(PFNGLMEMORYBARRIERPROC, glMemoryBarrier); 214 declare(PFNGLMEMORYBARRIERBYREGIONPROC, glMemoryBarrierByRegion); 215 declare(PFNGLPIXELSTOREIPROC, glPixelStorei); 216 declare(PFNGLPOLYGONMODEPROC, glPolygonMode); 217 declare(PFNGLPOLYGONOFFSETPROC, glPolygonOffset); 218 declare(PFNGLSAMPLERPARAMETERFPROC, glSamplerParameterf); 219 declare(PFNGLSAMPLERPARAMETERFVPROC, glSamplerParameterfv); 220 declare(PFNGLSAMPLERPARAMETERIPROC, glSamplerParameteri); 221 declare(PFNGLSCISSORPROC, glScissor); 222 declare(PFNGLSHADERSOURCEPROC, glShaderSource); 223 declare(PFNGLSTENCILFUNCSEPARATEPROC, glStencilFuncSeparate); 224 declare(PFNGLSTENCILMASKSEPARATEPROC, glStencilMaskSeparate); 225 declare(PFNGLSTENCILOPSEPARATEPROC, glStencilOpSeparate); 226 declare(PFNGLTEXPARAMETERIPROC, glTexParameteri); 227 declare(PFNGLTEXSTORAGE2DPROC, glTexStorage2D); 228 declare(PFNGLTEXSTORAGE3DPROC, glTexStorage3D); 229 declare(PFNGLTEXSUBIMAGE2DPROC, glTexSubImage2D); 230 declare(PFNGLTEXSUBIMAGE3DPROC, glTexSubImage3D); 231 declare(PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC, glCompressedTexSubImage2D); 232 declare(PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC, glCompressedTexSubImage3D); 233 declare(PFNGLUNMAPBUFFERPROC, glUnmapBuffer); 234 declare(PFNGLUSEPROGRAMPROC, glUseProgram); 235 declare(PFNGLVERTEXATTRIBBINDINGPROC, glVertexAttribBinding); 236 declare(PFNGLVERTEXATTRIBFORMATPROC, glVertexAttribFormat); 237 declare(PFNGLVERTEXATTRIBIFORMATPROC, glVertexAttribIFormat); 238 declare(PFNGLVIEWPORTPROC, glViewport); 239 declare(PFNGLCLIENTWAITSYNCPROC, glClientWaitSync); 240 declare(PFNGLDELETESYNCPROC, glDeleteSync); 241 declare(PFNGLFENCESYNCPROC, glFenceSync); 242 declare(PFNGLBUFFERSTORAGEPROC, glBufferStorage); 243 244 declare(PFNGLTEXSTORAGE2DMULTISAMPLEPROC, glTexStorage2DMultisample); 245 246 declare(PFNGLGENQUERIESPROC, glGenQueries); 247 declare(PFNGLDELETEQUERIESPROC, glDeleteQueries); 248 declare(PFNGLBEGINQUERYPROC, glBeginQuery); 249 declare(PFNGLENDQUERYPROC, glEndQuery); 250 declare(PFNGLGETQUERYOBJECTUIVPROC, glGetQueryObjectuiv); 251 declare(PFNGLGETQUERYOBJECTUI64VPROC, glGetQueryObjectui64v); 252 253 declare(PFNGLINVALIDATEFRAMEBUFFERPROC, glInvalidateFramebuffer); 254 declare(PFNGLINVALIDATESUBFRAMEBUFFERPROC, glInvalidateSubFramebuffer); 255 declare(PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC, glGetFramebufferAttachmentParameteriv); 256 257 declare(PFNGLFINISHPROC, glFinish); 258 declare(PFNGLFLUSHPROC, glFlush); 259 260 declare(PFNGLGENPROGRAMPIPELINESPROC, glGenProgramPipelines); 261 declare(PFNGLBINDPROGRAMPIPELINEPROC, glBindProgramPipeline); 262 declare(PFNGLUSEPROGRAMSTAGESPROC, glUseProgramStages); 263 declare(PFNGLDELETEPROGRAMPIPELINESPROC, glDeleteProgramPipelines); 264 declare(PFNGLPROGRAMPARAMETERIPROC, glProgramParameteri); 265 declare(PFNGLCREATESHADERPROGRAMVPROC, glCreateShaderProgramv); 266 267 declare(PFNGLGETBUFFERPARAMETERIVPROC, glGetBufferParameteriv); 268 declare(PFNGLGETBUFFERPARAMETERI64VPROC, glGetBufferParameteri64v); 269 declare(PFNGLGETBUFFERPOINTERVPROC, glGetBufferPointerv); 270 271 declare(PFNGLOBJECTLABELPROC, glObjectLabel); 272 273 // Define the EXT versions, to match GLES. 274 #define glBufferStorageEXT glBufferStorage 275 #define GL_MAP_PERSISTENT_BIT_EXT GL_MAP_PERSISTENT_BIT 276 #define GL_MAP_COHERENT_BIT_EXT GL_MAP_COHERENT_BIT 277 #define GL_DYNAMIC_STORAGE_BIT_EXT GL_DYNAMIC_STORAGE_BIT 278 #define GL_CLIENT_STORAGE_BIT_EXT GL_CLIENT_STORAGE_BIT 279 280 #ifndef GL_EXT_timer_query 281 // GL_GPU_DISJOINT_EXT does not exist and is ignored. 282 #define GL_TIME_ELAPSED_EXT GL_TIME_ELAPSED 283 #endif 284 285 declare(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer); 286 declare(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers); 287 declare(PFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer); 288 declare(PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage); 289 declare(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample); 290 declare(PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers); 291 #else 292 #pragma(error, "Neither GL or GLES is enabled in GLFunctions.h") 293 #endif 294 #undef declare