1/*!****************************************************************************
2
3 @file         OGLES2/PVRTgles2Ext.h
4 @ingroup      API_OGLES2
5 @copyright    Copyright (c) Imagination Technologies Limited.
6 @brief        OpenGL ES 2.0 extensions
7
8******************************************************************************/
9
10#ifndef _PVRTGLES2EXT_H_
11#define _PVRTGLES2EXT_H_
12
13
14/*!
15 @addtogroup   API_OGLES2
16 @{
17*/
18
19#ifdef __APPLE__
20#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE==1
21#import <OpenGLES/ES2/gl.h>
22#import <OpenGLES/ES2/glext.h>
23// No binary shaders are allowed on the iphone and so this value is not defined
24// Defining here allows for a more graceful fail of binary shader loading at runtime
25// which can be recovered from instead of fail at compile time
26#define GL_SGX_BINARY_IMG 0
27#else
28#include <EGL/egl.h>
29#include <GLES2/gl2.h>
30#include <GLES2/gl2ext.h>
31#include <GLES2/gl2extimg.h>
32#endif
33#else
34#if !defined(EGL_NOT_PRESENT)
35#include <EGL/egl.h>
36#endif
37#include <GLES2/gl2.h>
38#include <GLES2/gl2ext.h>
39#include <GLES2/gl2extimg.h>
40#endif
41
42#if defined(TARGET_OS_IPHONE)
43// the extensions supported on the iPhone are treated as core functions of gl
44// so use this macro to assign the function pointers in this class appropriately.
45#define PVRGetProcAddress(x) ::x
46#else
47
48#if defined(EGL_NOT_PRESENT)
49
50#if defined(__PALMPDK__)
51#include "SDL.h"
52
53#define PVRGetProcAddress(x) SDL_GLES_GetProcAddress(#x)
54#else
55#define PVRGetProcAddress(x) NULL
56#endif
57
58#else
59#define PVRGetProcAddress(x) eglGetProcAddress(#x)
60#endif
61
62#endif
63
64/****************************************************************************
65** Build options
66****************************************************************************/
67
68#define GL_PVRTGLESEXT_VERSION 2
69
70/**************************************************************************
71****************************** GL EXTENSIONS ******************************
72**************************************************************************/
73
74/*!************************************************************************
75 @class CPVRTgles2Ext
76 @brief A class for initialising and managing OGLES2 extensions
77**************************************************************************/
78class CPVRTgles2Ext
79{
80
81public:
82    // Type definitions for pointers to functions returned by eglGetProcAddress
83    typedef void (GL_APIENTRY *PFNGLMULTIDRAWELEMENTS) (GLenum mode, GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount); // glvoid
84    typedef void* (GL_APIENTRY *PFNGLMAPBUFFEROES)(GLenum target, GLenum access);
85    typedef GLboolean (GL_APIENTRY *PFNGLUNMAPBUFFEROES)(GLenum target);
86    typedef void (GL_APIENTRY *PFNGLGETBUFFERPOINTERVOES)(GLenum target, GLenum pname, void** params);
87	typedef void (GL_APIENTRY * PFNGLMULTIDRAWARRAYS) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); // glvoid
88	typedef void (GL_APIENTRY * PFNGLDISCARDFRAMEBUFFEREXT)(GLenum target, GLsizei numAttachments, const GLenum *attachments);
89
90	typedef void (GL_APIENTRY *PFNGLGENQUERIESEXT) (GLsizei n, GLuint *ids);
91	typedef void (GL_APIENTRY *PFNGLDELETEQUERIESEXT) (GLsizei n, const GLuint *ids);
92	typedef GLboolean (GL_APIENTRY *PFNGLISQUERYEXT) (GLuint id);
93	typedef void (GL_APIENTRY *PFNGLBEGINQUERYEXT) (GLenum target, GLuint id);
94	typedef void (GL_APIENTRY *PFNGLENDQUERYEXT) (GLenum target);
95	typedef void (GL_APIENTRY *PFNGLGETQUERYIVEXT) (GLenum target, GLenum pname, GLint *params);
96	typedef void (GL_APIENTRY *PFNGLGETQUERYOBJECTUIVEXT) (GLuint id, GLenum pname, GLuint *params);
97
98	typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOES) (GLuint vertexarray);
99	typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOES) (GLsizei n, const GLuint *vertexarrays);
100	typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOES) (GLsizei n, GLuint *vertexarrays);
101	typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOES) (GLuint vertexarray);
102
103	typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMG) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
104	typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMG) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
105
106	typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
107
108	typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
109
110	typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DOES) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid* pixels);
111	typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DOES) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid* pixels);
112	typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOES) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
113	typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOES) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data);
114	typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DOES) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data);
115	typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOES) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
116
117	typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSEXT) (GLsizei n, const GLenum *bufs);
118
119	// GL_EXT_multi_draw_arrays
120	PFNGLMULTIDRAWELEMENTS				glMultiDrawElementsEXT;
121	PFNGLMULTIDRAWARRAYS				glMultiDrawArraysEXT;
122
123	// GL_EXT_multi_draw_arrays
124    PFNGLMAPBUFFEROES                   glMapBufferOES;
125    PFNGLUNMAPBUFFEROES                 glUnmapBufferOES;
126    PFNGLGETBUFFERPOINTERVOES           glGetBufferPointervOES;
127
128	// GL_EXT_discard_framebuffer
129	PFNGLDISCARDFRAMEBUFFEREXT			glDiscardFramebufferEXT;
130
131	// GL_EXT_occlusion_query_boolean
132#if !defined(GL_EXT_occlusion_query_boolean)
133	#define GL_ANY_SAMPLES_PASSED_EXT                               0x8C2F
134	#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT                  0x8D6A
135	#define GL_CURRENT_QUERY_EXT                                    0x8865
136	#define GL_QUERY_RESULT_EXT                                     0x8866
137	#define GL_QUERY_RESULT_AVAILABLE_EXT                           0x886
138#endif
139	PFNGLGENQUERIESEXT                  glGenQueriesEXT;
140	PFNGLDELETEQUERIESEXT               glDeleteQueriesEXT;
141	PFNGLISQUERYEXT                     glIsQueryEXT;
142	PFNGLBEGINQUERYEXT                  glBeginQueryEXT;
143	PFNGLENDQUERYEXT                    glEndQueryEXT;
144	PFNGLGETQUERYIVEXT                  glGetQueryivEXT;
145	PFNGLGETQUERYOBJECTUIVEXT           glGetQueryObjectuivEXT;
146
147	// GL_OES_vertex_array_object
148#if !defined(GL_OES_vertex_array_object)
149	#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5
150#endif
151
152	PFNGLBINDVERTEXARRAYOES glBindVertexArrayOES;
153	PFNGLDELETEVERTEXARRAYSOES glDeleteVertexArraysOES;
154	PFNGLGENVERTEXARRAYSOES glGenVertexArraysOES;
155	PFNGLISVERTEXARRAYOES glIsVertexArrayOES;
156
157	// GL_IMG_multisampled_render_to_texture
158#if !defined(GL_IMG_multisampled_render_to_texture)
159	#define GL_RENDERBUFFER_SAMPLES_IMG                 0x9133
160	#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG   0x9134
161	#define GL_MAX_SAMPLES_IMG                          0x9135
162	#define GL_TEXTURE_SAMPLES_IMG                      0x9136
163#endif
164
165	PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMG glRenderbufferStorageMultisampleIMG;
166	PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMG glFramebufferTexture2DMultisampleIMG;
167
168	// GL_EXT_multisampled_render_to_texture
169#if !defined(GL_ANGLE_framebuffer_multisample)
170	#define GL_RENDERBUFFER_SAMPLES_ANGLE               0x8CAB
171	#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56
172	#define GL_MAX_SAMPLES_ANGLE                        0x8D57
173#endif
174
175	PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC glRenderbufferStorageMultisampleANGLE;
176
177	// GL_NV_framebuffer_blit
178#if !defined(GL_NV_framebuffer_blit)
179	#define GL_READ_FRAMEBUFFER_NV            0x8CA8
180	#define GL_DRAW_FRAMEBUFFER_NV            0x8CA9
181	#define GL_DRAW_FRAMEBUFFER_BINDING_NV    0x8CA6
182	#define GL_READ_FRAMEBUFFER_BINDING_NV    0x8CAA
183#endif
184
185	PFNGLBLITFRAMEBUFFERNVPROC glBlitFramebufferNV;
186
187	// GL_OES_texture_3D
188#if !defined(GL_OES_texture_3D)
189	#define GL_TEXTURE_WRAP_R_OES                                   0x8072
190	#define GL_TEXTURE_3D_OES                                       0x806F
191	#define GL_TEXTURE_BINDING_3D_OES                               0x806A
192	#define GL_MAX_3D_TEXTURE_SIZE_OES                              0x8073
193	#define GL_SAMPLER_3D_OES                                       0x8B5F
194	#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES        0x8CD4
195#endif
196
197	PFNGLTEXIMAGE3DOES glTexImage3DOES;
198	PFNGLTEXSUBIMAGE3DOES glTexSubImage3DOES;
199	PFNGLCOPYTEXSUBIMAGE3DOES glCopyTexSubImage3DOES;
200	PFNGLCOMPRESSEDTEXIMAGE3DOES glCompressedTexImage3DOES;
201	PFNGLCOMPRESSEDTEXSUBIMAGE3DOES glCompressedTexSubImage3DOES;
202	PFNGLFRAMEBUFFERTEXTURE3DOES glFramebufferTexture3DOES;
203
204	// GL_EXT_draw_buffers
205#if !defined(GL_EXT_draw_buffers)
206	#define GL_MAX_COLOR_ATTACHMENTS_EXT                            0x8CDF
207	#define GL_MAX_DRAW_BUFFERS_EXT                                 0x8824
208	#define GL_DRAW_BUFFER0_EXT                                     0x8825
209	#define GL_DRAW_BUFFER1_EXT                                     0x8826
210	#define GL_DRAW_BUFFER2_EXT                                     0x8827
211	#define GL_DRAW_BUFFER3_EXT                                     0x8828
212	#define GL_DRAW_BUFFER4_EXT                                     0x8829
213	#define GL_DRAW_BUFFER5_EXT                                     0x882A
214	#define GL_DRAW_BUFFER6_EXT                                     0x882B
215	#define GL_DRAW_BUFFER7_EXT                                     0x882C
216	#define GL_DRAW_BUFFER8_EXT                                     0x882D
217	#define GL_DRAW_BUFFER9_EXT                                     0x882E
218	#define GL_DRAW_BUFFER10_EXT                                    0x882F
219	#define GL_DRAW_BUFFER11_EXT                                    0x8830
220	#define GL_DRAW_BUFFER12_EXT                                    0x8831
221	#define GL_DRAW_BUFFER13_EXT                                    0x8832
222	#define GL_DRAW_BUFFER14_EXT                                    0x8833
223	#define GL_DRAW_BUFFER15_EXT                                    0x8834
224	#define GL_COLOR_ATTACHMENT0_EXT                                0x8CE0
225	#define GL_COLOR_ATTACHMENT1_EXT                                0x8CE1
226	#define GL_COLOR_ATTACHMENT2_EXT                                0x8CE2
227	#define GL_COLOR_ATTACHMENT3_EXT                                0x8CE3
228	#define GL_COLOR_ATTACHMENT4_EXT                                0x8CE4
229	#define GL_COLOR_ATTACHMENT5_EXT                                0x8CE5
230	#define GL_COLOR_ATTACHMENT6_EXT                                0x8CE6
231	#define GL_COLOR_ATTACHMENT7_EXT                                0x8CE7
232	#define GL_COLOR_ATTACHMENT8_EXT                                0x8CE8
233	#define GL_COLOR_ATTACHMENT9_EXT                                0x8CE9
234	#define GL_COLOR_ATTACHMENT10_EXT                               0x8CEA
235	#define GL_COLOR_ATTACHMENT11_EXT                               0x8CEB
236	#define GL_COLOR_ATTACHMENT12_EXT                               0x8CEC
237	#define GL_COLOR_ATTACHMENT13_EXT                               0x8CED
238	#define GL_COLOR_ATTACHMENT14_EXT                               0x8CEE
239	#define GL_COLOR_ATTACHMENT15_EXT                               0x8CEF
240#endif
241
242	PFNGLDRAWBUFFERSEXT                 glDrawBuffersEXT;
243
244public:
245	/*!***********************************************************************
246	@brief      		Initialises IMG extensions
247	*************************************************************************/
248	void LoadExtensions();
249
250	/*!***********************************************************************
251	@brief		    Queries for support of an extension
252	@param[in]		extension extension to query for
253	@return			True if the extension is supported
254	*************************************************************************/
255	static bool IsGLExtensionSupported(const char * const extension);
256};
257
258/*! @} */
259
260#endif /* _PVRTGLES2EXT_H_ */
261
262/*****************************************************************************
263 End of file (PVRTgles2Ext.h)
264*****************************************************************************/
265
266