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.
30declare(PFNGLDRAWELEMENTSBASEVERTEXPROC, glDrawElementsBaseVertex);
31declare(PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC, glDrawElementsInstancedBaseVertex);
32declare(PFNGLDEBUGMESSAGECALLBACKPROC, glDebugMessageCallback);
33declare(PFNGLDEBUGMESSAGECONTROLPROC, glDebugMessageControl);
34declare(PFNGLPUSHDEBUGGROUPPROC, glPushDebugGroup);
35declare(PFNGLPOPDEBUGGROUPPROC, glPopDebugGroup);
36declare(PFNGLCOLORMASKIPROC, glColorMaski);
37declare(PFNGLENABLEIPROC, glEnablei);
38declare(PFNGLDISABLEIPROC, glDisablei);
39declare(PFNGLBLENDFUNCSEPARATEIPROC, glBlendFuncSeparatei);
40declare(PFNGLBLENDEQUATIONSEPARATEIPROC, glBlendEquationSeparatei);
41declare(PFNGLREADNPIXELSPROC, glReadnPixels)
42#endif
43
44    declare(PFNGLBUFFERSTORAGEEXTPROC, glBufferStorageEXT);
45
46declare(PFNGLEGLIMAGETARGETTEXTURE2DOESPROC, glEGLImageTargetTexture2DOES);
47
48#ifndef GL_EXT_multisampled_render_to_texture
49#define GL_EXT_multisampled_render_to_texture
50const unsigned int GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT = 0x8D6C;
51const unsigned int GL_RENDERBUFFER_SAMPLES_EXT = 0x8CAB;
52const unsigned int GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT = 0x8D56;
53const unsigned int GL_MAX_SAMPLES_EXT 0x8D57;
54using PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC = void(GL_APIENTRYP)(
55    GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
56using 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
60declare(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC, glRenderbufferStorageMultisampleEXT);
61declare(PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC, glFramebufferTexture2DMultisampleEXT);
62
63declare(PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC, glFramebufferTextureMultiviewOVR);
64
65declare(PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC, glFramebufferTextureMultisampleMultiviewOVR);
66
67declare(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
76declare(PFNGLDRAWBUFFERSPROC, glDrawBuffers);
77declare(PFNGLPUSHDEBUGGROUPPROC, glPushDebugGroup);
78declare(PFNGLPOPDEBUGGROUPPROC, glPopDebugGroup);
79declare(PFNGLACTIVETEXTUREPROC, glActiveTexture);
80declare(PFNGLATTACHSHADERPROC, glAttachShader);
81declare(PFNGLBINDBUFFERPROC, glBindBuffer);
82declare(PFNGLBINDBUFFERRANGEPROC, glBindBufferRange);
83declare(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer);
84declare(PFNGLBINDIMAGETEXTUREPROC, glBindImageTexture);
85declare(PFNGLBINDSAMPLERPROC, glBindSampler);
86declare(PFNGLBINDTEXTUREPROC, glBindTexture);
87declare(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray);
88declare(PFNGLBINDVERTEXBUFFERPROC, glBindVertexBuffer);
89declare(PFNGLVERTEXBINDINGDIVISORPROC, glVertexBindingDivisor);
90declare(PFNGLBLENDCOLORPROC, glBlendColor);
91declare(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate);
92declare(PFNGLBLENDEQUATIONSEPARATEIPROC, glBlendEquationSeparatei);
93declare(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate);
94declare(PFNGLBLENDFUNCSEPARATEIPROC, glBlendFuncSeparatei);
95declare(PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer);
96declare(PFNGLBUFFERDATAPROC, glBufferData);
97declare(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus);
98declare(PFNGLCLEARBUFFERFIPROC, glClearBufferfi);
99declare(PFNGLCLEARBUFFERFVPROC, glClearBufferfv);
100declare(PFNGLCLEARBUFFERIVPROC, glClearBufferiv);
101declare(PFNGLCLEARTEXIMAGEPROC, glClearTexImage);
102declare(PFNGLCOLORMASKPROC, glColorMask);
103declare(PFNGLCOLORMASKIPROC, glColorMaski);
104declare(PFNGLCOMPILESHADERPROC, glCompileShader);
105declare(PFNGLREADPIXELSPROC, glReadPixels);
106declare(PFNGLREADNPIXELSPROC, glReadnPixels);
107declare(PFNGLCOPYBUFFERSUBDATAPROC, glCopyBufferSubData);
108declare(PFNGLCREATEPROGRAMPROC, glCreateProgram);
109declare(PFNGLCREATESHADERPROC, glCreateShader);
110declare(PFNGLPROGRAMUNIFORM1IPROC, glProgramUniform1i);
111declare(PFNGLPROGRAMUNIFORM1IVPROC, glProgramUniform1iv);
112declare(PFNGLPROGRAMUNIFORM1UIVPROC, glProgramUniform1uiv);
113declare(PFNGLPROGRAMUNIFORM4UIVPROC, glProgramUniform4uiv);
114declare(PFNGLPROGRAMUNIFORM1FVPROC, glProgramUniform1fv);
115declare(PFNGLPROGRAMUNIFORM2FVPROC, glProgramUniform2fv);
116declare(PFNGLPROGRAMUNIFORM4FVPROC, glProgramUniform4fv);
117declare(PFNGLPROGRAMUNIFORMMATRIX4FVPROC, glProgramUniformMatrix4fv);
118declare(PFNGLCULLFACEPROC, glCullFace);
119declare(PFNGLDEBUGMESSAGECALLBACKPROC, glDebugMessageCallback);
120declare(PFNGLDEBUGMESSAGECONTROLPROC, glDebugMessageControl);
121declare(PFNGLDELETEBUFFERSPROC, glDeleteBuffers);
122declare(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers);
123declare(PFNGLDELETEPROGRAMPROC, glDeleteProgram);
124declare(PFNGLDELETESAMPLERSPROC, glDeleteSamplers);
125declare(PFNGLDELETESHADERPROC, glDeleteShader);
126declare(PFNGLDELETETEXTURESPROC, glDeleteTextures);
127declare(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays);
128declare(PFNGLDEPTHFUNCPROC, glDepthFunc);
129declare(PFNGLDEPTHMASKPROC, glDepthMask);
130declare(PFNGLDEPTHRANGEFPROC, glDepthRangef);
131declare(PFNGLDISABLEPROC, glDisable);
132declare(PFNGLDISABLEIPROC, glDisablei);
133declare(PFNGLDISPATCHCOMPUTEPROC, glDispatchCompute);
134declare(PFNGLDISPATCHCOMPUTEINDIRECTPROC, glDispatchComputeIndirect);
135declare(PFNGLDRAWARRAYSINSTANCEDPROC, glDrawArraysInstanced);
136declare(PFNGLDRAWARRAYSINDIRECTPROC, glDrawArraysIndirect);
137declare(PFNGLDRAWARRAYSPROC, glDrawArrays);
138declare(PFNGLDRAWELEMENTSBASEVERTEXPROC, glDrawElementsBaseVertex);
139declare(PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC, glDrawElementsInstancedBaseVertex);
140declare(PFNGLDRAWELEMENTSINSTANCEDPROC, glDrawElementsInstanced);
141declare(PFNGLDRAWELEMENTSINDIRECTPROC, glDrawElementsIndirect);
142declare(PFNGLDRAWELEMENTSPROC, glDrawElements);
143declare(PFNGLENABLEPROC, glEnable);
144declare(PFNGLENABLEIPROC, glEnablei);
145declare(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray);
146declare(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray);
147declare(PFNGLFRAMEBUFFERTEXTURELAYERPROC, glFramebufferTextureLayer);
148declare(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D);
149declare(PFNGLFRONTFACEPROC, glFrontFace);
150declare(PFNGLGENBUFFERSPROC, glGenBuffers);
151declare(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers);
152declare(PFNGLGENSAMPLERSPROC, glGenSamplers);
153declare(PFNGLGENTEXTURESPROC, glGenTextures);
154declare(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays);
155declare(PFNGLGETSTRINGPROC, glGetString);
156declare(PFNGLGETSTRINGIPROC, glGetStringi);
157declare(PFNGLGETFLOATVPROC, glGetFloatv);
158declare(PFNGLGETFLOATI_VPROC, glGetFloati_v);
159declare(PFNGLGETINTEGERVPROC, glGetIntegerv);
160declare(PFNGLGETINTEGER64VPROC, glGetInteger64v);
161declare(PFNGLGETINTEGERI_VPROC, glGetIntegeri_v);
162declare(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog);
163declare(PFNGLGETPROGRAMIVPROC, glGetProgramiv);
164declare(PFNGLGETACTIVEUNIFORMBLOCKIVPROC, glGetActiveUniformBlockiv);
165declare(PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC, glGetActiveUniformBlockName);
166declare(PFNGLUNIFORMBLOCKBINDINGPROC, glUniformBlockBinding);
167declare(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog);
168declare(PFNGLGETSHADERIVPROC, glGetShaderiv);
169declare(PFNGLGETUNIFORMIVPROC, glGetUniformiv);
170declare(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation);
171declare(PFNGLGETACTIVEUNIFORMPROC, glGetActiveUniform);
172declare(PFNGLGETPROGRAMINTERFACEIVPROC, glGetProgramInterfaceiv);
173declare(PFNGLGETPROGRAMRESOURCENAMEPROC, glGetProgramResourceName);
174declare(PFNGLGETPROGRAMRESOURCEINDEXPROC, glGetProgramResourceIndex);
175declare(PFNGLGETPROGRAMRESOURCEIVPROC, glGetProgramResourceiv);
176declare(PFNGLLINEWIDTHPROC, glLineWidth);
177declare(PFNGLLINKPROGRAMPROC, glLinkProgram);
178declare(PFNGLMAPBUFFERRANGEPROC, glMapBufferRange);
179declare(PFNGLMEMORYBARRIERPROC, glMemoryBarrier);
180declare(PFNGLMEMORYBARRIERBYREGIONPROC, glMemoryBarrierByRegion);
181declare(PFNGLPIXELSTOREIPROC, glPixelStorei);
182declare(PFNGLPOLYGONMODEPROC, glPolygonMode);
183declare(PFNGLPOLYGONOFFSETPROC, glPolygonOffset);
184declare(PFNGLSAMPLERPARAMETERFPROC, glSamplerParameterf);
185declare(PFNGLSAMPLERPARAMETERFVPROC, glSamplerParameterfv);
186declare(PFNGLSAMPLERPARAMETERIPROC, glSamplerParameteri);
187declare(PFNGLSCISSORPROC, glScissor);
188declare(PFNGLSHADERSOURCEPROC, glShaderSource);
189declare(PFNGLSTENCILFUNCSEPARATEPROC, glStencilFuncSeparate);
190declare(PFNGLSTENCILMASKSEPARATEPROC, glStencilMaskSeparate);
191declare(PFNGLSTENCILOPSEPARATEPROC, glStencilOpSeparate);
192declare(PFNGLTEXPARAMETERIPROC, glTexParameteri);
193declare(PFNGLTEXSTORAGE2DPROC, glTexStorage2D);
194declare(PFNGLTEXSTORAGE3DPROC, glTexStorage3D);
195declare(PFNGLTEXSUBIMAGE2DPROC, glTexSubImage2D);
196declare(PFNGLTEXSUBIMAGE3DPROC, glTexSubImage3D);
197declare(PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC, glCompressedTexSubImage2D);
198declare(PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC, glCompressedTexSubImage3D);
199declare(PFNGLUNMAPBUFFERPROC, glUnmapBuffer);
200declare(PFNGLUSEPROGRAMPROC, glUseProgram);
201declare(PFNGLVERTEXATTRIBBINDINGPROC, glVertexAttribBinding);
202declare(PFNGLVERTEXATTRIBFORMATPROC, glVertexAttribFormat);
203declare(PFNGLVERTEXATTRIBIFORMATPROC, glVertexAttribIFormat);
204declare(PFNGLVIEWPORTPROC, glViewport);
205declare(PFNGLCLIENTWAITSYNCPROC, glClientWaitSync);
206declare(PFNGLDELETESYNCPROC, glDeleteSync);
207declare(PFNGLFENCESYNCPROC, glFenceSync);
208declare(PFNGLBUFFERSTORAGEPROC, glBufferStorage);
209declare(PFNGLCOPYIMAGESUBDATAPROC, glCopyImageSubData);
210
211declare(PFNGLTEXSTORAGE2DMULTISAMPLEPROC, glTexStorage2DMultisample);
212
213declare(PFNGLGENQUERIESPROC, glGenQueries);
214declare(PFNGLDELETEQUERIESPROC, glDeleteQueries);
215declare(PFNGLBEGINQUERYPROC, glBeginQuery);
216declare(PFNGLENDQUERYPROC, glEndQuery);
217declare(PFNGLGETQUERYOBJECTUIVPROC, glGetQueryObjectuiv);
218declare(PFNGLGETQUERYOBJECTUI64VPROC, glGetQueryObjectui64v);
219
220declare(PFNGLINVALIDATEFRAMEBUFFERPROC, glInvalidateFramebuffer);
221declare(PFNGLINVALIDATESUBFRAMEBUFFERPROC, glInvalidateSubFramebuffer);
222declare(PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC, glGetFramebufferAttachmentParameteriv);
223
224declare(PFNGLFINISHPROC, glFinish);
225declare(PFNGLFLUSHPROC, glFlush);
226
227declare(PFNGLGENPROGRAMPIPELINESPROC, glGenProgramPipelines);
228declare(PFNGLBINDPROGRAMPIPELINEPROC, glBindProgramPipeline);
229declare(PFNGLUSEPROGRAMSTAGESPROC, glUseProgramStages);
230declare(PFNGLDELETEPROGRAMPIPELINESPROC, glDeleteProgramPipelines);
231declare(PFNGLPROGRAMPARAMETERIPROC, glProgramParameteri);
232declare(PFNGLCREATESHADERPROGRAMVPROC, glCreateShaderProgramv);
233
234declare(PFNGLGETBUFFERPARAMETERIVPROC, glGetBufferParameteriv);
235declare(PFNGLGETBUFFERPARAMETERI64VPROC, glGetBufferParameteri64v);
236declare(PFNGLGETBUFFERPOINTERVPROC, glGetBufferPointerv);
237
238declare(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
252declare(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer);
253declare(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers);
254declare(PFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer);
255declare(PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage);
256declare(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample);
257declare(PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers);
258
259declare(PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC, glFramebufferTextureMultiviewOVR);
260#else
261#pragma(error, "Neither GL or GLES is enabled in GLFunctions.h")
262#endif
263#undef declare