1 /*
2  * Copyright 2013 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "ppsspp_config.h"
18 
19 #include "Common/GPU/OpenGL/GLCommon.h"
20 
21 #if defined(USING_GLES2)
22 #if !PPSSPP_PLATFORM(IOS)
23 #include "EGL/egl.h"
24 
25 GLboolean gl3stubInit() {
26     #define FIND_PROC(s) s = (void*)eglGetProcAddress(#s)
27     FIND_PROC(glReadBuffer);
28     FIND_PROC(glDrawRangeElements);
29     FIND_PROC(glTexImage3D);
30     FIND_PROC(glTexSubImage3D);
31     FIND_PROC(glCopyTexSubImage3D);
32     FIND_PROC(glCompressedTexImage3D);
33     FIND_PROC(glCompressedTexSubImage3D);
34     FIND_PROC(glGenQueries);
35     FIND_PROC(glDeleteQueries);
36     FIND_PROC(glIsQuery);
37     FIND_PROC(glBeginQuery);
38     FIND_PROC(glEndQuery);
39     FIND_PROC(glGetQueryiv);
40     FIND_PROC(glGetQueryObjectuiv);
41     FIND_PROC(glUnmapBuffer);
42     FIND_PROC(glGetBufferPointerv);
43     FIND_PROC(glDrawBuffers);
44     FIND_PROC(glUniformMatrix2x3fv);
45     FIND_PROC(glUniformMatrix3x2fv);
46     FIND_PROC(glUniformMatrix2x4fv);
47     FIND_PROC(glUniformMatrix4x2fv);
48     FIND_PROC(glUniformMatrix3x4fv);
49     FIND_PROC(glUniformMatrix4x3fv);
50     FIND_PROC(glBlitFramebuffer);
51     FIND_PROC(glRenderbufferStorageMultisample);
52     FIND_PROC(glFramebufferTextureLayer);
53     FIND_PROC(glMapBufferRange);
54     FIND_PROC(glFlushMappedBufferRange);
55     FIND_PROC(glBindVertexArray);
56     FIND_PROC(glDeleteVertexArrays);
57     FIND_PROC(glGenVertexArrays);
58     FIND_PROC(glIsVertexArray);
59     FIND_PROC(glGetIntegeri_v);
60     FIND_PROC(glBeginTransformFeedback);
61     FIND_PROC(glEndTransformFeedback);
62     FIND_PROC(glBindBufferRange);
63     FIND_PROC(glBindBufferBase);
64     FIND_PROC(glTransformFeedbackVaryings);
65     FIND_PROC(glGetTransformFeedbackVarying);
66     FIND_PROC(glVertexAttribIPointer);
67     FIND_PROC(glGetVertexAttribIiv);
68     FIND_PROC(glGetVertexAttribIuiv);
69     FIND_PROC(glVertexAttribI4i);
70     FIND_PROC(glVertexAttribI4ui);
71     FIND_PROC(glVertexAttribI4iv);
72     FIND_PROC(glVertexAttribI4uiv);
73     FIND_PROC(glGetUniformuiv);
74     FIND_PROC(glGetFragDataLocation);
75     FIND_PROC(glUniform1ui);
76     FIND_PROC(glUniform2ui);
77     FIND_PROC(glUniform3ui);
78     FIND_PROC(glUniform4ui);
79     FIND_PROC(glUniform1uiv);
80     FIND_PROC(glUniform2uiv);
81     FIND_PROC(glUniform3uiv);
82     FIND_PROC(glUniform4uiv);
83     FIND_PROC(glClearBufferiv);
84     FIND_PROC(glClearBufferuiv);
85     FIND_PROC(glClearBufferfv);
86     FIND_PROC(glClearBufferfi);
87     FIND_PROC(glGetStringi);
88     FIND_PROC(glCopyBufferSubData);
89     FIND_PROC(glGetUniformIndices);
90     FIND_PROC(glGetActiveUniformsiv);
91     FIND_PROC(glGetUniformBlockIndex);
92     FIND_PROC(glGetActiveUniformBlockiv);
93     FIND_PROC(glGetActiveUniformBlockName);
94     FIND_PROC(glUniformBlockBinding);
95     FIND_PROC(glDrawArraysInstanced);
96     FIND_PROC(glDrawElementsInstanced);
97     FIND_PROC(glFenceSync);
98     FIND_PROC(glIsSync);
99     FIND_PROC(glDeleteSync);
100     FIND_PROC(glClientWaitSync);
101     FIND_PROC(glWaitSync);
102     FIND_PROC(glGetInteger64v);
103     FIND_PROC(glGetSynciv);
104     FIND_PROC(glGetInteger64i_v);
105     FIND_PROC(glGetBufferParameteri64v);
106     FIND_PROC(glGenSamplers);
107     FIND_PROC(glDeleteSamplers);
108     FIND_PROC(glIsSampler);
109     FIND_PROC(glBindSampler);
110     FIND_PROC(glSamplerParameteri);
111     FIND_PROC(glSamplerParameteriv);
112     FIND_PROC(glSamplerParameterf);
113     FIND_PROC(glSamplerParameterfv);
114     FIND_PROC(glGetSamplerParameteriv);
115     FIND_PROC(glGetSamplerParameterfv);
116     FIND_PROC(glVertexAttribDivisor);
117     FIND_PROC(glBindTransformFeedback);
118     FIND_PROC(glDeleteTransformFeedbacks);
119     FIND_PROC(glGenTransformFeedbacks);
120     FIND_PROC(glIsTransformFeedback);
121     FIND_PROC(glPauseTransformFeedback);
122     FIND_PROC(glResumeTransformFeedback);
123     FIND_PROC(glGetProgramBinary);
124     FIND_PROC(glProgramBinary);
125     FIND_PROC(glProgramParameteri);
126     FIND_PROC(glInvalidateFramebuffer);
127     FIND_PROC(glInvalidateSubFramebuffer);
128     FIND_PROC(glTexStorage2D);
129     FIND_PROC(glTexStorage3D);
130     FIND_PROC(glGetInternalformativ);
131 
132     /* EXT_blend_func_extended */
133     FIND_PROC(glBindFragDataLocationIndexedEXT);
134     FIND_PROC(glBindFragDataLocationEXT);
135     FIND_PROC(glGetProgramResourceLocationIndexEXT);
136     FIND_PROC(glGetFragDataIndexEXT);
137 
138 #ifdef GL_EXT_buffer_storage
139     /* EXT_buffer_storage */
140     FIND_PROC(glBufferStorageEXT);
141 #endif
142 
143     /* OES_copy_image, etc. */
144     FIND_PROC(glCopyImageSubDataOES);
145 
146     #undef FIND_PROC
147 
148     if (!glReadBuffer ||
149         !glDrawRangeElements ||
150         !glTexImage3D ||
151         !glTexSubImage3D ||
152         !glCopyTexSubImage3D ||
153         !glCompressedTexImage3D ||
154         !glCompressedTexSubImage3D ||
155         !glGenQueries ||
156         !glDeleteQueries ||
157         !glIsQuery ||
158         !glBeginQuery ||
159         !glEndQuery ||
160         !glGetQueryiv ||
161         !glGetQueryObjectuiv ||
162         !glUnmapBuffer ||
163         !glGetBufferPointerv ||
164         !glDrawBuffers ||
165         !glUniformMatrix2x3fv ||
166         !glUniformMatrix3x2fv ||
167         !glUniformMatrix2x4fv ||
168         !glUniformMatrix4x2fv ||
169         !glUniformMatrix3x4fv ||
170         !glUniformMatrix4x3fv ||
171         !glBlitFramebuffer ||
172         !glRenderbufferStorageMultisample ||
173         !glFramebufferTextureLayer ||
174         !glMapBufferRange ||
175         !glFlushMappedBufferRange ||
176         !glBindVertexArray ||
177         !glDeleteVertexArrays ||
178         !glGenVertexArrays ||
179         !glIsVertexArray ||
180         !glGetIntegeri_v ||
181         !glBeginTransformFeedback ||
182         !glEndTransformFeedback ||
183         !glBindBufferRange ||
184         !glBindBufferBase ||
185         !glTransformFeedbackVaryings ||
186         !glGetTransformFeedbackVarying ||
187         !glVertexAttribIPointer ||
188         !glGetVertexAttribIiv ||
189         !glGetVertexAttribIuiv ||
190         !glVertexAttribI4i ||
191         !glVertexAttribI4ui ||
192         !glVertexAttribI4iv ||
193         !glVertexAttribI4uiv ||
194         !glGetUniformuiv ||
195         !glGetFragDataLocation ||
196         !glUniform1ui ||
197         !glUniform2ui ||
198         !glUniform3ui ||
199         !glUniform4ui ||
200         !glUniform1uiv ||
201         !glUniform2uiv ||
202         !glUniform3uiv ||
203         !glUniform4uiv ||
204         !glClearBufferiv ||
205         !glClearBufferuiv ||
206         !glClearBufferfv ||
207         !glClearBufferfi ||
208         !glGetStringi ||
209         !glCopyBufferSubData ||
210         !glGetUniformIndices ||
211         !glGetActiveUniformsiv ||
212         !glGetUniformBlockIndex ||
213         !glGetActiveUniformBlockiv ||
214         !glGetActiveUniformBlockName ||
215         !glUniformBlockBinding ||
216         !glDrawArraysInstanced ||
217         !glDrawElementsInstanced ||
218         !glFenceSync ||
219         !glIsSync ||
220         !glDeleteSync ||
221         !glClientWaitSync ||
222         !glWaitSync ||
223         !glGetInteger64v ||
224         !glGetSynciv ||
225         !glGetInteger64i_v ||
226         !glGetBufferParameteri64v ||
227         !glGenSamplers ||
228         !glDeleteSamplers ||
229         !glIsSampler ||
230         !glBindSampler ||
231         !glSamplerParameteri ||
232         !glSamplerParameteriv ||
233         !glSamplerParameterf ||
234         !glSamplerParameterfv ||
235         !glGetSamplerParameteriv ||
236         !glGetSamplerParameterfv ||
237         !glVertexAttribDivisor ||
238         !glBindTransformFeedback ||
239         !glDeleteTransformFeedbacks ||
240         !glGenTransformFeedbacks ||
241         !glIsTransformFeedback ||
242         !glPauseTransformFeedback ||
243         !glResumeTransformFeedback ||
244         !glGetProgramBinary ||
245         !glProgramBinary ||
246         !glProgramParameteri ||
247         !glInvalidateFramebuffer ||
248         !glInvalidateSubFramebuffer ||
249         !glTexStorage2D ||
250         !glTexStorage3D ||
251         !glGetInternalformativ)
252     {
253         return GL_FALSE;
254     }
255 
256     return GL_TRUE;
257 }
258 
259 /* Function pointer definitions */
260 GL_APICALL void           (* GL_APIENTRY glReadBuffer) (GLenum mode);
261 GL_APICALL void           (* GL_APIENTRY glDrawRangeElements) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid* indices);
262 GL_APICALL void           (* GL_APIENTRY glTexImage3D) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels);
263 GL_APICALL void           (* GL_APIENTRY glTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels);
264 GL_APICALL void           (* GL_APIENTRY glCopyTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
265 GL_APICALL void           (* GL_APIENTRY glCompressedTexImage3D) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data);
266 GL_APICALL void           (* GL_APIENTRY glCompressedTexSubImage3D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data);
267 GL_APICALL void           (* GL_APIENTRY glGenQueries) (GLsizei n, GLuint* ids);
268 GL_APICALL void           (* GL_APIENTRY glDeleteQueries) (GLsizei n, const GLuint* ids);
269 GL_APICALL GLboolean      (* GL_APIENTRY glIsQuery) (GLuint id);
270 GL_APICALL void           (* GL_APIENTRY glBeginQuery) (GLenum target, GLuint id);
271 GL_APICALL void           (* GL_APIENTRY glEndQuery) (GLenum target);
272 GL_APICALL void           (* GL_APIENTRY glGetQueryiv) (GLenum target, GLenum pname, GLint* params);
273 GL_APICALL void           (* GL_APIENTRY glGetQueryObjectuiv) (GLuint id, GLenum pname, GLuint* params);
274 GL_APICALL GLboolean      (* GL_APIENTRY glUnmapBuffer) (GLenum target);
275 GL_APICALL void           (* GL_APIENTRY glGetBufferPointerv) (GLenum target, GLenum pname, GLvoid** params);
276 GL_APICALL void           (* GL_APIENTRY glDrawBuffers) (GLsizei n, const GLenum* bufs);
277 GL_APICALL void           (* GL_APIENTRY glUniformMatrix2x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
278 GL_APICALL void           (* GL_APIENTRY glUniformMatrix3x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
279 GL_APICALL void           (* GL_APIENTRY glUniformMatrix2x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
280 GL_APICALL void           (* GL_APIENTRY glUniformMatrix4x2fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
281 GL_APICALL void           (* GL_APIENTRY glUniformMatrix3x4fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
282 GL_APICALL void           (* GL_APIENTRY glUniformMatrix4x3fv) (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
283 GL_APICALL void           (* GL_APIENTRY glBlitFramebuffer) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
284 GL_APICALL void           (* GL_APIENTRY glRenderbufferStorageMultisample) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
285 GL_APICALL void           (* GL_APIENTRY glFramebufferTextureLayer) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer);
286 GL_APICALL GLvoid*        (* GL_APIENTRY glMapBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
287 GL_APICALL void           (* GL_APIENTRY glFlushMappedBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length);
288 GL_APICALL void           (* GL_APIENTRY glBindVertexArray) (GLuint array);
289 GL_APICALL void           (* GL_APIENTRY glDeleteVertexArrays) (GLsizei n, const GLuint* arrays);
290 GL_APICALL void           (* GL_APIENTRY glGenVertexArrays) (GLsizei n, GLuint* arrays);
291 GL_APICALL GLboolean      (* GL_APIENTRY glIsVertexArray) (GLuint array);
292 GL_APICALL void           (* GL_APIENTRY glGetIntegeri_v) (GLenum target, GLuint index, GLint* data);
293 GL_APICALL void           (* GL_APIENTRY glBeginTransformFeedback) (GLenum primitiveMode);
294 GL_APICALL void           (* GL_APIENTRY glEndTransformFeedback) (void);
295 GL_APICALL void           (* GL_APIENTRY glBindBufferRange) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size);
296 GL_APICALL void           (* GL_APIENTRY glBindBufferBase) (GLenum target, GLuint index, GLuint buffer);
297 GL_APICALL void           (* GL_APIENTRY glTransformFeedbackVaryings) (GLuint program, GLsizei count, const GLchar* const* varyings, GLenum bufferMode);
298 GL_APICALL void           (* GL_APIENTRY glGetTransformFeedbackVarying) (GLuint program, GLuint index, GLsizei bufSize, GLsizei* length, GLsizei* size, GLenum* type, GLchar* name);
299 GL_APICALL void           (* GL_APIENTRY glVertexAttribIPointer) (GLuint index, GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
300 GL_APICALL void           (* GL_APIENTRY glGetVertexAttribIiv) (GLuint index, GLenum pname, GLint* params);
301 GL_APICALL void           (* GL_APIENTRY glGetVertexAttribIuiv) (GLuint index, GLenum pname, GLuint* params);
302 GL_APICALL void           (* GL_APIENTRY glVertexAttribI4i) (GLuint index, GLint x, GLint y, GLint z, GLint w);
303 GL_APICALL void           (* GL_APIENTRY glVertexAttribI4ui) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
304 GL_APICALL void           (* GL_APIENTRY glVertexAttribI4iv) (GLuint index, const GLint* v);
305 GL_APICALL void           (* GL_APIENTRY glVertexAttribI4uiv) (GLuint index, const GLuint* v);
306 GL_APICALL void           (* GL_APIENTRY glGetUniformuiv) (GLuint program, GLint location, GLuint* params);
307 GL_APICALL GLint          (* GL_APIENTRY glGetFragDataLocation) (GLuint program, const GLchar *name);
308 GL_APICALL void           (* GL_APIENTRY glUniform1ui) (GLint location, GLuint v0);
309 GL_APICALL void           (* GL_APIENTRY glUniform2ui) (GLint location, GLuint v0, GLuint v1);
310 GL_APICALL void           (* GL_APIENTRY glUniform3ui) (GLint location, GLuint v0, GLuint v1, GLuint v2);
311 GL_APICALL void           (* GL_APIENTRY glUniform4ui) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
312 GL_APICALL void           (* GL_APIENTRY glUniform1uiv) (GLint location, GLsizei count, const GLuint* value);
313 GL_APICALL void           (* GL_APIENTRY glUniform2uiv) (GLint location, GLsizei count, const GLuint* value);
314 GL_APICALL void           (* GL_APIENTRY glUniform3uiv) (GLint location, GLsizei count, const GLuint* value);
315 GL_APICALL void           (* GL_APIENTRY glUniform4uiv) (GLint location, GLsizei count, const GLuint* value);
316 GL_APICALL void           (* GL_APIENTRY glClearBufferiv) (GLenum buffer, GLint drawbuffer, const GLint* value);
317 GL_APICALL void           (* GL_APIENTRY glClearBufferuiv) (GLenum buffer, GLint drawbuffer, const GLuint* value);
318 GL_APICALL void           (* GL_APIENTRY glClearBufferfv) (GLenum buffer, GLint drawbuffer, const GLfloat* value);
319 GL_APICALL void           (* GL_APIENTRY glClearBufferfi) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
320 GL_APICALL const GLubyte* (* GL_APIENTRY glGetStringi) (GLenum name, GLuint index);
321 GL_APICALL void           (* GL_APIENTRY glCopyBufferSubData) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size);
322 GL_APICALL void           (* GL_APIENTRY glGetUniformIndices) (GLuint program, GLsizei uniformCount, const GLchar* const* uniformNames, GLuint* uniformIndices);
323 GL_APICALL void           (* GL_APIENTRY glGetActiveUniformsiv) (GLuint program, GLsizei uniformCount, const GLuint* uniformIndices, GLenum pname, GLint* params);
324 GL_APICALL GLuint         (* GL_APIENTRY glGetUniformBlockIndex) (GLuint program, const GLchar* uniformBlockName);
325 GL_APICALL void           (* GL_APIENTRY glGetActiveUniformBlockiv) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);
326 GL_APICALL void           (* GL_APIENTRY glGetActiveUniformBlockName) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei* length, GLchar* uniformBlockName);
327 GL_APICALL void           (* GL_APIENTRY glUniformBlockBinding) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
328 GL_APICALL void           (* GL_APIENTRY glDrawArraysInstanced) (GLenum mode, GLint first, GLsizei count, GLsizei instanceCount);
329 GL_APICALL void           (* GL_APIENTRY glDrawElementsInstanced) (GLenum mode, GLsizei count, GLenum type, const GLvoid* indices, GLsizei instanceCount);
330 GL_APICALL GLsync         (* GL_APIENTRY glFenceSync) (GLenum condition, GLbitfield flags);
331 GL_APICALL GLboolean      (* GL_APIENTRY glIsSync) (GLsync sync);
332 GL_APICALL void           (* GL_APIENTRY glDeleteSync) (GLsync sync);
333 GL_APICALL GLenum         (* GL_APIENTRY glClientWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout);
334 GL_APICALL void           (* GL_APIENTRY glWaitSync) (GLsync sync, GLbitfield flags, GLuint64 timeout);
335 GL_APICALL void           (* GL_APIENTRY glGetInteger64v) (GLenum pname, GLint64* params);
336 GL_APICALL void           (* GL_APIENTRY glGetSynciv) (GLsync sync, GLenum pname, GLsizei bufSize, GLsizei* length, GLint* values);
337 GL_APICALL void           (* GL_APIENTRY glGetInteger64i_v) (GLenum target, GLuint index, GLint64* data);
338 GL_APICALL void           (* GL_APIENTRY glGetBufferParameteri64v) (GLenum target, GLenum pname, GLint64* params);
339 GL_APICALL void           (* GL_APIENTRY glGenSamplers) (GLsizei count, GLuint* samplers);
340 GL_APICALL void           (* GL_APIENTRY glDeleteSamplers) (GLsizei count, const GLuint* samplers);
341 GL_APICALL GLboolean      (* GL_APIENTRY glIsSampler) (GLuint sampler);
342 GL_APICALL void           (* GL_APIENTRY glBindSampler) (GLuint unit, GLuint sampler);
343 GL_APICALL void           (* GL_APIENTRY glSamplerParameteri) (GLuint sampler, GLenum pname, GLint param);
344 GL_APICALL void           (* GL_APIENTRY glSamplerParameteriv) (GLuint sampler, GLenum pname, const GLint* param);
345 GL_APICALL void           (* GL_APIENTRY glSamplerParameterf) (GLuint sampler, GLenum pname, GLfloat param);
346 GL_APICALL void           (* GL_APIENTRY glSamplerParameterfv) (GLuint sampler, GLenum pname, const GLfloat* param);
347 GL_APICALL void           (* GL_APIENTRY glGetSamplerParameteriv) (GLuint sampler, GLenum pname, GLint* params);
348 GL_APICALL void           (* GL_APIENTRY glGetSamplerParameterfv) (GLuint sampler, GLenum pname, GLfloat* params);
349 GL_APICALL void           (* GL_APIENTRY glVertexAttribDivisor) (GLuint index, GLuint divisor);
350 GL_APICALL void           (* GL_APIENTRY glBindTransformFeedback) (GLenum target, GLuint id);
351 GL_APICALL void           (* GL_APIENTRY glDeleteTransformFeedbacks) (GLsizei n, const GLuint* ids);
352 GL_APICALL void           (* GL_APIENTRY glGenTransformFeedbacks) (GLsizei n, GLuint* ids);
353 GL_APICALL GLboolean      (* GL_APIENTRY glIsTransformFeedback) (GLuint id);
354 GL_APICALL void           (* GL_APIENTRY glPauseTransformFeedback) (void);
355 GL_APICALL void           (* GL_APIENTRY glResumeTransformFeedback) (void);
356 GL_APICALL void           (* GL_APIENTRY glGetProgramBinary) (GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, GLvoid* binary);
357 GL_APICALL void           (* GL_APIENTRY glProgramBinary) (GLuint program, GLenum binaryFormat, const GLvoid* binary, GLsizei length);
358 GL_APICALL void           (* GL_APIENTRY glProgramParameteri) (GLuint program, GLenum pname, GLint value);
359 GL_APICALL void           (* GL_APIENTRY glInvalidateFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum* attachments);
360 GL_APICALL void           (* GL_APIENTRY glInvalidateSubFramebuffer) (GLenum target, GLsizei numAttachments, const GLenum* attachments, GLint x, GLint y, GLsizei width, GLsizei height);
361 GL_APICALL void           (* GL_APIENTRY glTexStorage2D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
362 GL_APICALL void           (* GL_APIENTRY glTexStorage3D) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth);
363 GL_APICALL void           (* GL_APIENTRY glGetInternalformativ) (GLenum target, GLenum internalformat, GLenum pname, GLsizei bufSize, GLint* params);
364 
365 /* EXT_blend_func_extended */
366 GL_APICALL void           (* GL_APIENTRY glBindFragDataLocationIndexedEXT) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name);
367 GL_APICALL void           (* GL_APIENTRY glBindFragDataLocationEXT) (GLuint program, GLuint color, const GLchar *name);
368 GL_APICALL GLint          (* GL_APIENTRY glGetProgramResourceLocationIndexEXT) (GLuint program, GLenum programInterface, const GLchar *name);
369 GL_APICALL GLint          (* GL_APIENTRY glGetFragDataIndexEXT) (GLuint program, const GLchar *name);
370 
371 #ifdef GL_EXT_buffer_storage
372 /* EXT_buffer_storage */
373 GL_APICALL void           (* GL_APIENTRY glBufferStorageEXT) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags);
374 #endif
375 
376 /* OES_copy_image, etc. */
377 GL_APICALL void           (* GL_APIENTRY glCopyImageSubDataOES) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth);
378 
379 #else
380 
381 GLboolean gl3stubInit() {
382 	return GL_TRUE;
383 }
384 
385 #endif // PPSPP_PLATFORM(IOS)
386 
387 #endif // GLES2
388 
389