• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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