1// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2//
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#ifndef libGLESv2_hpp
16#define libGLESv2_hpp
17
18#include <GLES/gl.h>
19#include <GLES/glext.h>
20#include <EGL/egl.h>
21
22#include "Common/SharedLibrary.hpp"
23
24namespace sw
25{
26class FrameBuffer;
27enum Format : unsigned char;
28}
29
30namespace egl
31{
32class Display;
33class Context;
34class Image;
35class Config;
36class ClientBuffer;
37}
38
39class LibGLESv2exports
40{
41public:
42 LibGLESv2exports();
43
44 void (GL_APIENTRY *glActiveTexture)(GLenum texture);
45 void (GL_APIENTRY *glAttachShader)(GLuint program, GLuint shader);
46 void (GL_APIENTRY *glBeginQueryEXT)(GLenum target, GLuint name);
47 void (GL_APIENTRY *glBindAttribLocation)(GLuint program, GLuint index, const GLchar* name);
48 void (GL_APIENTRY *glBindBuffer)(GLenum target, GLuint buffer);
49 void (GL_APIENTRY *glBindFramebuffer)(GLenum target, GLuint framebuffer);
50 void (GL_APIENTRY *glBindRenderbuffer)(GLenum target, GLuint renderbuffer);
51 void (GL_APIENTRY *glBindTexture)(GLenum target, GLuint texture);
52 void (GL_APIENTRY *glBlendColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
53 void (GL_APIENTRY *glBlendEquation)(GLenum mode);
54 void (GL_APIENTRY *glBlendEquationSeparate)(GLenum modeRGB, GLenum modeAlpha);
55 void (GL_APIENTRY *glBlendFunc)(GLenum sfactor, GLenum dfactor);
56 void (GL_APIENTRY *glBlendFuncSeparate)(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
57 void (GL_APIENTRY *glBufferData)(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);
58 void (GL_APIENTRY *glBufferSubData)(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);
59 GLenum (GL_APIENTRY *glCheckFramebufferStatus)(GLenum target);
60 void (GL_APIENTRY *glClear)(GLbitfield mask);
61 void (GL_APIENTRY *glClearColor)(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
62 void (GL_APIENTRY *glClearDepthf)(GLclampf depth);
63 void (GL_APIENTRY *glClearStencil)(GLint s);
64 void (GL_APIENTRY *glColorMask)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
65 void (GL_APIENTRY *glCompileShader)(GLuint shader);
66 void (GL_APIENTRY *glCompressedTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height,
67 GLint border, GLsizei imageSize, const GLvoid* data);
68 void (GL_APIENTRY *glCompressedTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
69 GLenum format, GLsizei imageSize, const GLvoid* data);
70 void (GL_APIENTRY *glCopyTexImage2D)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
71 void (GL_APIENTRY *glCopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
72 GLuint (GL_APIENTRY *glCreateProgram)(void);
73 GLuint (GL_APIENTRY *glCreateShader)(GLenum type);
74 void (GL_APIENTRY *glCullFace)(GLenum mode);
75 void (GL_APIENTRY *glDeleteBuffers)(GLsizei n, const GLuint* buffers);
76 void (GL_APIENTRY *glDeleteFencesNV)(GLsizei n, const GLuint* fences);
77 void (GL_APIENTRY *glDeleteFramebuffers)(GLsizei n, const GLuint* framebuffers);
78 void (GL_APIENTRY *glDeleteProgram)(GLuint program);
79 void (GL_APIENTRY *glDeleteQueriesEXT)(GLsizei n, const GLuint *ids);
80 void (GL_APIENTRY *glDeleteRenderbuffers)(GLsizei n, const GLuint* renderbuffers);
81 void (GL_APIENTRY *glDeleteShader)(GLuint shader);
82 void (GL_APIENTRY *glDeleteTextures)(GLsizei n, const GLuint* textures);
83 void (GL_APIENTRY *glDepthFunc)(GLenum func);
84 void (GL_APIENTRY *glDepthMask)(GLboolean flag);
85 void (GL_APIENTRY *glDepthRangef)(GLclampf zNear, GLclampf zFar);
86 void (GL_APIENTRY *glDetachShader)(GLuint program, GLuint shader);
87 void (GL_APIENTRY *glDisable)(GLenum cap);
88 void (GL_APIENTRY *glDisableVertexAttribArray)(GLuint index);
89 void (GL_APIENTRY *glDrawArrays)(GLenum mode, GLint first, GLsizei count);
90 void (GL_APIENTRY *glDrawElements)(GLenum mode, GLsizei count, GLenum type, const GLvoid* indices);
91 void (GL_APIENTRY *glDrawArraysInstancedEXT)(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount);
92 void (GL_APIENTRY *glDrawElementsInstancedEXT)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instanceCount);
93 void (GL_APIENTRY *glVertexAttribDivisorEXT)(GLuint index, GLuint divisor);
94 void (GL_APIENTRY *glDrawArraysInstancedANGLE)(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount);
95 void (GL_APIENTRY *glDrawElementsInstancedANGLE)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instanceCount);
96 void (GL_APIENTRY *glVertexAttribDivisorANGLE)(GLuint index, GLuint divisor);
97 void (GL_APIENTRY *glEnable)(GLenum cap);
98 void (GL_APIENTRY *glEnableVertexAttribArray)(GLuint index);
99 void (GL_APIENTRY *glEndQueryEXT)(GLenum target);
100 void (GL_APIENTRY *glFinishFenceNV)(GLuint fence);
101 void (GL_APIENTRY *glFinish)(void);
102 void (GL_APIENTRY *glFlush)(void);
103 void (GL_APIENTRY *glFramebufferRenderbuffer)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
104 void (GL_APIENTRY *glFramebufferTexture2D)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
105 void (GL_APIENTRY *glFrontFace)(GLenum mode);
106 void (GL_APIENTRY *glGenBuffers)(GLsizei n, GLuint* buffers);
107 void (GL_APIENTRY *glGenerateMipmap)(GLenum target);
108 void (GL_APIENTRY *glGenFencesNV)(GLsizei n, GLuint* fences);
109 void (GL_APIENTRY *glGenFramebuffers)(GLsizei n, GLuint* framebuffers);
110 void (GL_APIENTRY *glGenQueriesEXT)(GLsizei n, GLuint* ids);
111 void (GL_APIENTRY *glGenRenderbuffers)(GLsizei n, GLuint* renderbuffers);
112 void (GL_APIENTRY *glGenTextures)(GLsizei n, GLuint* textures);
113 void (GL_APIENTRY *glGetActiveAttrib)(GLuint program, GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name);
114 void (GL_APIENTRY *glGetActiveUniform)(GLuint program, GLuint index, GLsizei bufsize, GLsizei* length, GLint* size, GLenum* type, GLchar* name);
115 void (GL_APIENTRY *glGetAttachedShaders)(GLuint program, GLsizei maxcount, GLsizei* count, GLuint* shaders);
116 int (GL_APIENTRY *glGetAttribLocation)(GLuint program, const GLchar* name);
117 void (GL_APIENTRY *glGetBooleanv)(GLenum pname, GLboolean* params);
118 void (GL_APIENTRY *glGetBufferParameteriv)(GLenum target, GLenum pname, GLint* params);
119 GLenum (GL_APIENTRY *glGetError)(void);
120 void (GL_APIENTRY *glGetFenceivNV)(GLuint fence, GLenum pname, GLint *params);
121 void (GL_APIENTRY *glGetFloatv)(GLenum pname, GLfloat* params);
122 void (GL_APIENTRY *glGetFramebufferAttachmentParameteriv)(GLenum target, GLenum attachment, GLenum pname, GLint* params);
123 GLenum (GL_APIENTRY *glGetGraphicsResetStatusEXT)(void);
124 void (GL_APIENTRY *glGetIntegerv)(GLenum pname, GLint* params);
125 void (GL_APIENTRY *glGetProgramiv)(GLuint program, GLenum pname, GLint* params);
126 void (GL_APIENTRY *glGetProgramInfoLog)(GLuint program, GLsizei bufsize, GLsizei* length, GLchar* infolog);
127 void (GL_APIENTRY *glGetQueryivEXT)(GLenum target, GLenum pname, GLint *params);
128 void (GL_APIENTRY *glGetQueryObjectuivEXT)(GLuint name, GLenum pname, GLuint *params);
129 void (GL_APIENTRY *glGetRenderbufferParameteriv)(GLenum target, GLenum pname, GLint* params);
130 void (GL_APIENTRY *glGetShaderiv)(GLuint shader, GLenum pname, GLint* params);
131 void (GL_APIENTRY *glGetShaderInfoLog)(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* infolog);
132 void (GL_APIENTRY *glGetShaderPrecisionFormat)(GLenum shadertype, GLenum precisiontype, GLint* range, GLint* precision);
133 void (GL_APIENTRY *glGetShaderSource)(GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source);
134 const GLubyte* (GL_APIENTRY *glGetString)(GLenum name);
135 void (GL_APIENTRY *glGetTexParameterfv)(GLenum target, GLenum pname, GLfloat* params);
136 void (GL_APIENTRY *glGetTexParameteriv)(GLenum target, GLenum pname, GLint* params);
137 void (GL_APIENTRY *glGetnUniformfvEXT)(GLuint program, GLint location, GLsizei bufSize, GLfloat* params);
138 void (GL_APIENTRY *glGetUniformfv)(GLuint program, GLint location, GLfloat* params);
139 void (GL_APIENTRY *glGetnUniformivEXT)(GLuint program, GLint location, GLsizei bufSize, GLint* params);
140 void (GL_APIENTRY *glGetUniformiv)(GLuint program, GLint location, GLint* params);
141 int (GL_APIENTRY *glGetUniformLocation)(GLuint program, const GLchar* name);
142 void (GL_APIENTRY *glGetVertexAttribfv)(GLuint index, GLenum pname, GLfloat* params);
143 void (GL_APIENTRY *glGetVertexAttribiv)(GLuint index, GLenum pname, GLint* params);
144 void (GL_APIENTRY *glGetVertexAttribPointerv)(GLuint index, GLenum pname, GLvoid** pointer);
145 void (GL_APIENTRY *glHint)(GLenum target, GLenum mode);
146 GLboolean (GL_APIENTRY *glIsBuffer)(GLuint buffer);
147 GLboolean (GL_APIENTRY *glIsEnabled)(GLenum cap);
148 GLboolean (GL_APIENTRY *glIsFenceNV)(GLuint fence);
149 GLboolean (GL_APIENTRY *glIsFramebuffer)(GLuint framebuffer);
150 GLboolean (GL_APIENTRY *glIsProgram)(GLuint program);
151 GLboolean (GL_APIENTRY *glIsQueryEXT)(GLuint name);
152 GLboolean (GL_APIENTRY *glIsRenderbuffer)(GLuint renderbuffer);
153 GLboolean (GL_APIENTRY *glIsShader)(GLuint shader);
154 GLboolean (GL_APIENTRY *glIsTexture)(GLuint texture);
155 void (GL_APIENTRY *glLineWidth)(GLfloat width);
156 void (GL_APIENTRY *glLinkProgram)(GLuint program);
157 void (GL_APIENTRY *glPixelStorei)(GLenum pname, GLint param);
158 void (GL_APIENTRY *glPolygonOffset)(GLfloat factor, GLfloat units);
159 void (GL_APIENTRY *glReadnPixelsEXT)(GLint x, GLint y, GLsizei width, GLsizei height,
160 GLenum format, GLenum type, GLsizei bufSize, GLvoid *data);
161 void (GL_APIENTRY *glReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);
162 void (GL_APIENTRY *glReleaseShaderCompiler)(void);
163 void (GL_APIENTRY *glRenderbufferStorageMultisample)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
164 void (GL_APIENTRY *glRenderbufferStorageMultisampleANGLE)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
165 void (GL_APIENTRY *glRenderbufferStorage)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
166 void (GL_APIENTRY *glSampleCoverage)(GLclampf value, GLboolean invert);
167 void (GL_APIENTRY *glSetFenceNV)(GLuint fence, GLenum condition);
168 void (GL_APIENTRY *glScissor)(GLint x, GLint y, GLsizei width, GLsizei height);
169 void (GL_APIENTRY *glShaderBinary)(GLsizei n, const GLuint* shaders, GLenum binaryformat, const GLvoid* binary, GLsizei length);
170 void (GL_APIENTRY *glShaderSource)(GLuint shader, GLsizei count, const GLchar *const *string, const GLint *length);
171 void (GL_APIENTRY *glStencilFunc)(GLenum func, GLint ref, GLuint mask);
172 void (GL_APIENTRY *glStencilFuncSeparate)(GLenum face, GLenum func, GLint ref, GLuint mask);
173 void (GL_APIENTRY *glStencilMask)(GLuint mask);
174 void (GL_APIENTRY *glStencilMaskSeparate)(GLenum face, GLuint mask);
175 void (GL_APIENTRY *glStencilOp)(GLenum fail, GLenum zfail, GLenum zpass);
176 void (GL_APIENTRY *glStencilOpSeparate)(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
177 GLboolean (GL_APIENTRY *glTestFenceNV)(GLuint fence);
178 void (GL_APIENTRY *glTexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height,
179 GLint border, GLenum format, GLenum type, const GLvoid* pixels);
180 void (GL_APIENTRY *glTexParameterf)(GLenum target, GLenum pname, GLfloat param);
181 void (GL_APIENTRY *glTexParameterfv)(GLenum target, GLenum pname, const GLfloat* params);
182 void (GL_APIENTRY *glTexParameteri)(GLenum target, GLenum pname, GLint param);
183 void (GL_APIENTRY *glTexParameteriv)(GLenum target, GLenum pname, const GLint* params);
184 void (GL_APIENTRY *glTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height,
185 GLenum format, GLenum type, const GLvoid* pixels);
186 void (GL_APIENTRY *glUniform1f)(GLint location, GLfloat x);
187 void (GL_APIENTRY *glUniform1fv)(GLint location, GLsizei count, const GLfloat* v);
188 void (GL_APIENTRY *glUniform1i)(GLint location, GLint x);
189 void (GL_APIENTRY *glUniform1iv)(GLint location, GLsizei count, const GLint* v);
190 void (GL_APIENTRY *glUniform2f)(GLint location, GLfloat x, GLfloat y);
191 void (GL_APIENTRY *glUniform2fv)(GLint location, GLsizei count, const GLfloat* v);
192 void (GL_APIENTRY *glUniform2i)(GLint location, GLint x, GLint y);
193 void (GL_APIENTRY *glUniform2iv)(GLint location, GLsizei count, const GLint* v);
194 void (GL_APIENTRY *glUniform3f)(GLint location, GLfloat x, GLfloat y, GLfloat z);
195 void (GL_APIENTRY *glUniform3fv)(GLint location, GLsizei count, const GLfloat* v);
196 void (GL_APIENTRY *glUniform3i)(GLint location, GLint x, GLint y, GLint z);
197 void (GL_APIENTRY *glUniform3iv)(GLint location, GLsizei count, const GLint* v);
198 void (GL_APIENTRY *glUniform4f)(GLint location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
199 void (GL_APIENTRY *glUniform4fv)(GLint location, GLsizei count, const GLfloat* v);
200 void (GL_APIENTRY *glUniform4i)(GLint location, GLint x, GLint y, GLint z, GLint w);
201 void (GL_APIENTRY *glUniform4iv)(GLint location, GLsizei count, const GLint* v);
202 void (GL_APIENTRY *glUniformMatrix2fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
203 void (GL_APIENTRY *glUniformMatrix3fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
204 void (GL_APIENTRY *glUniformMatrix4fv)(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
205 void (GL_APIENTRY *glUseProgram)(GLuint program);
206 void (GL_APIENTRY *glValidateProgram)(GLuint program);
207 void (GL_APIENTRY *glVertexAttrib1f)(GLuint index, GLfloat x);
208 void (GL_APIENTRY *glVertexAttrib1fv)(GLuint index, const GLfloat* values);
209 void (GL_APIENTRY *glVertexAttrib2f)(GLuint index, GLfloat x, GLfloat y);
210 void (GL_APIENTRY *glVertexAttrib2fv)(GLuint index, const GLfloat* values);
211 void (GL_APIENTRY *glVertexAttrib3f)(GLuint index, GLfloat x, GLfloat y, GLfloat z);
212 void (GL_APIENTRY *glVertexAttrib3fv)(GLuint index, const GLfloat* values);
213 void (GL_APIENTRY *glVertexAttrib4f)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
214 void (GL_APIENTRY *glVertexAttrib4fv)(GLuint index, const GLfloat* values);
215 void (GL_APIENTRY *glVertexAttribPointer)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr);
216 void (GL_APIENTRY *glViewport)(GLint x, GLint y, GLsizei width, GLsizei height);
217 void (GL_APIENTRY *glBlitFramebufferNV)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
218 void (GL_APIENTRY *glBlitFramebufferANGLE)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
219 GLbitfield mask, GLenum filter);
220 void (GL_APIENTRY *glTexImage3DOES)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth,
221 GLint border, GLenum format, GLenum type, const GLvoid* pixels);
222 void (GL_APIENTRY *glTexSubImage3DOES)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels);
223 void (GL_APIENTRY *glCopyTexSubImage3DOES)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
224 void (GL_APIENTRY *glCompressedTexImage3DOES)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data);
225 void (GL_APIENTRY *glCompressedTexSubImage3DOES)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data);
226 void (GL_APIENTRY *glFramebufferTexture3DOES)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
227 void (GL_APIENTRY *glEGLImageTargetTexture2DOES)(GLenum target, GLeglImageOES image);
228 void (GL_APIENTRY *glEGLImageTargetRenderbufferStorageOES)(GLenum target, GLeglImageOES image);
229 GLboolean (GL_APIENTRY *glIsRenderbufferOES)(GLuint renderbuffer);
230 void (GL_APIENTRY *glBindRenderbufferOES)(GLenum target, GLuint renderbuffer);
231 void (GL_APIENTRY *glDeleteRenderbuffersOES)(GLsizei n, const GLuint* renderbuffers);
232 void (GL_APIENTRY *glGenRenderbuffersOES)(GLsizei n, GLuint* renderbuffers);
233 void (GL_APIENTRY *glRenderbufferStorageOES)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
234 void (GL_APIENTRY *glGetRenderbufferParameterivOES)(GLenum target, GLenum pname, GLint* params);
235 GLboolean (GL_APIENTRY *glIsFramebufferOES)(GLuint framebuffer);
236 void (GL_APIENTRY *glBindFramebufferOES)(GLenum target, GLuint framebuffer);
237 void (GL_APIENTRY *glDeleteFramebuffersOES)(GLsizei n, const GLuint* framebuffers);
238 void (GL_APIENTRY *glGenFramebuffersOES)(GLsizei n, GLuint* framebuffers);
239 GLenum (GL_APIENTRY *glCheckFramebufferStatusOES)(GLenum target);
240 void (GL_APIENTRY *glFramebufferRenderbufferOES)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
241 void (GL_APIENTRY *glFramebufferTexture2DOES)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
242 void (GL_APIENTRY *glGetFramebufferAttachmentParameterivOES)(GLenum target, GLenum attachment, GLenum pname, GLint* params);
243 void (GL_APIENTRY *glGenerateMipmapOES)(GLenum target);
244 void (GL_APIENTRY *glDrawBuffersEXT)(GLsizei n, const GLenum *bufs);
245
246 egl::Context *(*es2CreateContext)(egl::Display *display, const egl::Context *shareContext, const egl::Config *config);
247 __eglMustCastToProperFunctionPointerType (*es2GetProcAddress)(const char *procname);
248 egl::Image *(*createBackBuffer)(int width, int height, sw::Format format, int multiSampleDepth);
249 egl::Image *(*createBackBufferFromClientBuffer)(const egl::ClientBuffer& clientBuffer);
250 egl::Image *(*createDepthStencil)(int width, int height, sw::Format format, int multiSampleDepth);
251 sw::FrameBuffer *(*createFrameBuffer)(void *nativeDisplay, EGLNativeWindowType window, int width, int height);
252};
253
254class LibGLESv2
255{
256public:
257 LibGLESv2()
258 {
259 }
260
261 ~LibGLESv2()
262 {
263 freeLibrary(libGLESv2);
264 }
265
266 operator bool()
267 {
268 return loadExports() != nullptr;
269 }
270
271 LibGLESv2exports *operator->()
272 {
273 return loadExports();
274 }
275
276private:
277 LibGLESv2exports *loadExports()
278 {
279 if(!loadLibraryAttempted && !libGLESv2)
280 {
281 #if defined(_WIN32)
282 #if defined(__LP64__)
283 const char *libGLESv2_lib[] = {"libswiftshader_libGLESv2.dll", "libGLESv2.dll", "lib64GLES_V2_translator.dll"};
284 #else
285 const char *libGLESv2_lib[] = {"libswiftshader_libGLESv2.dll", "libGLESv2.dll", "libGLES_V2_translator.dll"};
286 #endif
287 #elif defined(__ANDROID__)
288 const char *libGLESv2_lib[] = {"libGLESv2_swiftshader.so", "libGLESv2_swiftshader.so"};
289 #elif defined(__linux__)
290 #if defined(__LP64__)
291 const char *libGLESv2_lib[] = {"lib64GLES_V2_translator.so", "libGLESv2.so.2", "libGLESv2.so"};
292 #else
293 const char *libGLESv2_lib[] = {"libGLES_V2_translator.so", "libGLESv2.so.2", "libGLESv2.so"};
294 #endif
295 #elif defined(__APPLE__)
296 #if defined(__LP64__)
297 const char *libGLESv2_lib[] = {"libswiftshader_libGLESv2.dylib", "lib64GLES_V2_translator.dylib", "libGLESv2.dylib"};
298 #else
299 const char *libGLESv2_lib[] = {"libswiftshader_libGLESv2.dylib", "libGLES_V2_translator.dylib", "libGLESv2.dylib"};
300 #endif
301 #elif defined(__Fuchsia__)
302 const char *libGLESv2_lib[] = {"libswiftshader_libGLESv2.so", "libGLESv2.so"};
303 #else
304 #error "libGLESv2::loadExports unimplemented for this platform"
305 #endif
306
307 std::string directory = getModuleDirectory();
308 libGLESv2 = loadLibrary(directory, libGLESv2_lib, "libGLESv2_swiftshader");
309
310 if(libGLESv2)
311 {
312 auto libGLESv2_swiftshader = (LibGLESv2exports *(*)())getProcAddress(libGLESv2, "libGLESv2_swiftshader");
313 libGLESv2exports = libGLESv2_swiftshader();
314 }
315
316 loadLibraryAttempted = true;
317 }
318
319 return libGLESv2exports;
320 }
321
322 void *libGLESv2 = nullptr;
323 LibGLESv2exports *libGLESv2exports = nullptr;
324 bool loadLibraryAttempted = false;
325};
326
327#endif // libGLESv2_hpp
328