/******************************************************************************
@File OGLES2/PVRTgles2Ext.cpp
@Title OGLES2/PVRTgles2Ext
@Version
@Copyright Copyright (c) Imagination Technologies Limited.
@Platform Independent
@Description OpenGL ES 2.0 extensions
******************************************************************************/
#include <string.h>
#include "PVRTContext.h"
#include "PVRTgles2Ext.h"
/****************************************************************************
** Local code
****************************************************************************/
/****************************************************************************
** Class: CPVRTgles2Ext
****************************************************************************/
/*!***************************************************************************
@Function LoadExtensions
@Description Initialises IMG extensions
*****************************************************************************/
void CPVRTgles2Ext::LoadExtensions()
{
glMultiDrawElementsEXT = 0;
glMultiDrawArraysEXT = 0;
glMapBufferOES = 0;
glUnmapBufferOES = 0;
glGetBufferPointervOES = 0;
glDiscardFramebufferEXT = 0;
glBindVertexArrayOES = 0;
glDeleteVertexArraysOES = 0;
glGenVertexArraysOES = 0;
glIsVertexArrayOES = 0;
glRenderbufferStorageMultisampleIMG = 0;
glFramebufferTexture2DMultisampleIMG = 0;
glGenQueriesEXT = 0;
glDeleteQueriesEXT = 0;
glIsQueryEXT = 0;
glBeginQueryEXT = 0;
glEndQueryEXT = 0;
glGetQueryivEXT = 0;
glGetQueryObjectuivEXT = 0;
glRenderbufferStorageMultisampleANGLE = 0;
glBlitFramebufferNV = 0;
glTexImage3DOES = 0;
glTexSubImage3DOES = 0;
glCopyTexSubImage3DOES = 0;
glCompressedTexImage3DOES = 0;
glCompressedTexSubImage3DOES = 0;
glFramebufferTexture3DOES = 0;
glDrawBuffersEXT = 0;
// Supported extensions provide new entry points for OpenGL ES 2.0.
const GLubyte *pszGLExtensions;
/* Retrieve GL extension string */
pszGLExtensions = glGetString(GL_EXTENSIONS);
#if !defined(TARGET_OS_IPHONE)
/* GL_EXT_multi_draw_arrays */
if (strstr((char *)pszGLExtensions, "GL_EXT_multi_draw_arrays"))
{
glMultiDrawElementsEXT = (PFNGLMULTIDRAWELEMENTS) PVRGetProcAddress(glMultiDrawElementsEXT);
glMultiDrawArraysEXT = (PFNGLMULTIDRAWARRAYS) PVRGetProcAddress(glMultiDrawArraysEXT);
}
/* GL_EXT_multi_draw_arrays */
if (strstr((char *)pszGLExtensions, "GL_OES_mapbuffer"))
{
glMapBufferOES = (PFNGLMAPBUFFEROES) PVRGetProcAddress(glMapBufferOES);
glUnmapBufferOES = (PFNGLUNMAPBUFFEROES) PVRGetProcAddress(glUnmapBufferOES);
glGetBufferPointervOES = (PFNGLGETBUFFERPOINTERVOES) PVRGetProcAddress(glGetBufferPointervOES);
}
/* GL_OES_vertex_array_object */
if (strstr((char *)pszGLExtensions, "GL_OES_vertex_array_object"))
{
glBindVertexArrayOES = (PFNGLBINDVERTEXARRAYOES) PVRGetProcAddress(glBindVertexArrayOES);
glDeleteVertexArraysOES = (PFNGLDELETEVERTEXARRAYSOES) PVRGetProcAddress(glDeleteVertexArraysOES);
glGenVertexArraysOES = (PFNGLGENVERTEXARRAYSOES) PVRGetProcAddress(glGenVertexArraysOES);
glIsVertexArrayOES = (PFNGLISVERTEXARRAYOES) PVRGetProcAddress(glIsVertexArrayOES);
}
/* GL_IMG_multisampled_render_to_texture */
if (strstr((char *)pszGLExtensions, "GL_IMG_multisampled_render_to_texture"))
{
glRenderbufferStorageMultisampleIMG = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMG) PVRGetProcAddress(glRenderbufferStorageMultisampleIMG);
glFramebufferTexture2DMultisampleIMG = (PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMG) PVRGetProcAddress(glFramebufferTexture2DMultisampleIMG);
}
/* GL_ANGLE_framebuffer_multisample */
if (strstr((char *)pszGLExtensions, "GL_ANGLE_framebuffer_multisample"))
{
glRenderbufferStorageMultisampleANGLE = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC)PVRGetProcAddress(glRenderbufferStorageMultisampleANGLE);
}
/* GL_NV_framebuffer_blit */
if (strstr((char *)pszGLExtensions, "GL_NV_framebuffer_blit"))
{
glBlitFramebufferNV = (PFNGLBLITFRAMEBUFFERNVPROC) PVRGetProcAddress(glBlitFramebufferNV);
}
/* GL_OES_texture_3D */
if(strstr((char *)pszGLExtensions, "GL_OES_texture_3D"))
{
glTexImage3DOES = (PFNGLTEXIMAGE3DOES) PVRGetProcAddress(glTexImage3DOES);
glTexSubImage3DOES = (PFNGLTEXSUBIMAGE3DOES) PVRGetProcAddress(glTexSubImage3DOES);
glCopyTexSubImage3DOES = (PFNGLCOPYTEXSUBIMAGE3DOES) PVRGetProcAddress(glCopyTexSubImage3DOES);
glCompressedTexImage3DOES = (PFNGLCOMPRESSEDTEXIMAGE3DOES) PVRGetProcAddress(glCompressedTexImage3DOES);
glCompressedTexSubImage3DOES = (PFNGLCOMPRESSEDTEXSUBIMAGE3DOES) PVRGetProcAddress(glCompressedTexSubImage3DOES);
glFramebufferTexture3DOES = (PFNGLFRAMEBUFFERTEXTURE3DOES) PVRGetProcAddress(glFramebufferTexture3DOES);
}
/* GL_EXT_draw_buffers */
if (strstr((char *)pszGLExtensions, "GL_EXT_draw_buffers"))
{
glDrawBuffersEXT = (PFNGLDRAWBUFFERSEXT) PVRGetProcAddress(glDrawBuffersEXT);
}
#endif
#if defined(GL_EXT_discard_framebuffer)
/* GL_EXT_discard_framebuffer */
if (strstr((char *)pszGLExtensions, "GL_EXT_discard_framebuffer"))
{
glDiscardFramebufferEXT = (PFNGLDISCARDFRAMEBUFFEREXT) PVRGetProcAddress(glDiscardFramebufferEXT);
}
#endif
/* GL_EXT_occlusion_query_boolean */
if (strstr((char *)pszGLExtensions, "GL_EXT_occlusion_query_boolean"))
{
glGenQueriesEXT = (PFNGLGENQUERIESEXT) PVRGetProcAddress(glGenQueriesEXT);
glDeleteQueriesEXT = (PFNGLDELETEQUERIESEXT) PVRGetProcAddress(glDeleteQueriesEXT);
glIsQueryEXT = (PFNGLISQUERYEXT) PVRGetProcAddress(glIsQueryEXT);
glBeginQueryEXT = (PFNGLBEGINQUERYEXT) PVRGetProcAddress(glBeginQueryEXT);
glEndQueryEXT = (PFNGLENDQUERYEXT) PVRGetProcAddress(glEndQueryEXT);
glGetQueryivEXT = (PFNGLGETQUERYIVEXT) PVRGetProcAddress(glGetQueryivEXT);
glGetQueryObjectuivEXT = (PFNGLGETQUERYOBJECTUIVEXT) PVRGetProcAddress(glGetQueryObjectuivEXT);
}
}
/*!***********************************************************************
@Function IsGLExtensionSupported
@Input extension extension to query for
@Returns True if the extension is supported
@Description Queries for support of an extension
*************************************************************************/
bool CPVRTgles2Ext::IsGLExtensionSupported(const char * const extension)
{
// The recommended technique for querying OpenGL extensions;
// from http://opengl.org/resources/features/OGLextensions/
const GLubyte *extensions = NULL;
const GLubyte *start;
GLubyte *where, *terminator;
/* Extension names should not have spaces. */
where = (GLubyte *) strchr(extension, ' ');
if (where || *extension == '\0')
return 0;
extensions = glGetString(GL_EXTENSIONS);
/* It takes a bit of care to be fool-proof about parsing the
OpenGL extensions string. Don't be fooled by sub-strings, etc. */
start = extensions;
for (;;) {
where = (GLubyte *) strstr((const char *) start, extension);
if (!where)
break;
terminator = where + strlen(extension);
if (where == start || *(where - 1) == ' ')
if (*terminator == ' ' || *terminator == '\0')
return true;
start = terminator;
}
return false;
}
/*****************************************************************************
End of file (PVRTglesExt.cpp)
*****************************************************************************/