/*!****************************************************************************
@file OGLES2/PVRTgles2Ext.h
@ingroup API_OGLES2
@copyright Copyright (c) Imagination Technologies Limited.
@brief OpenGL ES 2.0 extensions
******************************************************************************/
#ifndef _PVRTGLES2EXT_H_
#define _PVRTGLES2EXT_H_
/*!
@addtogroup API_OGLES2
@{
*/
#ifdef __APPLE__
#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE==1
#import <OpenGLES/ES2/gl.h>
#import <OpenGLES/ES2/glext.h>
// No binary shaders are allowed on the iphone and so this value is not defined
// Defining here allows for a more graceful fail of binary shader loading at runtime
// which can be recovered from instead of fail at compile time
#define GL_SGX_BINARY_IMG 0
#else
#include <EGL/egl.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <GLES2/gl2extimg.h>
#endif
#else
#if !defined(EGL_NOT_PRESENT)
#include <EGL/egl.h>
#endif
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <GLES2/gl2extimg.h>
#endif
#if defined(TARGET_OS_IPHONE)
// the extensions supported on the iPhone are treated as core functions of gl
// so use this macro to assign the function pointers in this class appropriately.
#define PVRGetProcAddress(x) ::x
#else
#if defined(EGL_NOT_PRESENT)
#if defined(__PALMPDK__)
#include "SDL.h"
#define PVRGetProcAddress(x) SDL_GLES_GetProcAddress(#x)
#else
#define PVRGetProcAddress(x) NULL
#endif
#else
#define PVRGetProcAddress(x) eglGetProcAddress(#x)
#endif
#endif
/****************************************************************************
** Build options
****************************************************************************/
#define GL_PVRTGLESEXT_VERSION 2
/**************************************************************************
****************************** GL EXTENSIONS ******************************
**************************************************************************/
/*!************************************************************************
@class CPVRTgles2Ext
@brief A class for initialising and managing OGLES2 extensions
**************************************************************************/
class CPVRTgles2Ext
{
public:
// Type definitions for pointers to functions returned by eglGetProcAddress
typedef void (GL_APIENTRY *PFNGLMULTIDRAWELEMENTS) (GLenum mode, GLsizei *count, GLenum type, const GLvoid **indices, GLsizei primcount); // glvoid
typedef void* (GL_APIENTRY *PFNGLMAPBUFFEROES)(GLenum target, GLenum access);
typedef GLboolean (GL_APIENTRY *PFNGLUNMAPBUFFEROES)(GLenum target);
typedef void (GL_APIENTRY *PFNGLGETBUFFERPOINTERVOES)(GLenum target, GLenum pname, void** params);
typedef void (GL_APIENTRY * PFNGLMULTIDRAWARRAYS) (GLenum mode, GLint *first, GLsizei *count, GLsizei primcount); // glvoid
typedef void (GL_APIENTRY * PFNGLDISCARDFRAMEBUFFEREXT)(GLenum target, GLsizei numAttachments, const GLenum *attachments);
typedef void (GL_APIENTRY *PFNGLGENQUERIESEXT) (GLsizei n, GLuint *ids);
typedef void (GL_APIENTRY *PFNGLDELETEQUERIESEXT) (GLsizei n, const GLuint *ids);
typedef GLboolean (GL_APIENTRY *PFNGLISQUERYEXT) (GLuint id);
typedef void (GL_APIENTRY *PFNGLBEGINQUERYEXT) (GLenum target, GLuint id);
typedef void (GL_APIENTRY *PFNGLENDQUERYEXT) (GLenum target);
typedef void (GL_APIENTRY *PFNGLGETQUERYIVEXT) (GLenum target, GLenum pname, GLint *params);
typedef void (GL_APIENTRY *PFNGLGETQUERYOBJECTUIVEXT) (GLuint id, GLenum pname, GLuint *params);
typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOES) (GLuint vertexarray);
typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOES) (GLsizei n, const GLuint *vertexarrays);
typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOES) (GLsizei n, GLuint *vertexarrays);
typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOES) (GLuint vertexarray);
typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMG) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMG) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples);
typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
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);
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);
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);
typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOES) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height);
typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOES) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data);
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);
typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOES) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset);
typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSEXT) (GLsizei n, const GLenum *bufs);
// GL_EXT_multi_draw_arrays
PFNGLMULTIDRAWELEMENTS glMultiDrawElementsEXT;
PFNGLMULTIDRAWARRAYS glMultiDrawArraysEXT;
// GL_EXT_multi_draw_arrays
PFNGLMAPBUFFEROES glMapBufferOES;
PFNGLUNMAPBUFFEROES glUnmapBufferOES;
PFNGLGETBUFFERPOINTERVOES glGetBufferPointervOES;
// GL_EXT_discard_framebuffer
PFNGLDISCARDFRAMEBUFFEREXT glDiscardFramebufferEXT;
// GL_EXT_occlusion_query_boolean
#if !defined(GL_EXT_occlusion_query_boolean)
#define GL_ANY_SAMPLES_PASSED_EXT 0x8C2F
#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A
#define GL_CURRENT_QUERY_EXT 0x8865
#define GL_QUERY_RESULT_EXT 0x8866
#define GL_QUERY_RESULT_AVAILABLE_EXT 0x886
#endif
PFNGLGENQUERIESEXT glGenQueriesEXT;
PFNGLDELETEQUERIESEXT glDeleteQueriesEXT;
PFNGLISQUERYEXT glIsQueryEXT;
PFNGLBEGINQUERYEXT glBeginQueryEXT;
PFNGLENDQUERYEXT glEndQueryEXT;
PFNGLGETQUERYIVEXT glGetQueryivEXT;
PFNGLGETQUERYOBJECTUIVEXT glGetQueryObjectuivEXT;
// GL_OES_vertex_array_object
#if !defined(GL_OES_vertex_array_object)
#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5
#endif
PFNGLBINDVERTEXARRAYOES glBindVertexArrayOES;
PFNGLDELETEVERTEXARRAYSOES glDeleteVertexArraysOES;
PFNGLGENVERTEXARRAYSOES glGenVertexArraysOES;
PFNGLISVERTEXARRAYOES glIsVertexArrayOES;
// GL_IMG_multisampled_render_to_texture
#if !defined(GL_IMG_multisampled_render_to_texture)
#define GL_RENDERBUFFER_SAMPLES_IMG 0x9133
#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134
#define GL_MAX_SAMPLES_IMG 0x9135
#define GL_TEXTURE_SAMPLES_IMG 0x9136
#endif
PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMG glRenderbufferStorageMultisampleIMG;
PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMG glFramebufferTexture2DMultisampleIMG;
// GL_EXT_multisampled_render_to_texture
#if !defined(GL_ANGLE_framebuffer_multisample)
#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB
#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56
#define GL_MAX_SAMPLES_ANGLE 0x8D57
#endif
PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC glRenderbufferStorageMultisampleANGLE;
// GL_NV_framebuffer_blit
#if !defined(GL_NV_framebuffer_blit)
#define GL_READ_FRAMEBUFFER_NV 0x8CA8
#define GL_DRAW_FRAMEBUFFER_NV 0x8CA9
#define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6
#define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA
#endif
PFNGLBLITFRAMEBUFFERNVPROC glBlitFramebufferNV;
// GL_OES_texture_3D
#if !defined(GL_OES_texture_3D)
#define GL_TEXTURE_WRAP_R_OES 0x8072
#define GL_TEXTURE_3D_OES 0x806F
#define GL_TEXTURE_BINDING_3D_OES 0x806A
#define GL_MAX_3D_TEXTURE_SIZE_OES 0x8073
#define GL_SAMPLER_3D_OES 0x8B5F
#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4
#endif
PFNGLTEXIMAGE3DOES glTexImage3DOES;
PFNGLTEXSUBIMAGE3DOES glTexSubImage3DOES;
PFNGLCOPYTEXSUBIMAGE3DOES glCopyTexSubImage3DOES;
PFNGLCOMPRESSEDTEXIMAGE3DOES glCompressedTexImage3DOES;
PFNGLCOMPRESSEDTEXSUBIMAGE3DOES glCompressedTexSubImage3DOES;
PFNGLFRAMEBUFFERTEXTURE3DOES glFramebufferTexture3DOES;
// GL_EXT_draw_buffers
#if !defined(GL_EXT_draw_buffers)
#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF
#define GL_MAX_DRAW_BUFFERS_EXT 0x8824
#define GL_DRAW_BUFFER0_EXT 0x8825
#define GL_DRAW_BUFFER1_EXT 0x8826
#define GL_DRAW_BUFFER2_EXT 0x8827
#define GL_DRAW_BUFFER3_EXT 0x8828
#define GL_DRAW_BUFFER4_EXT 0x8829
#define GL_DRAW_BUFFER5_EXT 0x882A
#define GL_DRAW_BUFFER6_EXT 0x882B
#define GL_DRAW_BUFFER7_EXT 0x882C
#define GL_DRAW_BUFFER8_EXT 0x882D
#define GL_DRAW_BUFFER9_EXT 0x882E
#define GL_DRAW_BUFFER10_EXT 0x882F
#define GL_DRAW_BUFFER11_EXT 0x8830
#define GL_DRAW_BUFFER12_EXT 0x8831
#define GL_DRAW_BUFFER13_EXT 0x8832
#define GL_DRAW_BUFFER14_EXT 0x8833
#define GL_DRAW_BUFFER15_EXT 0x8834
#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0
#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1
#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2
#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3
#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4
#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5
#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6
#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7
#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8
#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9
#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA
#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB
#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC
#define GL_COLOR_ATTACHMENT13_EXT 0x8CED
#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE
#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF
#endif
PFNGLDRAWBUFFERSEXT glDrawBuffersEXT;
public:
/*!***********************************************************************
@brief Initialises IMG extensions
*************************************************************************/
void LoadExtensions();
/*!***********************************************************************
@brief Queries for support of an extension
@param[in] extension extension to query for
@return True if the extension is supported
*************************************************************************/
static bool IsGLExtensionSupported(const char * const extension);
};
/*! @} */
#endif /* _PVRTGLES2EXT_H_ */
/*****************************************************************************
End of file (PVRTgles2Ext.h)
*****************************************************************************/