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